EDA技术与Verilog_HDL(潘松)第四章与第六章课后习题答案
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
mux21a u1 (.a(a2),.b(a3),.s(s0),.y(tmp)); mux21a u2 (.a (a1),.b (tmp),.s(s1),.y(outy)); endmodule
图4-26 含2选1多路选择器的模块
习
题
4-7 给出1位全减器的VHDL描述。要求: (1)首先设计1位半减器,然后用例化语句将它们连接起来,图4-28中h_suber 是半减器,diff是输出差,s_out是借位输出,sub_in是借位输入。 (2)根据图4-27设计1位全减器。 (3)以1位全减器为基本硬件,构成串行借位的8位减法器,要求用例化语句来 完成此项设计。
习
题
4-3 阻塞赋值和非阻塞赋值有何区别? 答:Verilog中,用普通等号“=”作为阻塞式赋值语句的赋值符号,如y=b。 Verilog中,用普通等号“<=”作为非阻塞式赋值语句的赋值符号,如y<=b。 阻塞式赋值的特点是,一旦执行完当前的赋值语句,赋值目标变量y即刻 获得来自等号右侧表达式的计算值。如果在一个块语句中含有多条阻塞式赋值 语句,则当执行到其中某条赋值语句时,其他语句将禁止执行,即如同被阻塞 了一样。 非阻塞式赋值的特点是必须在块语句执行结束时才整体完成赋值操作。非 阻塞的含义可以理解为在执行当前语句时,对于块中的其他语句的执行情况一 律不加限制,不加阻塞。这也可以理解为,在begin_end块中的所有赋值语句都 可以并行运行。
【例4-21】含有异步清0同步时钟使能和同步数据加载功能的十进制计数器 module CNT10(CLK, RST, EN,LOAD,COUT,DOUT,DATA); input CLK, RST, EN,LOAD; //时钟,时钟使能,复位,数据加载控制信号输入口 input [3:0]DATA; //4位并行加载数据输入口 output [3:0] DOUT; //计数数据输出信号口 output COUT; //计数进位输出 reg COUT; reg[3:0] Q1; assign DOUT=Q1; //将内部寄存器的计数结果输出至DOUT always @(posedge CLK or negedge RST or negedge LOAD) //时序过程 begin if(!RST)Q1<=0; //RST=0时,对内部寄存器单元异步清0 else if(!LOAD)Q1<=DATA; //当LOAD=0,异步向内部寄存器加载数据 else if(EN)begin //同步使能EN=1,则允许加载或计数 if(Q1<9)Q1<=Q1+1; //当Q1小于9时,允许累加 else Q1<=4'b0000; //否则一个时钟后清0返回初值 end end always @(Q1) //组合电路之过程 if(Q1==4'h9)COUT=1'b1; //当Q1=1001时,COUT输出进位标志1 else COUT=1'b0; //否则,输出进位标志0 endmodule
第4章
Verilog HDL设计初步
习
题
4-1 举例说明,Verilog HDL的操作符中,哪些操作符的运算结果总是一位的。 答: P74/74/80/92
4-2 wire型变量与reg型变量有什么本质区别,它们可用于什么类型语句中? 答:书上P261~262《9.2 Verilog HDL数据类型》 reg主要是用于定义特定类型的变量,即寄存器型(Register)变量(或称寄存器型数据类的 变量)。如果没有在模块中显式地定义信号为网线型变量,Verilog综合器都会将其默认定 义为wire型。过程语句always@引导的顺序语句中规定必须是reg型变量。 wire型变量不允许有多个驱动源
else if (A==3'b110)Y=8'b10111111;
else if (A==3'b111)Y=8'b01111111; else end endmodule Y=8'bxxxxxxxx;end
initial begin
//测试文件,??部分请根据被测试的文件修改 module stimulus; G1=1 ;G2=1 ;G3=1;A=0; #10 G2=0;G1=0; #10 G2=0;G1=1; #10 G2=1;G1=0;G3=0; #10 G1=0;G1=1;G3=1; #10 G1=0;G1=0;G3=0; #10 G1=1;G2=0;G3=0; #50 A= 0; #50 A= 1; #50 A= 2; #50 A= 3; #50 A= 4; #50 A= 5; #50 A= 6; #50 A= 7; #50 $finish; end endmodule
习
module MUXK (a1, a2, a3, s0, s1, outy); input a1, a2, a3, s0, s1; output outy; wire outy; wire tmp;
题
4-6 图4-26所示的是双2选1多路选择器构成的电路MUXK。对于其中MUX21A,当s=0 和s=1时,分别有y=a和y=b。试在一个模块结构中用两个过程来表达此电路。 答:参考实验1
习
题
4-8 给出一个4选1多路选择器的Verilog描述。此器件与图4-1类似,但选通控制端有4 个输入:S0、S1、S2、S3。当且仅当S0=0时:Y=A;S1=0时:Y=B;S2=0时:Y=C; S3=0时:Y=D。
module MUX41a (A,B,C,D,S0,S1,S2,S3,Y); output Y; //定义Y为输出信号 input A, B, C, D; input S0,S1,S2,S3; reg Y; //定义输出端口信号Y为寄存器型变量 always @(A,B,C,S0,S1,S2,S3 )begin //块语句起始 if (S0==0)Y=A; //当S0 ==0成立,即(S0 ==0)=1时,Y=A; else if (S1==0)Y=B; //当(S1 ==1)为真,则Y=B; else if (S2==0)Y=C; //当(S2 ==2)为真,则Y=C; else if (S3==0) Y=D; //当(S3 ==3)为真,即Y=D; end //块语句结束 endmodule
reg [2:0]A ;
wire[7:0]Y ; reg G1 ,G2 ,G3;
decoder3_8 DUT ( G1 ,Y ,G2 ,A ,G3 );
initial begin $monitor($time,"A=%d,G1=%b,G2=%b, G3=%b,Y= %d\n",A, G1, G2, G3, Y); end
4-5 用Verilog设计一个3-8译码器,要求分别用case语句和if_else语句。比较这两 种方式。 module decoder3_8 ( G1 ,Y ,G2 ,A ,G3 );
input G1, G2, G3; wire G1, G2, G3;
input [2:0] A ;
wire [2:0] A ; output [7:0] Y ; reg [7:0] Y ; reg s; always @ ( A ,G1, G2, G3)
图4-27
1位全减器
习
题
x为被减数, y为减数, sub_in为 低位的借 位, diff r为差,su b_out为向 高位的借 位。
x 0 0 0 y 0 0 1 sub_in diffr sub_out 0 1 0 0 1 1 0 1 1
//一个二进制半减器设计进行了阐述
module h_suber(x,y,diff,s_out); input x,y; output diff, s_out; assign diff=x^y; assign s_out=(~x)&y; endmodule
begin
s <= G2 | G3 ; if (G1 == 0) Y <= 8'b1111_1111; else if (s) Y <= 8'b1111_1111;
else begin if (A==3'b000)Y=8'b11111110;
else if (A==3'b001)Y=8'b11111101; else if (A==3'b010)Y=8'b11111011; else if (A==3'b011)Y=8'b11110111; else if (A==3'b100)Y=8'b11101111; else if (A==3'b101)Y=8'b11011111;
x 0 0 y 0 1 diff 0 1 s_out 0 1
0
1 1
1
0 0
1
0 1
来自百度文库
0
1 0
1
0 0
1
1
1
1
0
1
0
1
0
1
1
1
0
1
1
0
0
0
module f_suber(x,y,sub_in,diffr,sub_out); //一个二进制全减器顶层设计进行了阐述 output diffr,sub_out; input x,y,sub_in; wire e,d,f; h_suber u1(x,y,e,d); // h_suber u2(.x(e),.diff(diffr),.y(sub_in),.s_out(f));// or2a u3(.a(d),.b(f),.c(sub_out)); endmodule
4-5 用Verilog设计一个3-8译码器,要求分别用case语句和if_else语句。比 较这两种方式。
4-5 用Verilog设计一个3-8译码器,要求分别用case语句和if_else语句。比较这两 种方式。
module decoder3_8 ( G1 ,Y ,G2 ,A ,G3 ); input G1, G2, G3; wire G1, G2, G3; input [2:0] A ; wire [2:0] A ; output [7:0] Y ; reg [7:0] Y ; reg s; always @ ( A ,G1, G2, G3) begin s <= G2 | G3 ; if (G1 == 0) Y <= 8'b1111_1111; else if (s) Y <= 8'b1111_1111; else case ( A ) 3'b000: Y = 8'b11111110; 3'b001: Y = 8'b11111101; 3'b010: Y = 8'b11111011; 3'b011: Y = 8'b11110111; 3'b100: Y = 8'b11101111; 3'b101: Y = 8'b11011111; 3'b110: Y = 8'b10111111; 3'b111: Y = 8'b01111111; default:Y = 8'bxxxxxxxx; endcase end endmodule
4-4 举例说明,为什么使用条件叙述不完整的条件句能导致产生时序模块的综合结果? 答:● 当CLK发生了电平变化,但是从1变到0。这时无论D是否变化,都将启动
过程去执行if语句;但此时CLK=0,无法执行if语句,从而无法执行赋值语句 Q<=D,于是Q只能保持原值不变(这就意味着需要在设计模块中引入存储元件)。 ● 当CLK没有发生任何变化,且CLK一直为0,而敏感信号D发生了变化。这 时也能启动过程,但由于CLK=0,无法执行if语句,从而也就无法执行赋值语句 Q<=D,导致Q只能保持原值(这也意味着需要在设计模块中引入存储元件)。 在以上两种情况中,由于if语句不满足条件,于是将跳过赋值表达式Q<=D, 不执行此赋值表达式而结束if语句和过程.对于这种语言现象,Velilog综合器解 释为,对于不满足条件,跳过赋值语句Q<=D不予执行,即意味着保持Q的原值 不变(保持前一次满足if条件时Q被更新的值)。对于数字电路来说,当输入改变后 试图保持一个值不变,就意味着使用具有存储功能的元件,就是必须引进时序元 件来保存Q中的原值,直到满足if语句的判断条件后才能更新Q中的值,于是便产 生了时序元件。 module LATCH1 (CLK, D, Q); output Q; input CLK, D; reg Q; always @(D or CLK) if(CLK)Q<=D; //当CLK=1时D被锁入Q endmodule