EDA技术与Verilog设计第六章课后习题部分答案.ppt
6-11,6-11 试编写求补码的Verilog程序,输入是带符号的8位二进制数module wytest(data_in,data_out);/习题6-11 input7:0 data_in;output7:0 data_out;reg7:0 data_out;always(data_in)begin if(data_in7)/正数负数判断,从最高是否为1来判断 data_out=(data_in)+1)|8h80;else data_out=data_in;end endmodule,6-11仿真波形,8A-原码表示的十进制数-10 0A-十进制数10B6-原码表示的十进制数-54 36-十进制数5380-原码表示的十进制数128,6-12,6-12 编写两个四位二进制数相减的verilog程序 module wytest(opr1,opr2,out_data);/完成Opr1-opr2的运算 input3:0 opr1,opr2;output4:0 out_data;reg3:0 out;reg cout;function3:0 abs;input3:0 data;case(data3)1b0:abs=data;1b1:abs=(data)+1;/对负数求绝对值,按位取反再加1 endcase endfunction,6-12,always(opr1 or opr2)case(opr13,opr23)2b00:cout,out=opr1-opr2;/两个正数相减 2b01:cout,out=opr1+abs(opr2);/正数减负数,化为加 法运算 2b10:cout,out=-(abs(opr1)+opr2);/负数减正数,化为加 法再取反 2b11:cout,out=abs(opr2)-abs(opr1);/负数相减,化为绝 对值相减(顺序调换)endcase assign out_data=cout,out;endmodule,6-12,6-12 仿真波形,6-13,6-13 有一个比较电路,当输入的一位BCD码 大于4时,输出1,否则输出0。module wytest(bcd_in,out);input3:0 bcd_in;output out;assign out=(bcd_in4)?1:0;endmodule,6-13,仿真波形,6-13,module wytest(bcd_in,out);/习题6-13 input3:0 bcd_in;output out;/assign out=(bcd_in4)?1:0;reg out;always(bcd_in)if(bcd_in-40)out=1;else out=0;endmodule,6-13,6-14,试编写一个实现3输入与非门的verilog程序;module wytest(a,o);input2:0 a;output o;nand nand3(o,a0,a1,a2);endmodule,6-14,6-15,6-15 设计74138译码器电路,6-15,module wytest(s1,s2,in,out);input s1;input1:0 s2;input2:0 in;output7:0 out;reg8:0 out;always(s1 or s2 or in)begin if(s1=0)out=8hff;else if(!s20)|(!s21)out=8hff;,else case(in)3d0:out=8b11111110;3d1:out=8b11111101;3d2:out=8b11111011;3d3:out=8b11110111;3d4:out=8b11101111;3d5:out=8b11011111;3d6:out=8b10111111;3d7:out=8b01111111;endcaseendendmodule,6-15,6-16,CO=Q3 Q2 Q1 Q0 CTT,注意:异步清零、同步置位,6-16 设计一个74161的电路。,6-16,module wytest(reset,load,ctt,ctp,clk,data_in,out,co);/习题6-16input reset,load,ctt,ctp,clk;input3:0 data_in;output3:0 out;output co;reg3:0 out;reg co;always(posedge clk or negedge reset)if(!reset)begin out=4b0;co=1b0;end else if(!load)out=data_in;else if(!ctt)out=out;else if(!ctp)out=out;,else begin out=out+1;if(out=14)co=1;else co=0;endendmodule,6-16,四级流水线实现的32位加法器,module wytest(clk,a,b,sum,cout);input31:0 a,b;input clk;output31:0 sum;output cout;/最后输出的结果reg31:0 sum;reg cout;/第一级流水线的输出reg7:0 fist_sum;reg first_cout;/第一级流水线要缓存的数据/未用的数据缓存 reg7:0 first_a_31_24,first_a_23_16,first_a_15_8;reg7:0 first_b_31_24,first_b_23_16,first_b_15_8;,四级流水线实现的32位加法器,/第二级流水线的输出reg7:0 second_sum;reg second_cout;/第二级流水线要缓存的数据/未用的数据缓存 reg7:0 second_a_31_24,second_a_23_16;reg7:0 second_b_31_24,second_b_23_16;/第一级流水线计算结果缓存reg7:0 first_sum_1;/第一级流水线计算结果第一次缓存/第三级流水线输出reg7:0 third_sum;reg third_cout;/第三级流水线要缓存的数据/未用的数据缓存 reg7:0 third_a_31_24;reg7:0 third_b_31_24;/第一级、第二级流水线计算结果缓存reg7:0 first_sum_2;/第一级流水线计算结果第二次缓存;reg7:0 second_sum_1;/第二级流水线计算结果第一次缓存;,四级流水线实现的32位加法器,/第一级流水线always(posedge clk)begin first_cout,fist_sum=a7:0+b7:0+cout;first_a_31_24=a31:24;first_b_31_24=b31:24;first_a_23_16=a23:16;first_b_23_16=b23:16;first_a_15_8=a15:8;first_b_15_8=b15:8;end/第二级流水线always(posedge clk)begin second_cout,second_sum=first_a_15_8+first_b_15_8+first_cout;second_a_31_24=first_a_31_24;second_b_31_24=first_b_31_24;second_a_23_16=first_a_23_16;second_b_23_16=first_b_23_16;first_sum_1=fist_sum;end,四级流水线实现的32位加法器,/第三级流水线always(posedge clk)beginthird_cout,third_sum=second_a_23_16+second_b_23_16+second_cout;third_a_31_24=second_a_31_24;third_b_31_24=second_b_31_24;first_sum_2=first_sum_1;second_sum_1=second_sum;end/第四级流水线always(posedge clk)begin cout,sum31:24=third_a_31_24+third_b_31_24+third_cout;sum23:0=third_sum,second_sum_1,first_sum_2;endendmodule,四级流水线实现的32位加法器,8x8乘法器实现,module wytest(out,a,b,clk);input7:0 a,b;input clk;output15:0 out;reg15:0 out;reg3:0 firsta,firstb;reg3:0 seconda,secondb;wire7:0 outa,outb,outc,outd;always(posedge clk)begin firsta3:0=a7:4;seconda3:0=a3:0;firstb3:0=b7:4;secondb3:0=b3:0;end,mul4x4 m1(outa,firsta,firstb,clk),m2(outb,seconda,firstb,clk),m3(outc,firsta,secondb,clk),m4(outd,seconda,secondb,clk);always(posedge clk)out=(outa8)+(outb4)+(outc 4)+outd;endmodule,8x8乘法器实现,用另一种方法实现:将8位数字分成4段,每段两位,那么操作数可表示如下:A=A1X26+A2X24+A3X22+A4 B=B1X26+B2X24+B3X22+B4 AXB=(A1X26+A2X24+A3X22+A4)X(B1X26+B2X24+B3X22+B4)上式展开后,要做16次2X2的乘法,调用16次lookup函数 然后再做移位相加的处理。,7-5 编写4位并-串转换电路,module wytest(clk,rst,in,out);input clk,rst;input3:0 in;output out;reg out;reg1:0 i;,always(posedge clk)begin if(rst)begin i=2d0;out=1d0;end else if(i=3)begin out=ini;i=i+1;end end,模为9的占空比50%的奇数分频,module wytest(RESET,CLK,COUT);input CLK,RESET;output COUT;reg3:0 m,n;wire COUT;reg COUT1,COUT2;assign COUT=COUT1|COUT2;always(posedge CLK)begin if(!RESET)begin COUT1=0;/输出信号初态为0 m=0;/计数初值为0 end,else if(RESET)begin if(m=8)/n-1 begin m=0;end else m=m+1;if(m=3)/N/2-1.5 COUT1=COUT1;else if(m=7)/N-2 COUT1=COUT1;endend,always(negedge CLK)begin if(!RESET)begin COUT2=0;n=0;end,else if(RESET)begin if(n=8)begin n=0;end else n=n+1;if(n=3)COUT2=COUT2;else if(n=7)COUT2=COUT2;endendEndmodule,模为9的占空比50%的奇数分频,模为9.3的小数分频,分频方法:9分频7次,10分频3次,module fdiv8_1(clk_in,rst,clk_out);input clk_in,rst;output clk_out;reg clk_out;reg3:0 cnt1;/cnt1计8分频的次数reg3:0 cnt2;/cnt2为两个分频器的计数值always(posedge clk_in or posedge rst)begin if(rst)begin cnt1=0;cnt2=0;clk_out=0;end else if(cnt17)/9分频7次 begin if(cnt28)/9分频的前8个脉冲的处理 begin cnt2=cnt2+1;clk_out=0;end else/处理最后一个输入脉冲 begin cnt2=0;clk_out=1;cnt1=cnt1+1;end end,模为9.3的小数分频,else if(cnt110)begin if(cnt29)/10分频的前9个脉冲处理 begin cnt2=cnt2+1;clk_out=0;end else begin cnt2=0;clk_out=1;if(cnt1=9)cnt1=0;else cnt1=cnt1+1;end endendendmodule,习题10-3“1001”二进制序列检测器,S0,S1,S2,S3,1/0,0/0,0/0,0/0,1/1,1/0,1/0,0/0,RESET,module wytest(reset,clk,in,out);input reset,clk,in;output out;reg out;reg1:0 state,next_state;parameter s0=2d0,s1=2d1,s2=2d2,s3=2d3;always(posedge clk)begin if(!reset)state=s0;else state=next_state;endalways(state or in)case(state)s0:if(in=1)next_state=s1;else next_state=s0;s1:if(in=0)next_state=s2;else next_state=s1;s2:if(in=0)next_state=s3;else next_state=s1;s3:if(in=1)next_state=s1;else next_state=s0;default:next_state=s0;endcase,always(state or in)case(state)s0:if(in=1)out=0;else out=0;s1:if(in=0)out=0;else out=0;s2:if(in=0)out=0;else out=0;s3:if(in=1)out=1;else out=0;default:out=0;endcaseendmodule,