在没有开发板的情况下,要使用Verilog做图像处理,就只能仿真了。
这时需要一个激励,让Verilog读取到图片,这里就提供一个例子去读取bmp图片。
`timescale 1ns / 1nsmodule bmp_tb;integer iBmpFileId,iOutFileId,iIndex=0,iCode;
reg [7:0] rBmpData [0:200000];
reg rClk;
reg [7:0] rData;
integer iBmpWidth,iBmpHight,iDataStartIndex,iBmpSize;initial beginiBmpFileId = $fopen("G:\\WorkDir\\ProQuestaSim\\bmp_sim\\src\\cat.bmp","rb");iOutFileId = $fopen("G:\\WorkDir\\ProQuestaSim\\bmp_sim\\src\\output_file.txt","w+");iCode = $fread(rBmpData,iBmpFileId);iBmpWidth = {rBmpData[21],rBmpData[20],rBmpData[19],rBmpData[18]};iBmpHight = {rBmpData[25],rBmpData[24],rBmpData[23],rBmpData[22]};iDataStartIndex = {rBmpData[13],rBmpData[12],rBmpData[11],rBmpData[10]};iBmpSize = {rBmpData[5],rBmpData[4],rBmpData[3],rBmpData[2]};$fclose(iBmpFileId);$fwrite(iOutFileId,"%p",rBmpData);$fclose(iOutFileId);
endinitial beginforever beginrClk=1;#10 rClk = 0;#10;end // forever
end // initialalways&#64;(posedge rClk) beginrData<&#61;rBmpData[iIndex];iIndex<&#61;iIndex&#43;1;
endendmodule
注意&#xff1a;其中iBmpFileId和iOutFileId的路径&#xff0c;需要根据你的文件路径而修改。
经过仿真&#xff0c;可以看出Verilog可以读取到bmp图片的信息&#xff0c;从而得到图片的宽、高。
若要输出.bmp图片&#xff0c;可以使用以下代码。
&#96;timescale 1ns / 1nsmodule bmp_tb;integer iBmpFileId,iOutFileId,iIndex&#61;0,iCode;
reg [7:0] rBmpData [0:200000];
reg [31:0] rBmpCom;
reg rClk;
reg [7:0] rData;
integer iBmpWidth,iBmpHight,iDataStartIndex,iBmpSize;initial beginiBmpFileId &#61; $fopen("G:\\WorkDir\\ProQuestaSim\\bmp_sim\\src\\cat.bmp","rb");iOutFileId &#61; $fopen("G:\\WorkDir\\ProQuestaSim\\bmp_sim\\src\\output_file.bmp","w&#43;");iCode &#61; $fread(rBmpData,iBmpFileId);iBmpWidth &#61; {rBmpData[21],rBmpData[20],rBmpData[19],rBmpData[18]};iBmpHight &#61; {rBmpData[25],rBmpData[24],rBmpData[23],rBmpData[22]};iDataStartIndex &#61; {rBmpData[13],rBmpData[12],rBmpData[11],rBmpData[10]};iBmpSize &#61; {rBmpData[5],rBmpData[4],rBmpData[3],rBmpData[2]};$fclose(iBmpFileId);for (iIndex &#61; 0; iIndex endendmodule
使用的图片&#xff0c;如下图所示&#xff0c;请保存为.bmp格式。
其中输出的.bmp图片中&#xff0c;多了一个字节&#xff08;0A前面多了0D&#xff09;&#xff0c;会显示如下图所示。
解决办法是使用二进制方法打开文件&#xff0c;即wb&#43;&#xff0c;代码如下&#xff1a;
&#96;timescale 1ns / 1nsmodule bmp_tb;integer iBmpFileId,iOutFileId,iIndex&#61;0,iCode;
reg [7:0] rBmpData [0:200000];
reg [31:0] rBmpCom;
reg rClk;
reg [7:0] rData;
integer iBmpWidth,iBmpHight,iDataStartIndex,iBmpSize;initial beginiBmpFileId &#61; $fopen("G:\\WorkDir\\ProQuestaSim\\bmp_sim\\src\\cat.bmp","rb&#43;");iOutFileId &#61; $fopen("G:\\WorkDir\\ProQuestaSim\\bmp_sim\\src\\output_file.bmp","wb&#43;");iCode &#61; $fread(rBmpData,iBmpFileId);iBmpWidth &#61; {rBmpData[21],rBmpData[20],rBmpData[19],rBmpData[18]};iBmpHight &#61; {rBmpData[25],rBmpData[24],rBmpData[23],rBmpData[22]};iDataStartIndex &#61; {rBmpData[13],rBmpData[12],rBmpData[11],rBmpData[10]};iBmpSize &#61; {rBmpData[5],rBmpData[4],rBmpData[3],rBmpData[2]};$fclose(iBmpFileId);for (iIndex &#61; 0; iIndex endendmodule
利用这一方法&#xff0c;可以输出直方图、时域图、频域图等&#xff0c;如&#xff1a;使用可综合语句完成FFT的功能&#xff0c;再使用tb让其输出频域图。