
华中科技大学Verilog语言实验报告.docx
34页2016Verilog 语言 ·实验报告· 专 业:计算机科学与技术班 级:CS1409学 号:U201414813姓 名:唐礼威电 话:15827505005邮 件:1770723422@.com完成日期:2016.6.13 华 中 科 技 大 学 课 程 实 验 报 告目 录1 数据通路实验 11.1 实验目的 11.2 实验内容及要求 11.3 实验方案 21.4 实验步骤 21.5 故障及分析 21.6 仿真与结果 31.7 心得与体会 42 FSM实验 52.1 实验目的 52.2 实验内容及要求 52.3 实验方案 62.4 实验步骤 62.5 故障及分析 72.6 仿真与结果 72.7 心得与体会 83 意见和建议 94 附录 10191 数据通路实验1.1 实验目的综合应用掌握的简单组合电路和时序电路的设计方法,完成一个简单的数据通路的设计1.2 实验内容及要求1. 根据下图给出的数据通路(图中R0、R1和ACC是寄存器,+是加法器,其它则是多路选择器),完成相应的Verilog程序设计,图中数据线的宽度为8位,要求可以扩充至16位或者是32位;2. 根据下图给出的数据通路(图中SUM和NEXT是寄存器,Memory是存储器,+是加法器,==0是比较器,其它则是多路选择器),完成相应的Verilog程序设计,图中数据线的宽度为8位,要求可以扩充至16位或者是32位。
实验要求:程序必须自己编写,满足数据通路设计要求,综合结果正确1.3 实验方案根据要求,先把选择器、加法器、寄存器、比较器和存储器分模块编写,在主模块中根据数据通路调用即可题目中要求数据线宽度为8位,并且可以扩充至16位或32位,所以在前面定义WIDTH,利用parameter的参数传递功能来实现1.4 实验步骤1.分模块编写代码(见附录)2.运行综合Run Synthesis3.综合成功后检查RTL Analysis中的电路图Schematic1.5 故障及分析刚开始跑出来很多线是断的,后来发现是引脚对应部分的代码没有写完整后来加法器和ACC的参数顺序写错,导致接线与题给的不一致,发现问题后及时改正了1.6 仿真与结果Schematic图形如下:第一个数据通路:第二个数据通路:由以上两图可得,成功完成了要求的数据通路的设计,满足了各基本器件的输入输出链接要求;改变数据线宽度后再检查电路图,发现数据线做出相应改变,完成该实验1.7 心得与体会对数据通路的设计有了更好的理解,明白了数据通路的基本器件构成,熟悉了这些器件的功能和端口,掌握了Verilog完成基本运算器件的设计,完成了数据通路的设计。
2 FSM实验2.1 实验目的掌握用Verilog语言进行FSM设计、实现和仿真的方法2.2 实验内容及要求5.1_1、用FSM实现一个mealy型序列检测器,对一位的串行输入序列中的“1”的数量进行检测如果“1”的总数可以被3整除,输出“1”,否则输出“0”5.1_2、用FSM实现一个moore型序列检测器,对两位的串行输入序列进行检测输入01,00时,输出0,输入11,00时,输出1,输入10,00时,输出反向5.1_3、用FSM实现一个计数器(采用存储器),对一位的输入进行计数计数序列为:000,001,011,101,111,0105.2、用FSM实现一个序列识别器,该FSM的状态转移图如下所示,它能够对一位的串行输入序列中的“1”的数量进行检测如果FSM发现输入“1”的总数可以被3整除时,输出“1”;否则,输出“0”同时针对“01011011101”输入序列,写出相应的仿真程序并进行真波测试2.3 实验方案先根据要求画出状态图,根据状态图编写程序,根据程序编写仿真程序,最后得出结果和结论2.4 实验步骤5.1_1状态图:S1S0 in=1/1 in=1/0 in=0/0 in=1/0 in=1/0S4S3 in=0/0 in=1/1 in=0/05.1_2状态图:S0 in=00 in=01 in=10 in=11S2S1S3S6S5S4 in=00 in=00 in=00 out=0 out翻转 out=15.1_3状态图:1.根据以上状态图编写源程序(见附录)2.运行综合Run Synthesis3.综合正确后编写仿真程序4.仿真,得到仿真波形,验证结果2.5 故障及分析无故障2.6 仿真与结果5.1_1:如图,1的个数是3的倍数时输出1与预期一致5.1_2:如图,输入01后再输入00,输出0;输入11后再输入00,输出1;输入10后再输入00,输出翻转:与预期一致5.1_3:如图,输出序列为000,001,011,101,111,010(重复)与预期一致5.2:如图,1的个数是3的倍数时输出1与预期一致2.7 心得与体会这次实验通过FSM设计明白了设计的过程和步骤,首先要知道分为哪些状态,设计的是何种电路,如何选择用mealy还是moore型电路,状态转移要如何实现。
知道了mealy型和moore型电路的区别:当要求输出对输入快速响应并希望电路简单时选择mealy型,当要求时序输出稳定,能接受输出序列晚一个周期,即选择moore型电路不增加电路复杂性时,选择moore型电路3 意见和建议建议老师上课还是用中文PPT比较好,另外作业练习也用中文给出来,题目要求也尽量具体些,这样会减少我们学习的成本,更加有效的学习这门课4 附录源程序:4.1(第一个数据通路)//主模块module text4(S0,S1,S2,S3,Clk,reset,load,outR0,outR1,outACC,outS0,outS1,outS2,outS3,outA); parameter WIDTH=8; //位宽8位 input S0,S1,S2,S3,Clk,reset,load; output [WIDTH-1:0] outR0,outR1,outACC,outS0,outS1,outS2,outS3,outA; register #(8) R0(inR0,Clk,reset,load,outR0); register #(8) R1(inR1,Clk,reset,load,outR1); register #(8) ACC(inACC,Clk,reset,load,outACC); mux #(8) S0(S0,inS00,inS01,outS0); mux #(8) S1(S1,inS10,inS11,outS1); mux #(8) S2(S2,inS20,inS21,outS2); mux #(8) S3(S3,inS30,inS31,outS3); add #(8) W1(inA0,inA1,outA); assign inS00=outS3; assign inS10=outS3; assign inS01=outR0; assign inS20=outR0; assign inS11=outR1; assign inS21=outR1; assign inA0=outACC; assign inS31=outACC; assign inACC=outA; assign inA1=outS2; assign inS30=outS2; assign inR1=outS1; assign inR0=outS0;endmodule//加法器模块module add(A,B,C); parameter WIDTH=8; input [WIDTH-1:0] A, B; output [WIDTH-1:0] C; wire [WIDTH:0] DATA; assign DATA=A+B; assign C=DATA[7:0];endmodule//寄存器模块module register(D,Clk,reset,load,Q); parameter WIDTH=8; input [WIDTH-1:0] D; input Clk,reset,load; output reg [WIDTH-1:0] Q;always @(posedge Clk)if (reset)beginQ <= 8'b0;end else if (load)beginQ <= D;endendmodule//二路选择器模块module mux(s,x,y,m); parameter WIDTH=8; input [WIDTH-1:0] x,y; input s; output [WIDTH-1:0] m;assign m =(s?y:x);endmodule4.2(第二个数据通路)//主模块module text2(SUM_SEL,NEXT_SEL,A_SEL,LD_SUM,LD_NEXT,NEXT_ZERO,outSUM_SEL,outNEXT_SEL,outA_SEL,outSUM,outNEXT,outA1,outA2,outMEM);parameter WIDTH=8; input SUM_SEL,NEXT_SEL,A_SEL,LD_SUM,LD_NEXT; wire [WIDTH-1:0] inSUM_SEL00,inSUM_SEL01,outSUM_SEL,inNEXT_SEL00,inNEXT_SEL01,outNEXT_SEL; output [WIDTH-1:0] outSUM_SEL,outNEXT_SEL,outA_SEL,outSUM,outNEXT,outA1,outA2,outMEM; output NEXT_ZERO; mux #(WIDTH) SUM_SEL(SUM_SEL,inSUM_SEL00,inSUM_S。
