您的当前位置:首页正文

verilog期末大作业

2024-02-21 来源:钮旅网
Verilog期末大作业

在目录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”);

}

因篇幅问题不能全部显示,请点此查看更多更全内容