华中科技大学Verilog语言实验报告.docx
- 文档编号:6558841
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:27
- 大小:504.59KB
华中科技大学Verilog语言实验报告.docx
《华中科技大学Verilog语言实验报告.docx》由会员分享,可在线阅读,更多相关《华中科技大学Verilog语言实验报告.docx(27页珍藏版)》请在冰豆网上搜索。
华中科技大学Verilog语言实验报告
专业:
计算机科学与技术
班级:
CS1409
学号:
U201414813
姓名:
唐礼威
电话:
158********
邮件:
1770723422@
完成日期:
2016.6.13
1数据通路实验
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.运行综合RunSynthesis
3.综合成功后检查RTLAnalysis中的电路图Schematic
1.5故障及分析
刚开始跑出来很多线是断的,后来发现是引脚对应部分的代码没有写完整。
后来加法器和ACC的参数顺序写错,导致接线与题给的不一致,发现问题后及时改正了。
1.6仿真与结果
Schematic图形如下:
第一个数据通路:
第二个数据通路:
由以上两图可得,成功完成了要求的数据通路的设计,满足了各基本器件的输入输出链接要求;改变数据线宽度后再检查电路图,发现数据线做出相应改变,完成该实验。
1.7心得与体会
对数据通路的设计有了更好的理解,明白了数据通路的基本器件构成,熟悉了这些器件的功能和端口,掌握了Verilog完成基本运算器件的设计,完成了数据通路的设计。
2FSM实验
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,010。
5.2、用FSM实现一个序列识别器,该FSM的状态转移图如下所示,它能够对一位的串行输入序列中的“1”的数量进行检测。
如果FSM发现输入“1”的总数可以被3整除时,输出“1”;否则,输出“0”。
同时针对“***********”输入序列,写出相应的仿真程序并进行真波测试。
2.3实验方案
先根据要求画出状态图,根据状态图编写程序,根据程序编写仿真程序,最后得出结果和结论。
2.4实验步骤
5.1_1状态图:
in=1/1in=1/0
in=0/0
in=1/0in=1/0
in=0/0in=1/1
in=0/0
5.1_2状态图:
in=00
in=01in=10in=11
in=00in=00in=00
out=0out翻转out=1
5.1_3状态图:
1.根据以上状态图编写源程序(见附录)
2.运行综合RunSynthesis
3.综合正确后编写仿真程序
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(第一个数据通路)
//主模块
moduletext4(S0,S1,S2,S3,Clk,reset,load,outR0,outR1,outACC,outS0,outS1,outS2,outS3,outA);
parameterWIDTH=8;//位宽8位
inputS0,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);
assigninS00=outS3;
assigninS10=outS3;
assigninS01=outR0;
assigninS20=outR0;
assigninS11=outR1;
assigninS21=outR1;
assigninA0=outACC;
assigninS31=outACC;
assigninACC=outA;
assigninA1=outS2;
assigninS30=outS2;
assigninR1=outS1;
assigninR0=outS0;
endmodule
//加法器模块
moduleadd(A,B,C);
parameterWIDTH=8;
input[WIDTH-1:
0]A,B;
output[WIDTH-1:
0]C;
wire[WIDTH:
0]DATA;
assignDATA=A+B;
assignC=DATA[7:
0];
endmodule
//寄存器模块
moduleregister(D,Clk,reset,load,Q);
parameterWIDTH=8;
input[WIDTH-1:
0]D;
inputClk,reset,load;
outputreg[WIDTH-1:
0]Q;
always@(posedgeClk)
if(reset)
begin
Q<=8'b0;
endelseif(load)
begin
Q<=D;
end
endmodule
//二路选择器模块
modulemux(s,x,y,m);
parameterWIDTH=8;
input[WIDTH-1:
0]x,y;
inputs;
output[WIDTH-1:
0]m;
assignm=(s?
y:
x);
endmodule
4.2(第二个数据通路)
//主模块
moduletext2(SUM_SEL,NEXT_SEL,A_SEL,LD_SUM,LD_NEXT,NEXT_ZERO,outSUM_SEL,outNEXT_SEL,outA_SEL,outSUM,outNEXT,outA1,outA2,outMEM);
parameterWIDTH=8;
inputSUM_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;
outputNEXT_ZERO;
mux#(WIDTH)SUM_SEL(SUM_SEL,inSUM_SEL00,inSUM_SEL01,outSUM_SEL);
mux#(WIDTH)NEXT_SEL(NEXT_SEL,inNEXT_SEL00,inNEXT_SEL01,outNEXT_SEL);
mux#(WIDTH)A_SEL(A_SEL,inA_SEL00,inA_SEL01,outA_SEL);
register#(WIDTH)SUM(inSUM,Clk,reset,LD_SUM,outSUM);
register#(WIDTH)NEXT(inNEXT,Clk,reset,LD_NEXT,outNEXT);
add#(WIDTH)A1(inA10,inA11,outA1);
add#(WIDTH)A2(inA20,inA21,outA2);
ROM#(WIDTH,WIDTH)MEM(outMEM,inMEM);
COM#(WIDTH)COM(inCOM0,inCOM1,NEXT_ZERO);
assigninA10=outSUM;
assigninA11=outMEM;
assigninNEXT_SEL00=outMEM;
assigninNEXT_SEL01=0;
assigninSUM_SEL00=outA1;
assigninSUM_SEL01=0;
assigninSUM=outSUM_SEL;
assigninNEXT=outNEXT_SEL;
assigninA20=outNEXT;
assigninA21=1;
assigninA_SEL00=outNEXT;
assigninA_SEL01=outA2;
assigninMEM=outA_SEL;
assigninCOM0=outNEXT_SEL;
assigninCOM1=0;
endmodule
moduleCOM(a,b,out);
parameterWIDTH=8;
input[WIDTH-1:
0]a,b;
outputout;
regout;
always@(aorb)
begin
if(a>b)
out=1;
elseout=0;
end
endmodule
//存储器模块
moduleROM(ROM_data,ROM_addr);
parameterdata_WIDTH=8;
parameteraddr_WIDTH=8;
output[addr_WIDTH-1:
0]ROM_data;
input[addr_WIDTH-1:
0]ROM_addr;
reg[addr_WIDTH-1:
0]ROM[data_WIDTH-1:
0];//defining4x2ROM
assignROM_data=ROM[ROM_addr];//readingROMcontentattheaddressROM_addr
initial$readmemb("ROM_data.txt",ROM,0,3);//loadROMcontentfromROM_data.txtfile
endmodule
//寄存器模块
moduleregister(D,Clk,reset,load,Q);
parameterWIDTH=8;
input[WIDTH-1:
0]D;
inputClk,reset,load;
outputreg[WIDTH-1:
0]Q;
always@(posedgeClk)
if(reset)
begin
Q<=8'b0;
endelseif(load)
begin
Q<=D;
end
endmodule
//加法器模块
moduleadd(A,B,C);
parameterWIDTH=8;
input[WIDTH-1:
0]A,B;
output[WIDTH-1:
0]C;
wire[WIDTH:
0]DATA;
assignDATA=A+B;
assignC=DATA[7:
0];
endmodule
//二路选择器模块
modulemux(s,x,y,m);
parameterWIDTH=8;
input[WIDTH-1:
0]x,y;
inputs;
output[WIDTH-1:
0]m;
assignm=(s?
y:
x);
endmodule
5.1_1
modulelab5_1_1(inputclk,inputreset,inputain,outputregyout,outputreg[3:
0]count);
reg[1:
0]state,nextstate;
parameterS0=0,S1=1,S2=2,S3=3;
always@(posedgeclk)//alwaysblocktoupdatestate
if(reset)begin
state<=S0;
count=0;
end
else
state<=nextstate;
always@(stateorain)//alwaysblocktocomputeoutput
begin
yout=0;
case(state)
S0:
if(!
ain)
yout=1;
S1:
yout=0;
S2:
yout=0;
S3:
if(ain)
yout=1;
endcase
end
always@(posedgeclk)//alwaysblocktocomputeoutput
begin
if(ain)
count=count+1;
end
always@(stateorain)//alwaysblocktocomputenextstate
begin
case(state)
S0:
if(ain)
nextstate=S1;
elsenextstate=S0;
S1:
if(ain)
nextstate=S2;
elsenextstate=S1;
S2:
if(ain)
nextstate=S3;
elsenextstate=S2;
S3:
if(ain)
nextstate=S1;
elsenextstate=S3;
endcase
end
endmodule
仿真程序:
modulelab5_1_1_tb();
regclk,reset,ain;
wireyout;
wire[3:
0]count;
integeri;
parameterTIME=400;
parameterDELAY=5;
lab5_1_1DUT(.clk(clk),.ain(ain),.count(count),.reset(reset),.yout(yout));
initialbegin
#TIME$finish;
end
initialbegin
clk=0;
for(i=0;i<(TIME/DELAY);i=i+1)
#DELAYclk=~clk;
end
initialbegin
reset=1;
#(4*DELAY)reset=0;
#(34*DELAY)reset=1;
#(2*DELAY)reset=0;
end
initialbegin
ain=0;
#(8*DELAY)ain=~ain;
#(4*DELAY)ain=~ain;
#(12*DELAY)ain=~ain;
#(8*DELAY)ain=~ain;
#(4*DELAY)ain=~ain;
#(6*DELAY)ain=~ain;
#(6*DELAY)ain=~ain;
end
endmodule
5.1_2
modulelab5_1_2(inputclk,inputreset,input[1:
0]x,outputregyout,outputreg[2:
0]nextstate);
reg[2:
0]state;
parameterS0=0,S11=1,S21=2,S31=3,S12=4,S22=5,S32=6;
always@(posedgeclk)//alwaysblocktoupdatestate
if(reset)begin
state<=S0;
nextstate=S0;
yout=0;
end
else
state<=nextstate;
always@(state)//alwaysblocktocomputeoutput
begin
case(state)
S0:
yout=yout;
S12:
yout=0;
S22:
yout=1;
S32:
yout=~yout;
endcase
end
always@(stateorx)//alwaysblocktocomputenextstate
begin
case(state)
S0:
if(x==1)
nextstate=S11;
elseif(x==3)
nextstate=S21;
elseif(x==2)
nextstate=S31;
S11:
if(x==0)nextstate=S12;
elseif(x==1)nextstate=S11;
elseif(x==3)nextstate=S21;
elseif(x==2)nextstate=S31;
S12:
if(x==1)nextstate=S11;
elseif(x==3)nextstate=S21;
elseif(x==2)nextstate=S31;
S21:
if(x==0)nextstate=S22;
elseif(x==1)nextstate=S11;
elseif(x==3)nextstate=S21;
elseif(x==2)nextstate=S31;
S22:
if(x==1)nextstate=S11;
elseif(x==3)nextstate=S21;
elseif(x==2)nextstate=S31;
S31:
if(x==0)nextstate=S32;
elseif(x==1)nextstate=S11;
elseif(x==3)nextstate=S21;
elseif(x==2)nextstate=S31;
S32:
if(x==1)nextstate=S11;
elseif(x==3)nextstate=S21;
elseif(x==2)nextstate=S31;
endcase
end
endmodule
仿真程序:
modulelab5_1_2_tb();
regclk,reset;
reg[1:
0]x;
wire[2:
0]nextstate;
wireyout;
integeri;
parameterTIME=200;
parameterDELAY=5;
lab5_1_2DUT(.clk(clk),.x(x),.reset(reset),.yout(yout),.nextstate(nextstate));
initialbegin
#TIME$finish;
end
initialbegin
clk=0;
for(i=0;i<(TIME/DELAY);i=i+1)
#DELAYclk=~clk;
end
initialbegin
reset=1;
#(4*DELAY)reset=0;
end
initialbegin
x=0;
#(8*DELAY)x=3;
#(2*DELAY)x=2;
#(2*DELAY)x=0;
#(4*DELAY)x=2;
#(2*DELAY)x=0;
#(2*DELAY)x=3;
#(2*DELAY)x=0;
#(2*DELAY)x=1;
#(2*DELAY)x=0;
#(2*DELAY)x=2;
#(2*DELAY)x=3;
#(2*DELAY)x=0;
#(6*DELAY)x=2;
#(6*DELAY)x=0;
end
endmodule
5.1_3
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华中科技大学 Verilog 语言 实验 报告