一直在做图像处理,贴一段用verilog直接读取bmp文件的代码。
原理很简单,bmp图像存的是非压缩图片。
文件大概分为4个段:文件头、位图信息,调色板、位图数据。
对于verilog来说,我们是要用图像数据,也就是这里的位图数据。所以,需要处理的不多。
首先,位图信息的偏移量是固定的,先在位图信息里找到IMG_DATA_PRT、IMG_WIDTH_PRT、IMG_HEIGHT_PRT三者,
前者是位图数据存放的位置,后两者是图像大小的数据。接下来,就从IMG_DATA_PRT中存放的指针确定好位图数据位置开始搬数吧,这里有一个小细节,bmp存放图像数据的原点我记得似乎是在左下下,和直观上认为的左上不一样,如果后续造时序时,需要和直观感觉对的上,请注意取数时把图像翻转一下。
//bmp read
`define SEEK_SET (0 )
`define SEEK_CUR (1 )
`define SEEK_END (2 )
`define IMG_DATA_PRT ('ha )//位图数据指针存放的位置
`define IMG_WIDTH_PRT ('h12)//图像宽度信息的存放位置
`define IMG_HEIGHT_PRT ('h16)//图像高度信息的存放位置
reg [29:0] mem_data [0:33264000];//最终读取的图像数据
reg mem_data_ready=0;
reg [31:0]img_data_offset;
reg [31:0]img_width;
reg [31:0]img_height;
integer fp_r;
integer ii=0;
integer j=0;
initial
begin
#10;//this time need for v_resolution h_resolution be ready
//$display("imread_start");
//$stop;
fp_r=$fopen(FILE_NAME,"rb");
if(fp_r==0)
begin
$display ("%s is not valid",FILE_NAME);
$stop;
end
if($fseek(fp_r,`IMG_DATA_PRT,`SEEK_SET)==-1) $stop;//$display("ERROR");
if($fscanf(fp_r,"%c%c%c%c",img_data_offset[ 7: 0],
img_data_offset[15: 8],
img_data_offset[23:16],
img_data_offset[31:24])==-1) $stop;//$display("ERROR");
//$display("img_data_offset:%d",img_data_offset);
if($fseek(fp_r,`IMG_WIDTH_PRT,`SEEK_SET)==-1) $stop;//$display("ERROR");
if($fscanf(fp_r,"%c%c%c%c",img_width[ 7: 0],
img_width[15: 8],
img_width[23:16],
img_width[31:24])==-1) $stop;//$display("ERROR");
//$display("img_width:%d",img_width);
if($fseek(fp_r,`IMG_HEIGHT_PRT,`SEEK_SET)==-1) $stop;//$display("ERROR");
if($fscanf(fp_r,"%c%c%c%c",img_height[ 7: 0],
img_height[15: 8],
img_height[23:16],
img_height[31:24])==-1) $stop;//$display("ERROR");
//$display("img_height:%d",img_height);
if($fseek(fp_r,img_data_offset,`SEEK_SET)==-1) $stop;//$display("ERROR");
//$display("v_resolution:%d",v_resolution);
//$display("h_resolution:%d",h_resolution);
for(ii=0;ii<v_resolution;ii=ii+1)begin
for(j=0;j<h_resolution;j=j+1)begin
if($fseek(fp_r,(img_data_offset+(img_height-1-ii)*img_width*3+j*3),`SEEK_SET)==-1) $stop;//$display("ERROR");
if($fscanf(fp_r,"%c%c%c",mem_data[ii*img_width+j][9:2],mem_data[ii*img_width+j][19:12],mem_data[ii*img_width+j][29:22])==-1) $stop;//$display("ERROR");
mem_data[ii*img_width+j][ 1: 0]=0;
mem_data[ii*img_width+j][11:10]=0;
mem_data[ii*img_width+j][21:20]=0;
//$display("%h",mem_data[ii*img_width+j]);
end
end
$fclose(fp_r);
mem_data_ready=1;
end

寒泊
- 粉丝: 104
最新资源
- 国家网络安全宣传周活动心得.doc
- 数据结构与算法(5)ppt课件.ppt
- 电子商务的求职信范文.doc
- 最新国家开放大学电大《文学英语赏析》网络核心课形考网考作业及答案.pdf
- 锅炉过热气温控制MATLAB及控制系统仿真.doc
- 网络系统集成概述.docx
- 从技术专家到领导者:管理转型指南
- 软件项目验收报告模板.doc
- 游戏开发团队建设培养.pptx
- 医学科研数据挖掘概述.ppt
- 销售项目管理LTC.ppt
- 有关计算机求职信三篇.docx
- 武汉大学网络营销()网络营销产品层次.pptx
- 中职-计算机基础教学工作总结.docx
- 无线网络勘察技术.ppt
- 电子商务项目成本效益分析方法研究.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



评论0