当前位置:
文档之家› 第6章 Verilog HDL设计进阶习题
第6章 Verilog HDL设计进阶习题
XSC1
Ext T rig + _ A + _ + B _
U1B 74S04D
U4
~CLR ~LOAD CLK
12 13 14 15 1 2 3 4
74151N
~W Y
6 5
RCO ENT ENP 10 7 2 1 9
74163N
D C B A 6 5 4 3
V1 100 Hz 5V
QD QC QB QA
事实上,例6-9中,T在过程中出现了3次非阻塞赋值操作,即有3个赋值源对 同一信号T进行赋值--T<=0、T<=T+1和T<=T+2。但根据以上的讨论,对于非阻塞 式赋值,前两个语句中的赋值目标信号T都不可能得到任何数值,只有最后的 T<=T+2语句中的T的值能得到更新。然而,由于赋值符号右边的T始终未得到任何 确定的初始值,即语句T<=0并未完成赋值,所以最后的T始终是个未知值。结果 只能被综合成随S1和S0随机变动的时序电路,导致T成为一个不确定的信号。结 果在过程最后的case语句中,无法通过判断T的值来确定选通输入,即对OUT的赋 值。 例6-10就不一样了。程序首先执行了阻塞式赋值语句T=0,T即刻被更新,从 而使两个if语句中的T都能得到确定的初值。另一方面,当if语句不满足条件时, 即当S0或S1不等于1时,由于T已经在第一条赋值语句中被更新为确定的值0了, 所以尽管两个if语句从表面上看都属于不完整的条件语句,也不可能被综合成时 序电路了。显然也就有了图6-4所示正确的波形输出。
习
题
6-4 用循环语句设计一个7人投票表决器。 module voter7(pass,vote); output pass; input[6:0] vote; reg[2:0] sum; integer i; reg pass; always @(vote) begin sum=0; for(i=0;i<=6;i=i+1) //for 语句 if(vote[i]) sum=sum+1; if(sum[2]) pass=1; //若超过4 人赞成,则pass=1 else pass=0; end endmodule
1101000101
1 0
D5 D6
7
8 9 10 11
1
1 1 1 1
0
1 ~1 1 1
1
0 0 1 1 D7
1
1 0 0 1
VDD 5V U2 U1A 74S04D
15 11 12 13 14
7 9 10 11 ~G C B A D7 D6 D5 D4 D3 D2 D1 D0
二进制序列01001011001
习
二、移位型序列信号发生器 1.移位型序列信号发生器的组成
题
6-9 用原理图或Verilog输入方式分别设计一个周期性产生二进制序列01001011001 的序列发生器,用移位寄存器或用同步时序电路实现,并用时序仿真器验证其功能。
移位型序列信号发生器是由移位寄存器和组合电路两部分构成,组合电路的 输出,作为移位寄存器的串行输入。由n位移位寄存器构成的序列信号发生器所 产生的序列信号的最大长度为:P=2n
题
repeat循环语句
module Statistics8(sum,A); parameter S=4; output[3:0]sum; input[7:0] A; reg[3:0] sum; reg[2*S:1]TA; integer i; always @(A) begin TA=A; sum=0; repeat(2*S) begin if(TA[1])sum=sum+1; TA=TA>>1; end end endmodule
第6章 Verilog HDL设计进阶
习 题 实验与设计
习
题
6-1 在Verilog设计中,给时序电路清零(复位)有两种不同方法,它们是什么,如 何实现? 答:同步清零、异步清零,在过程语句敏感信号表中的逻辑表述posedge CLK用于指明 正向跳变,或negedge用于指明负向跳变实现 6-2 哪一种复位方法必须将复位信号放在敏感信号表中?给出这两种电路的Verilog 描述。 答:异步复位必须将复位信号放在敏感信号表中。 同步清零: always @(posedge CLK) //CLK上升沿启动 Q<=D; 异步清零: always @(posedge CLK or negedge RST) begin //块开始 //当CLK有升沿时D被锁入Q
6-3 用不同循环语句分别设计一个逻辑电路模块,用以统计一8位二进制数中含1的 数量。
6-3 用不同循环语句分别设计一个逻辑电路模块,用以统计一8位二进制 数中含1的数量。
while循环语句
module Statistics8(sum,A); parameter S=8; output[3:0]sum; input[7:0] A; reg[S:1] AT; reg[3:0] sum; reg[S:0] CT; always @(A) begin AT={{S{1'b0}},A}; sum=0; CT=S; while(CT>0) begin if(AT[1])sum=sum+1;else sum=sum; begin CT= CT-1; AT=AT>>1; end end end endmodule
题
【例6-10】阻塞赋初值正确
module mux4_1(DO,D1, D2,D3,S1, SO, OUT); output OUT ; input DO,D1, D2,D3,S1, SO; reg [2:0] T ; reg OUT; always @(D0, D1,D2,D3, S1,S0) begin T = 0; if (SO==1) T = T+1 if (S1==1) T = T+2 ; case (T) 0 : OUT = D0; 1 : OUT= D1; 2 : OUT =D2 ; 3 : OUT= D3; default : OUT D0; endcase end endmodule
if(!RST)Q<=0; //如果RST=0条件成立,Q被清0
else if(EN) Q<=D; end //在CLK上升沿处,EN=1,则执行赋值语句 //块结束
习
for循环语句
module Statistics8(sum,A); output[3:0]sum; input[7:0] A; reg[3:0] sum; integer i; always @(A) begin sum=0; for(i=0;i<=8;i=i+1) //for 语句 if(A[i]) sum=sum+1; else sum=sum; end endmodule
6-8 Verilog HDL设计一个比较电路,当输入的8421BCD码大于5时输出1,否则输出0。
设计一个四舍五入判别电路,其输入为8421BCD码,要求当输入大于或等于 5时,判别电路输出为1,反之为0。
原理图
习
题
6-9 用原理图或Verilog输入方式分别设计一个周期性产生二进制序列01001011001 的序列发生器,用移位寄存器或用同步时序电路实现,并用时序仿真器验证其功能。
习
题
6-5 Verilog设计一个4位4输入最大数值检测电路。
//Verilog设计一个4位4输入最大数值检测电路 module Maximum_value_detection(Mostlarge,a,b,c,d);//4位 4输入最大数值检测电路 output [3:0] Mostlarge; input [3:0] a,b,c,d; wire[3:0]sum1,sum2,sum3;
习
CP 1 2 3 4 5 6 QD(A2) QC(D4、~D5) 0 0 0 1 1 1 1 1 1 0 ~0 0 QB(A1) 0 1 1 0 0 1
题
QA(A0、D7) 1 0 1 0 D D1 D2 D3 D4 F 0 1 0 0 1 0
6-9 用原理图或Verilog输入方式分别设计一个周期性产生二进制序列01001011001 的序列发生器,用移位寄存器或用同步时序电路实现,并用时序仿真器验证其功能。
6-6 从不完整的条件语句产生时序模块的原理看,例6-9和例6-10从表面上看都包含 不完整条件语句,试说明,为什么例6-9的综合结果含锁存器,二例6-10却没有。 答:参见书P137
习
题
6-6 从不完整的条件语句产生时序模块的原理看,例6-9和例6-10从表面上看都包含 不完整条件语句,试说明,为什么例6-9的综合结果含锁存器,二例6-10却没有。 答:参见书P137
2.移位型序列信号发生器的设计(我们通过例题来说明)
例1.试设计一个01001011001序列信号发生器 首先确定移位寄存器的位数,并画出编码状态图,并找出迁移关系. P=11,因此只需要74194N中的四位,按序列信号四位一组去划分(有十中状 态),它的转换关系是:如图(1)
如图(1)
习
CP 0 QD 0 QC 1 QB 0 QA 0
assign sum1=(a>b)?a:b;
assign sum2=(c>d)?c:d; assign Mostlarge=(sum1>sum2)?sum1:sum2; endmodule
习
【例6-9】非阻塞赋初值导致错误
module mux4_1(D0,D1,D2,D3,S1,S0,OUT); output OUT ; input D0,D1, D2,D3,S1, SO; reg [2:0] T ; reg OUT; always @(D0, D1,D2,D3, S1,S0) begin T <= 0; if (SO==1) T <= T+1 if (S1==1) T <= T+2 ; case (T) 0 : OUT = D0; 1 : OUT = D1; 2 : OUT = D2 ; 3 : OUT= D3; default : OUT D0; endcase end endmodule