1、verilog课程实验报告西安邮电学院verilog课程实验报告 院 系: 电子工程学院 专业班级: 电路1002班 学 号: 05106065 姓 名: 李瑶君 2012 年 10月30日verilog课程实验报告1 实验内容(1) 用Verilog语言写一程序,同时实现全加器和全减器的共能;(2) 用Verilog程序代码在一32位二进制数中,找出第一个1前0的个数。2 实验目的(1) 熟练掌握Verilog的语法知识,学会用Verilog程序进行编程;(2) 熟练ModelSim软件的应用,学会用激励块检验所写的程序的正确性并熟练掌握显示波形的操作。3 实验步骤(1) 全加器全减器程序:
2、 半加器: module Half_adder(a,b,c,s);input a,b;output c,s;assign s=ab;assign c=a&b;endmodule半加器检测程序:module Half_addertest;reg a;reg b;wire c;wire s;Half_adder H1(.a(a), .b(b), .s(s), .c(c); initial begin a=1b0; #10 a=1b1; end initial begin b=1b1; #20 b=1b0; end endmodule 全加器:module Full_adder(a,b,cin,s,
3、c);input a,b,cin;output c,s;wire s0,c0,c1;Half_adder H1(.a(a), .b(b), .s(s0), .c(c0);Half_adder H2(.a(s0), .b(cin), .s(s), .c(c1);or(c,c0,c1);endmodule全加器检测程序:module Full_addertest;reg a;reg b;reg cin;wire c ;wire s;Full_adder F1(.a(a), .b(b), .cin(cin), .c(c), .s(s); initial a=0; always #5 a=a; ini
4、tial b=1; always #5 b=b; initial begin cin=0; #100 cin=1; end endmodule 4位全加全减器module Full_a_d_4(a,b,cin,c,s,con);input 3:0 a,b;input cin,con;output 3:0 s;output c;wire 2:0 n;Full_adder F1(.cin(cin), .a(a0), .b(b0con), .s(s0), .c(n0);Full_adder F2(.cin(n0), .a(a1), .b(b1con), .s(s1), .c(n1);Full_add
5、er F3(.cin(n1), .a(a2), .b(b2con), .s(s2), .c(n2);Full_adder F4(.cin(n2), .a(a3), .b(b3con), .s(s3), .c(c);endmodule 4位全加全减器检测module Full_a_d_4test;reg cin;reg 3:0 a;reg 3:0 b;reg con;wire 3:0 s;wire c;Full_a_d_4 Full(.cin(cin), .a(a), .b(b), .c(c), .s(s), .con(con);initialbegincin=0;#50 cin=1;#50 c
6、in=0;#50 cin=1;endinitiala=4b0000;always#5 a=a+1;initialb=4b0010;always#5 b=b+1;initialbegincon=0;#100 con=1;endendmodule (2)找0011序列:D触发器:module dff(d,clk,rst,q); input d,clk,rst; output reg q; always (posedge clk or negedge rst) if(rst) q=1b0; else q=d;endmodule D触发器检测:module dfftest; reg d, clk, r
7、st; wire q; dff d1(.rst(rst), .clk(clk), .d(d), .q(q); initial begin rst=0; #10 rst=1; end initial clk=0; always #5 clk=clk; initial d=0; always #8 d=d;Endmodule找0011程序:module find0011(d,clk,reset,f); input d,clk,reset; output f; wire n2,n3,q0,q1,q2,q3; dff dff1(.d(d), .q(q0), .clk(clk), .rst(reset)
8、; dff dff2(.d(q0), .q(q1), .clk(clk), .rst(reset); dff dff3(.d(q1), .q(q2), .clk(clk), .rst(reset); dff dff4(.d(q2), .q(q3), .clk(clk), .rst(reset); not(n3,q3); not(n2,q2); and(f,n3,n2,q1,q0);endmodule 找0011检测程序:module find0011test; reg d; reg clk; reg reset; wire f; find0011 f1(.clk(clk), .reset(re
9、set), .f(f), .d(d); initial clk=0; always #1 clk=clk; initial begin reset=0; #10 reset=1; end initial begin d=0; #3 d=0; #3 d=0; #3 d=1; #3 d=0; #3 d=1; #3 d=0; #3 d=0; #3 d=1; #3 d=1; #3 d=0; #3 d=1; endendmodule (3)找1前的0的个数:module counter0; reg 31:0 x; integer i; reg continue; initial begin x=32d1
10、6; i=0; continue=1; while(i32)&continue) begin if(xi) begin $display(encounter a 1 bit at element number %d,i); continue=0; end i=i+1; end end endmodule其结果显示:4 实验中遇到的问题及解决方法(1) 由于初次接触ModelSim软件,一些操作相当生疏,在实验室跟同学一块学了几天,才能够基本上掌握其操作,并用该软件完成相应的功能。(2) Verilog语法掌握的不够,以致在写程序时总是犯一些很低级的错误,比如将initial跟always嵌套使用、initial下给两个量赋值时,总是忘了begin-end的使用等。通过不断的学习及上机练习,现在已基本上可以编写一定的程序。5 心得体会Verilog是一门实践性很强的课程,我们所掌握的书本的知识若不经过上机练习是远远不够的,比如”;”是否添加,单纯的从书上我们无法知道漏掉一个分号程序是调不通的;还有延时具体体现,以及在什么情况下会输出高阻和未知数等。在这么一个实践性如此强的社会中我们必须学会将知识运用到生活中,所以,注重实践是很重要的。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1