verilog课程实验报告.docx
《verilog课程实验报告.docx》由会员分享,可在线阅读,更多相关《verilog课程实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
![verilog课程实验报告.docx](https://file1.bdocx.com/fileroot1/2022-11/23/d51e4d0c-1baa-4e2c-a81e-9d81dde3b4fd/d51e4d0c-1baa-4e2c-a81e-9d81dde3b4fd1.gif)
verilog课程实验报告
西安邮电学院
verilog课程实验报告
院系:
电子工程学院
专业班级:
电路1002班
学号:
05106065
姓名:
李瑶君
2012年10月30日
verilog课程实验报告
1.实验内容
(1)用Verilog语言写一程序,同时实现全加器和全减器的共能;
(2)用Verilog程序代码在一32位二进制数中,找出第一个1前0的个数。
2.实验目的
(1)熟练掌握Verilog的语法知识,学会用Verilog程序进行编程;
(2)熟练ModelSim软件的应用,学会用激励块检验所写的程序的正确性并熟练掌握显示波形的操作。
3.实验步骤
(1)全加器全减器程序:
半加器:
moduleHalf_adder(a,b,c,s);
inputa,b;
outputc,s;
assigns=a^b;
assignc=a&b;
endmodule
半加器检测程序:
moduleHalf_addertest;
rega;
regb;
wirec;
wires;
Half_adderH1(.a(a),
.b(b),
.s(s),
.c(c));
initial
begin
a=1'b0;
#10a=1'b1;
end
initial
begin
b=1'b1;
#20b=1'b0;
end
endmodule
全加器:
moduleFull_adder(a,b,cin,s,c);
inputa,b,cin;
outputc,s;
wires0,c0,c1;
Half_adderH1(.a(a),
.b(b),
.s(s0),
.c(c0));
Half_adderH2(.a(s0),
.b(cin),
.s(s),
.c(c1));
or(c,c0,c1);
endmodule
全加器检测程序:
moduleFull_addertest;
rega;
regb;
regcin;
wirec;
wires;
Full_adderF1(.a(a),
.b(b),
.cin(cin),
.c(c),
.s(s));
initial
a=0;
always
#5a=~a;
initial
b=1;
always
#5b=~b;
initial
begin
cin=0;
#100cin=1;
end
endmodule
4位全加全减器
moduleFull_a_d_4(a,b,cin,c,s,con);
input[3:
0]a,b;
inputcin,con;
output[3:
0]s;
outputc;
wire[2:
0]n;
Full_adderF1(.cin(cin),
.a(a[0]),
.b(b[0]^con),
.s(s[0]),
.c(n[0]));
Full_adderF2(.cin(n[0]),
.a(a[1]),
.b(b[1]^con),
.s(s[1]),
.c(n[1]));
Full_adderF3(.cin(n[1]),
.a(a[2]),
.b(b[2]^con),
.s(s[2]),
.c(n[2]));
Full_adderF4(.cin(n[2]),
.a(a[3]),
.b(b[3]^con),
.s(s[3]),
.c(c));
endmodule
4位全加全减器检测
moduleFull_a_d_4test;
regcin;
reg[3:
0]a;
reg[3:
0]b;
regcon;
wire[3:
0]s;
wirec;
Full_a_d_4Full(.cin(cin),
.a(a),
.b(b),
.c(c),
.s(s),
.con(con));
initial
begin
cin=0;
#50cin=1;
#50cin=0;
#50cin=1;
end
initial
a=4'b0000;
always
#5a=a+1;
initial
b=4'b0010;
always
#5b=b+1;
initial
begin
con=0;
#100con=1;
end
endmodule
(2)找0011序列:
D触发器:
moduledff(d,clk,rst,q);
inputd,clk,rst;
outputregq;
always@(posedgeclkornegedgerst)
if(~rst)
q<=1'b0;
else
q<=d;
endmodule
D触发器检测:
moduledfftest;
regd,
clk,
rst;
wireq;
dffd1(.rst(rst),
.clk(clk),
.d(d),
.q(q));
initial
begin
rst=0;
#10rst=1;
end
initial
clk=0;
always
#5clk=~clk;
initial
d=0;
always
#8d=~d;
Endmodule
找0011程序:
modulefind0011(d,clk,reset,f);
inputd,clk,reset;
outputf;
wiren2,n3,q0,q1,q2,q3;
dffdff1(.d(d),
.q(q0),
.clk(clk),
.rst(reset));
dffdff2(.d(q0),
.q(q1),
.clk(clk),
.rst(reset));
dffdff3(.d(q1),
.q(q2),
.clk(clk),
.rst(reset));
dffdff4(.d(q2),
.q(q3),
.clk(clk),
.rst(reset));
not(n3,q3);
not(n2,q2);
and(f,n3,n2,q1,q0);
endmodule
找0011检测程序:
modulefind0011test;
regd;
regclk;
regreset;
wiref;
find0011f1(.clk(clk),
.reset(reset),
.f(f),
.d(d));
initial
clk=0;
always
#1clk=~clk;
initial
begin
reset=0;
#10reset=1;
end
initial
begin
d=0;
#3d=0;
#3d=0;
#3d=1;
#3d=0;
#3d=1;
#3d=0;
#3d=0;
#3d=1;
#3d=1;
#3d=0;
#3d=1;
end
endmodule
(3)找1前的0的个数:
modulecounter0;
reg[31:
0]x;
integeri;
regcontinue;
initial
begin
x=32'd16;
i=0;
continue=1;
while((i<32)&continue)
begin
if(x[i])
begin
$display("encountera1bitatelementnumber%d",i);
continue=0;
end
i=i+1;
end
end
endmodule
其结果显示:
4.实验中遇到的问题及解决方法
(1)由于初次接触ModelSim软件,一些操作相当生疏,在实验室跟同学一块学了几天,才能够基本上掌握其操作,并用该软件完成相应的功能。
(2)Verilog语法掌握的不够,以致在写程序时总是犯一些很低级的错误,比如将initial跟always嵌套使用、initial下给两个量赋值时,总是忘了begin-end的使用等。
通过不断的学习及上机练习,现在已基本上可以编写一定的程序。
5.心得体会
Verilog是一门实践性很强的课程,我们所掌握的书本的知识若不经过上机练习是远远不够的,比如”;”是否添加,单纯的从书上我们无法知道漏掉一个分号程序是调不通的;还有延时具体体现,以及在什么情况下会输出高阻和未知数等。
在这么一个实践性如此强的社会中我们必须学会将知识运用到生活中,所以,注重实践是很重要的。