在目录Microsoft Visual Studio\\MyProjects\\***下放置.lena.bmp图形,执行第一段C++,结束后在目录Microsoft Visual Studio\\MyProjects\\***会生成一个header.dat,一个body.txt,将body.txt复制粘贴到modelsim\\examples目录下,执行verilog电路程序进行仿真,在modelsim\\examples下会生成new_body.txt文档,将此文档复制粘贴回C++目录下\\Microsoft Visual Studio\\MyProjects\\***执行最后的C++程序,即可生成一个rotated_lena.bmp这就是最后的结果。
第一段C++
#include #include using namespace std; void char2bin(char chR,ofstream& output){ // 实现将char的二进制ASCII码写入.txt中 char temp; temp=(chR&0x80)?'1':'0' ; output.put(temp); temp=(chR&0x40)?'1':'0'; output.put(temp); temp=(chR&0x20)?'1':'0'; output.put(temp); temp=(chR&0x10)?'1':'0'; output.put(temp); temp=(chR&0x08)?'1':'0'; output.put(temp); temp=(chR&0x04)?'1':'0'; output.put(temp); temp=(chR&0x02)?'1':'0'; output.put(temp); temp=(chR&0x01)?'1':'0'; output.put(temp); } 此方法过于繁琐, http://wenku.baidu.com/view/66bad3f24693daef5ef73d14.html比此方法更好。建议直接用网站上的方法。 void bmpread(char *ini_filename,char *head_name,char *body_name){ char header[54]; char chR,chG,chB; ifstream bmpin; ofstream bmpout; int x=0,y=0,i=0,t=0; bmpin.open(ini_filename,ios::in|ios::binary); bmpout.open(head_name,ios::out|ios::binary); for (i=0;i<54;i++){ header[i]=bmpin.get(); bmpout.put(header[i]); } bmpin.close(); bmpout.close(); //head_name中 bmpin.open(ini_filename,ios::in|ios::binary); bmpout.open(body_name,ios::out); bmpin.seekg(54,ios::beg); for (i=0;i<256*256;i++){ 将.bmp的文件头写入 bmpin.get(chR).get(chG).get(chB); char2bin(chR,bmpout); char2bin(chG,bmpout); char2bin(chB,bmpout); bmpout.put('\\n'); } } //body_name中 void main(){ bmpread(\"lena.bmp\ }//调用函数实现功能 Verilog 电路程序及仿真程序: module imageturn(bmpin,rst,clk,bmpout,finish); //将.bmp图像像素数据写入实现反转的电路 input clk; input rst; input [23:0] bmpin; output [23:0] bmpout; output finish; reg [23:0] bmpout; reg [23:0] ram [0:65535]; reg [7:0] list; reg [15:0] row; reg [15:0] ram_num; reg finish; always @(posedge clk) begin if(rst) begin row<=16'b0000_0001_0000_0000; list<=8'b0000_0000; finish<=1'b0; end else if (~finish) begin row=row-1; ram_num=(row<<8)+list; ram[ram_num]=bmpin; if(row==16'b0000_0000_0000_0000&&list==8'b11111111) begin finish=1'b1; ram_num=16'b1111_1111_1111_1111; end if(row==16'b0000_0000_0000_0000) begin row=16'b00000001_00000000; list=list+1; end end else begin bmpout=ram[ram_num]; ram_num=ram_num-1'b1; end end endmodule `timescale 1ns/100ps //module test(); 实现测试的模块 wire finish; wire [23:0] outp; reg rst; reg clk; reg[23:0] mem[65535:0]; reg[23:0] inp; integer i; integer j; integer k; integer file; imageturn m(inp,rst,clk,outp,finish); initial begin $readmemb(\"body.txt\ i=65536; j=0; #1 rst=1'b1; #1 clk=1'b1; #10 rst=1'b0; file=$fopen(\"new_body.txt\"); end always #5 clk=~clk; always @(negedge clk) begin if(~finish) begin inp=mem[i]; #1 i=i-1; end else begin #8 for (k=23;k>=0;k=k-1) $fwrite(file,outp[k]); j=j+1; end if(j==65538) $finish(); end endmodule 此verilog程序实现数据的旋转,存入最后的afterturn.txt文档中。 第二段C++ #include #include using namespace std; void bin2char(char ch[],ofstream& output){ //实现将.txt中显示的数据写入.bmp中 char temp=0; temp=(ch[0]-0x30)?(temp+128):temp; temp=(ch[1]-0x30)?(temp+64):temp; temp=(ch[2]-0x30)?(temp+32):temp; temp=(ch[3]-0x30)?(temp+16):temp; temp=(ch[4]-0x30)?(temp+8):temp; temp=(ch[5]-0x30)?(temp+4):temp; temp=(ch[6]-0x30)?(temp+2):temp; temp=(ch[7]-0x30)?(temp+1):temp; output.put(temp); }同样繁琐; void bmpwrite(char* new_filename,char* head_name,char* body_name){ char s; char ch[8]; int i=0,j=0; ifstream bmpin; ofstream bmpout; bmpin.open(head_name,ios::in|ios::binary); bmpout.open(new_filename,ios::out|ios::binary); for(i=0;i<54;i++){ s=bmpin.get(); bmpout.put(s); } bmpin.close(); bmpin.open(body_name,ios::in|ios::binary); for(i=0;i<256*256*3;i++){ for(j=0;j<8;j++) ch[j]=bmpin.get(); bin2char(ch,bmpout); } bmpout.close(); } //将body_name文件和head_name文件回.bmp文件中 void main(){ bmpwrite(\"rotated_lena.bmp\.dat”,”new_body.txt”); } 因篇幅问题不能全部显示,请点此查看更多更全内容