蔡觉平老师西电VerilogHDL上机大作业硬件描述语言微电子学院Word格式.docx
《蔡觉平老师西电VerilogHDL上机大作业硬件描述语言微电子学院Word格式.docx》由会员分享,可在线阅读,更多相关《蔡觉平老师西电VerilogHDL上机大作业硬件描述语言微电子学院Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
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;
end
endmodule
Frk-join语句:
modulewave_tb2;
parameterT=10;
fork
#TA=1;
#(2*T)B=1;
#(3*T)A=0;
#(4*T)B=0;
#(5*T)A=1;
join
题目3.分别用阻塞和非阻塞赋值语句描述如下图所示移位寄存器的电路图。
(1)阻塞赋值语句
moduleblock2(din,clk,out0,out1,out2,out3);
inputdin,clk;
outputout0,out1,out2,out3;
regout0,out1,out2,out3;
always@(posedgeclk)
out0=din;
out1=out0;
out2=out1;
out3=out2;
end
(2)非阻塞赋值语句
modulenon_block1(din,clk,out0,out1,out2,out3);
begin
out0<
=din;
out1<
=out0;
out2<
=out1;
out3<
=out2;
题目4:
设计16位同步计数器
(1)分析16位同步计数器结构和电路特点;
(2)用硬件描述语言进行设计;
(3)编写测试仿真并进行仿真。
(1)电路特点:
同步计数器的时间信号是同步的;
每当到达最高计数后就会重新计数。
modulecomp_16(count,clk,rst);
output[15:
0]count;
inputclk,rst;
reg[15:
always@(posedgeclk)
if(rst)count<
=16'
b00000;
else
if(count==16'
b1111111111111111)
count<
=count+1;
(3)仿真代码:
modulecomp_16_tb;
wire[15:
regclk,rst;
comp_16U1(count,clk,rst);
always#1clk=~clk;
clk=0;
rst=0;
#1rst=1;
#10rst=0;
#10rst=1;
#99999$finish;
题目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,);
题目6.试用查找真值表的方式实现真值表中的加法器,写出VerilogHDL代码:
Cin
ain
bin
sum
Cout
1
modulehomework6(SUM,COUT,A,B,CIN);
outputSUM,COUT;
inputA,B,CIN;
regSUM,COUT;
always@(AorBorCIN)
case({A,B,CIN})
3'
b000:
SUM<
=0;
COUT<
b001:
=1;
b010:
b011:
b100:
b101:
b110:
b111:
COUT<
endcase
endmodule
题目7:
设计16位同步加法器和乘法器
(1)分析16位同步加法器和乘法器结构和电路特点;
(2)用硬件描述语言进行设计;
(1)16位同步加法器和乘法器结构和电路特点:
加法器的进位只用考虑一位,但是乘法器的进位要考虑到32位才行。
16位同步加法器:
moduleadder(a,b,c,sum,cout);
output[15:
0]sum;
outputcout;
input[15:
0]a,b;
inputc;
assign{cout,sum}=a+b+c;
16位同步乘法器:
modulemultiplier(a,b,mul);
output[31:
0]mul;
assignmul=a*b;
moduleadder_tb;
regc;
wire[15:
wirecout;
initial
begin
a=8;
b=8;
c=1;
#10a=16'
b1111111111111111;
#10b=1;
adderU2(.a(a),.b(b),.c(c),.cout(cout),.sum(sum));
modulemultiplier_tb;
reg[15:
wire[31:
initial
a=3;
#10a=100;
#15b=100;
multiplierU1(.a(a),.b(b),.mul(mul));
仿真截图:
加法器:
乘法器:
题目8.将下面的状态转移图用VerilogHDL描述。
在图中,状态机的输入只与状态的跳转有关,与状态机的输出无关,因此该状态机为摩尔型状态机。
下面为三段式描述方式。
程序代码:
modulehomework8(clk,out,step,clr);
output[2:
0]out;
inputstep,clk,clr;
reg[2:
reg[1:
0]state,next_state;
always@(posedgeclk)
state<
=next_state;
always@(stateorclr)
if(clr)
next_state<
case(state)
2'
b00:
case(step)
1'
b0:
beginnext_state<
=2'
b00;
out<
=3'
b001;
b1:
b01;
b01:
out<
b010;
b10;
end
b10:
b100;
b11;
b11:
b111;
仿真代码:
modulehomework8_tb;
regclk,step,clr;
wire[3:
always
#5clk=~clk;
beginclk=0;
clr=1;
step=1;
#5c