蔡觉平老师西电VerilogHDL上机大作业硬件描述语言微电子学院.docx
《蔡觉平老师西电VerilogHDL上机大作业硬件描述语言微电子学院.docx》由会员分享,可在线阅读,更多相关《蔡觉平老师西电VerilogHDL上机大作业硬件描述语言微电子学院.docx(17页珍藏版)》请在冰豆网上搜索。
蔡觉平老师西电VerilogHDL上机大作业硬件描述语言微电子学院
《VerilogHDL数字集成电路设计原理与应用》上机作业
班级:
*******
学号:
*******
姓名:
*******
题目1:
数字集成电路的verilogHDL描述与仿真。
要求:
(1)学习使用Modelsim设计和仿真软件;
(2)练习教材7.2.1中的例子;
(3)掌握设计代码和测试代码的编写;
(4)掌握测试仿真流程;
(5)掌握Modelsim软件的波形验证方式。
解答:
题目2:
简述begin-end语句块和fork-join语句块的区别,并写出下面信号对应的程序代码
解答:
(1)begin-end语句块和fork-join语句块的区别:
1、执行顺序:
begin-end语句块按照语句顺序执行,fork-join语句块所有语句均在同一时刻执行;
2、语句前面延迟时间的意义:
begin-end语句块为相对于前一条语句执行结束的时间,fork-join语句块为相对于并行语句块启动的时间;
3、起始时间:
begin-end语句块为首句开始执行的时间,fork-join语句块为转入并行语句块的时间;
4、结束时间:
begin-end语句块为最后一条语句执行结束的时间,fork-join语句块为执行时间最长的那条语句执行结束的时间;
5、行为描述的意义:
begin-end语句块为电路中的数据在时钟及控制信号的作用下,沿数据通道中各级寄存器之间的传送过程。
fork-join语句块为电路上电后,各电路模块同时开始工作的过程。
(2)程序代码:
Begin-end语句:
moduleinitial_tb1;
regA,B;
initial
begin
A=0;B=1;
#10A=1;B=0;
#10B=1;
#10A=0;
#10B=0;
#10A=1;B=1;
end
endmodule
Frk-join语句:
modulewave_tb2;
regA,B;
parameterT=10;
initial
fork
A=0;B=1;
#TA=1;B=0;
#(2*T)B=1;
#(3*T)A=0;
#(4*T)B=0;
#(5*T)A=1;B=1;
join
endmodule
题目3.分别用阻塞和非阻塞赋值语句描述如下图所示移位寄存器的电路图。
解答:
(1)阻塞赋值语句
moduleblock2(din,clk,out0,out1,out2,out3);
inputdin,clk;
outputout0,out1,out2,out3;
regout0,out1,out2,out3;
always@(posedgeclk)
begin
out0=din;
out1=out0;
out2=out1;
out3=out2;
end
endmodule
(2)非阻塞赋值语句
modulenon_block1(din,clk,out0,out1,out2,out3);
inputdin,clk;
outputout0,out1,out2,out3;
regout0,out1,out2,out3;
always@(posedgeclk)
begin
out0<=din;
out1<=out0;
out2<=out1;
out3<=out2;
end
endmodule
题目4:
设计16位同步计数器
要求:
(1)分析16位同步计数器结构和电路特点;
(2)用硬件描述语言进行设计;
(3)编写测试仿真并进行仿真。
解答:
(1)电路特点:
同步计数器的时间信号是同步的;每当到达最高计数后就会重新计数。
(2)程序代码:
modulecomp_16(count,clk,rst);
output[15:
0]count;
inputclk,rst;
reg[15:
0]count;
always@(posedgeclk)
if(rst)count<=16'b00000;
else
if(count==16'b1111111111111111)
count<=16'b00000;
else
count<=count+1;
endmodule
(3)仿真代码:
modulecomp_16_tb;
wire[15:
0]count;
regclk,rst;
comp_16U1(count,clk,rst);
always#1clk=~clk;
initial
begin
clk=0;rst=0;
#1rst=1;
#10rst=0;
#10rst=1;
#10rst=0;
#99999$finish;
end
endmodule
题目5.试用VerilogHDL门级描述方式描述如下图所示的电路。
解答:
modulezy(D0,D1,D2,D3,S1,S2,T0,T1,T2,T3,Z);
outputZ;
inputD0,D1,D2,D3,S1,S2;
wireT0,T1,T2,T3,wire1,wire2;
notU1(wire1,S1),
U2(wire2,S2);
andU3(T0,D0,wire2,wire1),
U4(T1,D1,S1,wire1),
U5(T2,D2,S1,wire2),
U6(T3,D3,S1,S2);
orU7(Z,T0,T1,T2,T3,);
endmodule
题目6.试用查找真值表的方式实现真值表中的加法器,写出VerilogHDL代码:
Cin
ain
bin
sum
Cout
0
0
0
0
0
0
0
1
1
0
0
1
0
1
0
0
1
1
0
1
1
0
0
1
0
1
0
1
0
1
1
1
0
0
1
1
1
1
1
1
解答:
modulehomework6(SUM,COUT,A,B,CIN);
outputSUM,COUT;
inputA,B,CIN;
regSUM,COUT;
always@(AorBorCIN)
case({A,B,CIN})
3'b000:
SUM<=0;
3'b000:
COUT<=0;
3'b001:
SUM<=1;
3'b001:
COUT<=0;
3'b010:
SUM<=1;
3'b010:
COUT<=0;
3'b011:
SUM<=0;
3'b011:
COUT<=1;
3'b100:
SUM<=1;
3'b100:
COUT<=0;
3'b101:
SUM<=0;
3'b101:
COUT<=1;
3'b110:
SUM<=0;
3'b110:
COUT<=1;
3'b111:
SUM<=1;
3'b111:
COUT<=1;
endcase
endmodule
题目7:
设计16位同步加法器和乘法器
要求:
(1)分析16位同步加法器和乘法器结构和电路特点;
(2)用硬件描述语言进行设计;
(3)编写测试仿真并进行仿真。
解答:
(1)16位同步加法器和乘法器结构和电路特点:
加法器的进位只用考虑一位,但是乘法器的进位要考虑到32位才行。
(2)程序代码:
16位同步加法器:
moduleadder(a,b,c,sum,cout);
output[15:
0]sum;
outputcout;
input[15:
0]a,b;
inputc;
assign{cout,sum}=a+b+c;
endmodule
16位同步乘法器:
modulemultiplier(a,b,mul);
input[15:
0]a,b;
output[31:
0]mul;
assignmul=a*b;
endmodule
(3)仿真代码:
16位同步加法器:
moduleadder_tb;
reg[15:
0]a,b;
regc;
wire[15:
0]sum;
wirecout;
initial
begin
a=8;b=8;c=1;
end
initial
begin
#10a=16'b1111111111111111;#10b=1;
end
adderU2(.a(a),.b(b),.c(c),.cout(cout),.sum(sum));
endmodule
16位同步乘法器:
modulemultiplier_tb;
reg[15:
0]a,b;
wire[31:
0]mul;
initial
begin
a=3;b=8;
end
initial
begin
#10a=100;
#15b=100;
end
multiplierU1(.a(a),.b(b),.mul(mul));
endmodule
仿真截图:
加法器:
乘法器:
题目8.将下面的状态转移图用VerilogHDL描述。
在图中,状态机的输入只与状态的跳转有关,与状态机的输出无关,因此该状态机为摩尔型状态机。
下面为三段式描述方式。
解答:
程序代码:
modulehomework8(clk,out,step,clr);
output[2:
0]out;
inputstep,clk,clr;
reg[2:
0]out;
reg[1:
0]state,next_state;
always@(posedgeclk)
state<=next_state;
always@(stateorclr)
if(clr)
next_state<=0;
else
case(state)
2'b00:
case(step)
1'b0:
beginnext_state<=2'b00;out<=3'b001;end
1'b1:
beginnext_state<=2'b01;out<=3'b001;end
endcase
2'b01:
begin
out<=3'b010;
next_state<=2'b10;
end
2'b10:
case(step)
1'b0:
beginnext_state<=2'b00;out<=3'b100;end
1'b1:
beginnext_state<=2'b11;out<=3'b100;end
endcase
2'b11:
case(step)
1'b0:
beginnext_state<=2'b11;out<=3'b111;end
1'b1:
beginnext_state<=2'b00;out<=3'b111;end
endcase
endcase
endmodule
仿真代码:
modulehomework8_tb;
regclk,step,clr;
wire[3:
0]out;
always
#5clk=~clk;
initial
beginclk=0;
clr=1;
step=1;
end
initial
begin
#5c