华中科技大学Verilog语言实验报告.docx

上传人:b****6 文档编号:6558841 上传时间:2023-01-07 格式:DOCX 页数:27 大小:504.59KB
下载 相关 举报
华中科技大学Verilog语言实验报告.docx_第1页
第1页 / 共27页
华中科技大学Verilog语言实验报告.docx_第2页
第2页 / 共27页
华中科技大学Verilog语言实验报告.docx_第3页
第3页 / 共27页
华中科技大学Verilog语言实验报告.docx_第4页
第4页 / 共27页
华中科技大学Verilog语言实验报告.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

华中科技大学Verilog语言实验报告.docx

《华中科技大学Verilog语言实验报告.docx》由会员分享,可在线阅读,更多相关《华中科技大学Verilog语言实验报告.docx(27页珍藏版)》请在冰豆网上搜索。

华中科技大学Verilog语言实验报告.docx

华中科技大学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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学案例设计

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1