HDL实验报告专业电子科学与技术姓名学号指导老师1 实验一Modelsim仿真软件的使用1.1 实验目的(1)熟悉Modelsim 软件;(2)掌握Modelsim 软件的编译、仿真方法;(3)熟练运用Modelsim 软件进行HDL 程序设计开发。
1.2 实验步骤(1)学习使用Modelsim软件;(2)分析原理及功能;(3)用Verilog HDL编写程序;(4)编写测试程序进行仿真;(4)观察波形,分析仿真结果是否正确。
1.3 实验内容用Verilog HDL 程序实现一个异或门,Modelsim 仿真,观察效果。
1.4.1 程序module my_xor(ina,inb,out);input ina,inb;output out;assign out=ina^inb;endmodulemodule t_xor;reg ina,inb;wire out;initialbeginina=1'b0;forever #20 ina=~ina;endinitialbegininb=1'b0;forever #10 inb=~inb;endmy_xor tt(.ina(ina),.inb(inb),.out(out));endmodule2 实验二简单组合电路设计2.1 实验目的(1)掌握基于Modelsim 的数字电路设计方法;(2)熟练掌握HDL 程序的不同实现方法2.2 实验步骤(1)分析原理及功能;(2)根据原理用Verilog HDL编写程序;(3)编写测试程序进行仿真;(4)观察波形,分析仿真结果是否正确。
2.3 实验内容设计一个三人表决器(高电平表示通过) ,实验内容如下:(1)三个人,一个主裁判,两个副裁判;(2)规则:只要主裁判同意,输出结果为通过;否则,按少数服从多数原则决定是否通过。
使用Verilog HDL 程序实现上述实验内容,并使用modelsim 仿真(要求:至少使用两种方法实现上述实验内容和testbench)。
2.4.1 程序方法1:module voter(v0,v1,v2,y);input v0,v1,v2;output y;assign y=v0|(v1&v2);endmodule方法2:module voter(v0,v1,v2,y);input v0,v1,v2;output reg y;always @(v0,v1,v2)beginif(v0)y=1;beginif(v1&v2)y=1;elsey=0;endendendmodulemodule t_voter;reg v0,v1,v2;wire y;initialbeginv0=1'b0; v1=1'b0; v2=1'b0;#10 v2=1'b1;#10 v1=1'b1; v2=1'b0;#10 v1=1'b1; v2=1'b1;#10 v0=1'b1; v1=1'b0; v2=1'b0;#10 v2=1'b1;#10 v1=1'b1; v2=1'b0;#10 v1=1'b1; v2=1'b1;#10 $finish;endvoter tt(.v0(v0),.v1(v1),.v2(v2),.y(y));endmodule2.4.2 波形2.5 心得体会同样的功能可以通过不同的方法来实现,可以根据情况灵活选择。
3 实验三二进制全加器设计3.1 实验目的(1)熟悉Verilog HDL 元件例化语句的作用;(2)熟悉全加器的工作原理;(3)用Verilog HDL 语言设计四位二进制全加器,并仿真,下载验证其功能。
3.2 实验原理(1)一位全加器原理:Ai ,Bi分别是两个二进制位,Ci-1是前级进位,Ci是进位,Si是加法结果。
Si=Ai^Bi^Ci-1 ;Ci=(Ai&Bi)|(Ai&Ci-1)|(Bi&Ci-1)(2)四位二进制全加器原理:在一位全加器基础上设计多位全加器,利用进位进行级联。
3.3 实验步骤(1)分析原理及功能;(2)根据原理用Verilog HDL编写程序;(3)编写测试程序进行仿真;(4)观察波形,分析仿真结果是否正确。
3.4 实验内容(1)用Verilog HDL 语言描述一位全加器,并使用modelsim 仿真验证结果;(2)用Verilog HDL 元件例化语句实现四位全加器,modelsim 仿真并下载到实验箱,用按键模拟输入,led 灯模拟输出,验证结果;(3)设计程序将加法结果分开输出,即十位数和个位数分别用四位数组表示。
3.4.1 一位全加器3.4.1.1 程序module add_1bit(a,b,ci,co,s);input a,b,ci;output co,s;assign s=a^b^ci,co=(a&b)|(a&ci)|(b&ci);endmodulemodule t_add1;reg a,b,ci;wire co,s;initialbegina=1'b0;forever #1 a=~a;endinitialbeginb=1'b0;forever #2 b=~b;endinitialbeginci=1'b0;forever #4 ci=~ci;endadd_1bit tt(.a(a),.b(b),.ci(ci),.co(co),.s(s)); endmodule3.4.1.2 波形3.4.2 四位全加器3.4.2.1 程序module add_1bit(a,b,ci,co,s);input a,b,ci;output co,s;assign s=a^b^ci,co=(a&b)|(a&ci)|(b&ci); endmodulemodule add_4bit(a,b,ci,co,s);input[3:0] a,b;input ci;output[3:0] s;output co;wire[2:0] temp;add_1bit add0(a[0],b[0],ci,temp[0],s[0]);add_1bit add1(a[1],b[1],temp[0],temp[1],s[1]); add_1bit add2(a[2],b[2],temp[1],temp[2],s[2]); add_1bit add3(a[3],b[3],temp[2],co,s[3]); endmodule3.4.2.2 波形3.4.3 结果分成十位数和个位数的全加器3.4.3.1 程序module add_4bit_2(a,b,ci,out1,out2);input [3:0] a,b;input ci;output [3:0] out1,out2;reg [3:0] out1,out2;wire co;wire [3:0] s;add_4bit add4(a,b,ci,co,s);always@(s)beginif(co==0)beginif(s<=4'b1001)beginout2=s;out1=4'b0000;endelse if(s>4'b1001)beginout2=s-4'b1010;out1=4'b0001;endendelsebeginif(s<=4'b0011)beginout1=4'b0001;out2=s+4'b0110;endelse if(s<=4'b1101)beginout1=4'b0010;out2=s-4'b0100;endelsebeginout1=4'b0011;out2=s-4'b1110;endendendendmodulemodule t_add4;reg[3:0] a,b;reg ci;wire[3:0] out1,out2;initialbegina=4'b0;forever #1 a=a+4'b1;endinitialbeginb=4'b0;forever #16 b=b+4'b1;endinitialbeginci=4'b0;forever #256 ci=ci+4'b1;endadd_4bit_2 tt(.a(a),.b(b),.ci(ci),.out1(out1),.out2(out2)); endmodule3.4.3.2 波形3.5 思考题在仿真时,输出结果会有毛刺,采用什么方法可以消除毛刺?答:(1)利用D触发器可以消除毛刺;(2)增加乘积项以避免互补项相加;(3)输出端并联电容器。
4 实验四二进制计数器设计4.1 实验目的(1)熟悉Verilog HDL 时序电路的设计方法;(2)了解清零和使能的概念,以及同步清零和异步清零的区别;(3)用Verilog HDL 语言设计二进制计数器,并仿真。
4.2 实验步骤(1)分析原理及功能;(2)根据原理用V erilog HDL编写程序;(3)编写测试程序进行仿真;(4)观察波形,分析仿真结果是否正确。
4.3 实验内容4.3.1 编程实现十进制计数器,含同异步清零端和进位输出端4.3.1.1 程序module counter(clk,count,rst,c);input clk,rst;output reg[3:0] count;output reg c;always @(posedge clk)if(!rst)beginc<=1'b0;count<=4'b0;endelsebeginif(count==4'b1001)begincount<=4'b0;c<=1'b1;endelsebegincount<=count+4'b0001;c<=1'b0;endendendmodulemodule t_counter;reg clk,rst;wire[3:0]count;wire c;initialbeginclk=0;forever #10 clk=~clk;endinitialbeginrst=1;#5 rst=0;#10 rst=1;#40 rst=0;#10 rst=1;$finish;endcounter test(.clk(clk),.count(count),.rst(rst),.c(c));endmodule4.3.1.2 波形4.3.2 增加预置功能(增加五位输入引脚),实现任意的五位二进制数的计数器4.3.2.1 程序module jishuqi_10_W(ina,rst,EA,out);input rst,EA;input [4:0] ina;output [4:0] out;reg [4:0] cout,out;always @ (ina or negedge rst)beginif(!rst)begincout <= 5'h0;endelse if(cout === ina)begincout <= 5'h0;endelsebeginif(EA == 1)cout <= cout + 5'h1;elseout = cout;endendendmodulemodule test_jishuqi_10_W;reg Rst_n,EA;reg [4:0] ina;wire [4:0] out;parameter FAST_PERIOD = 50;initialbeginina = 5'h0;forever#(100*FAST_PERIOD) ina = ina + 1;endinitialbeginRst_n = 1;#100 Rst_n = ~Rst_n ;#200 Rst_n = ~Rst_n ;endinitialbeginEA=1;foreverbegin#600 EA=0;#200 EA=1;endendjishuqi_10_W test1(.ina(ina),.rst(Rst_n),.EA(EA),.out(out)); endmodule4.4.3.2 波形5 实验五基本IO5.1 实验目的(1)学习QuartusⅡ 5.0 的基本操作;(2)熟悉教学实验板的使用;(3)初步掌握V erilog语言的设计输入,编译,仿真和调试过程。