北京航空航天大学电子电路设计数字部分实验报告实验一简单组合逻辑设计...........................................................................................................2实验二简单分频时序逻辑电路的设计.......................................................................................3一.实验目的:1.掌握最基本组合逻辑电路的实现方法。.....................................................32.学习时序电路测试模块的编写。.............................................................................................33.学习综合和不同层次的仿真。.................................................................................................3实验三利用条件语句实现计数分频时序电路...........................................................................5实验四阻塞赋值与非阻塞赋值的区别.......................................................................................7实验五用always块实现较复杂的组合逻辑:........................................................................10实验六在VerilogHDL中使用函数.........................................................................................12实验七在VerilogHDL中使用任务(task).................................................................................14实验八利用有限状态机进行时序逻辑的设计.........................................................................17实验九楼梯灯.............................................................................................................................19实验思考与总结.............................................................................................................................29学院:学号:姓名:实验一简单组合逻辑设计一.实验目的:1.掌握基本组合逻辑电路的实现方法。2.初步了解两种基本组合逻辑电路的生成方法。3.学习测试模块的编写。4.通过综合和布局布线了解不同层次仿真的物理意义。二.实验设备:安装Modelsim-6.5c的PC机。三.实验内容:描述一个可综合的数据比较器,比较数据a、b的大小,若相同,则给出结果1,否则给出结果0四.综合仿真结果实验二简单分频时序逻辑电路的设计一.实验目的:1.掌握最基本组合逻辑电路的实现方法。2.学习时序电路测试模块的编写。3.学习综合和不同层次的仿真。二.实验设备:安装Modelsim-6.5c的PC机。三.实验内容:用always块和@(posedgeclk)或@(negedgeclk)的结构表述一个1/2分频器的可综合模型,观察时序仿真结果四.实验代码modulehalf_clk(reset,clk_in,clk_out);inputclk_in,reset;outputclk_out;regclk_out;always@(posedgeclk_in)beginif(!reset)clk_out=0;elseclk_out=~clk_out;endendmodule`timescale1ns/100ps`defineclk_cycle50moduletop;regclk,reset;wireclk_out;always#`clk_cycleclk=~clk;initialbeginclk=0;reset=-1;#10reset=0;#110reset=1;#100000$stop;endhalf_clkm0(.reset(reset),.clk_in(clk),.clk_out(clk_out));endmodule五.综合仿真结果实验三利用条件语句实现计数分频时序电路一.实验目的:1.掌握条件语句在简单时序模块设计中的使用。2.学习在Verilog模块中应用计数器。3.学习测试模块的编写、综合和不同层次的仿真。二.实验设备:安装Modelsim-6.5c的PC机。三.实验内容:仿真一个可综合风格的分频器,将10MB的时钟分频为500KB的时钟,定义一个计数器,原理同1/2分频器一样,只不过分频变为1/20。四.实验代码modulefdivision(RESET,F10M,F500K);inputRESET,F10M;outputF500K;regF500K;reg[7:0]j;always@(posedgeF10M)if(!RESET)beginF500K=0;j=0;endelsebeginif(j==9)beginj=0;F500K=~F500K;endelsej=j+1;endendmodule`timescale1ns/1ps`defineclk_cycle50moduledivision_Top;regF10M,RESET;wireF500K_clk;always#`clk_cycleF10M=~F10M;initialbeginRESET=1;F10M=0;#100RESET=0;#100RESET=1;#10000$stop;endfdivisionfdivision(.RESET(RESET),.F10M(F10M),.F500K(F500K_clk));endmodule五.综合仿真结果实验四阻塞赋值与非阻塞赋值的区别一.实验目的:1.通过实验,掌握阻塞赋值与非阻塞赋值的概念和区别。2.了解非阻塞和阻塞赋值的不同使用场合。3.学习测试模块的编写、综合和不同层次的仿真。二.实验设备:安装Modelsim-6.5c的PC机。三.实验内容:两个模块,一个阻塞赋值,一个非阻塞赋值,观察两者之间的区别四.实验代码moduleblocking(clk,a,b,c);output[3:0]b,c;input[3:0]a;inputclk;reg[3:0]b,c;always@(posedgeclk)beginb=a;c=b;$display(Blocking:a=%d,b=%d,c=%d,a,b,c);endendmodule//non_blocking.vmodulenon_blocking(clk,a,b,c);output[3:0]b,c;input[3:0]a;inputclk;reg[3:0]b,c;always@(posedgeclk)beginb=a;c=b;$display(Non_Blocking:a=%d,b=%d,c=%d,a,b,c);endendmodule//comepareTop.v`timescale1ns/100psmoduleconpareTop;wire[3:0]b1,c1,b2,c2;reg[3:0]a;regclk;initialbeginclk=0;forever#50clk=~clk;endinitialbegina=4'h3;$display(___________);#100a=4'h7;$display(___________);#100a=4'hf;$display(___________);#100a=4'ha;$display(___________);#100a=4'h2;$display(___________);#100$display(___________);$stop;endnon_blockingnon_blocking(clk,a,b2,c2);blockingblocking(clk,a,b1,c1);endmodule五.综合仿真结果实验五用always块实现较复杂的组合逻辑:一.实验目的:1.掌握用always实现较大组合逻辑电路的方法。2.进一步了解assign与always两种组合电路实现方法的区别和注意点。3.学习测试模块中随机数的产生和应用。4.学习综合不同层次的仿真,并比较结果二.实验设备:安装Modelsim-6.5c的PC机。三.实验内容:设计一个简单的指令译码电路,该电路通过对指令的判断,对输入数据执行相应的操作,包括加、减、与、或和求反,并且无论是指令作用的数据还是指令本身发生变化,都有要作出及时的反应。四.实验代码`defineplus3'd0`defineminus3'd1`defineband3'd2`definebor3'd3`defineunegate3'd4modulealu(out,opcode,a,b);output[7:0]out;reg[7:0]out;input[2:0]opcode;input[7:0]a,b;always@(opcodeoraorb)begincase(opcode)`plus:out=a+b;`minus:out=a-b;`band:out=a&b;`bor:out=a|b;`unegate:out=~a;default:out=8'hx;endcaseendendmodule`timescale1ns/1nsmodulealutest;wire[7:0]out;reg[7:0]a,b;reg[2:0]opcode;parametertimes=5;initialbegina={$random}%256;b={$random}%256;opcode=3'h0;repeat(times)begin#100a={$random}%256;b={$random}%256;opcode=opcode+1;end#100$stop;endalualu1(out,opcode,a,b);endmodule五.综合仿真结果实验六在VerilogHDL中使用函数一.实验目的:1.了解函数的定义和在模块设计中的使用。2.了解函数的可综合性问题。3.了解许多综合器不能综合复杂的算术运算。二.实验设备:安装Modelsim-6.5c的PC机。三.实验内容:做一个函数调用的示例,采用同步时钟触发运算的执行,每个clk时钟周期执行一次运算,在测试模块中,调用系统任务$display及在时钟的下降沿显示每次运算的结果。四.实验代码moduletryfunct(clk,n,result,reset);output[31:0]result;input[3:0]n;inputreset,clk;reg[31:0]result;always@(posedgeclk)beginif(!reset)result=0;elsebeginresult=n*factorial(n)/((n*2)+1);endendfunction[3