EDA技术与Verilog设计第六章课后习题部分答案
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
else case(in) 3'd0: out=8'b11111110; 3'd1: out=8'b11111101; 3'd2: out=8'b11111011; 3'd3: out=8'b11110111; 3'd4: out=8'b11101111; 3'd5: out=8'b11011111; 3'd6: out=8'b10111111; 3'd7: out=8'b01111111; endcase end
6-11
6-11 试编写求补码的Verilog程序,输入是带符号的8位二进 制数
module wytest(data_in,data_out); input[7:0] data_in; output[7:0] data_out; reg[7:0] data_out; //习题6-11
always@(data_in) begin if(data_in[7]) //正数负数判断,从最高是否为1来判断 data_out=((~data_in)+1)|8'h80; else data_out=data_in; end endmodule
6-13
仿真波形
6-13
module wytest(bcd_in,out); //习题6-13 input[3:0] bcd_in; output out; //assign out=(bcd_in>4)?1:0;
reg out; always@(bcd_in) if(bcd_in-4>0) out=1; else out=0; endmodule
always@(posedge clk) begin firsta[3:0]<=a[7:4]; seconda[3:0]<=a[3:0]; firstb[3:0]<=b[7:4]; secondb[3:0]<=b[3:0]; end
mul4x4 m1(outa, firsta,firstb,clk), m2(outb, seconda,firstb,clk), m3(outc, firsta,secondb,clk), m4(outd,seconda,secondb,clk);
6-15
module wytest(s1,s2,in,out); input s1; input[1:0] s2; input[2:0] in; output[7:0] out;
reg[8:0] out;
always@(s1 or s2 or in) begin if(s1==0) out<=8'hff; else if ((!s2[0])|(!s2[1])) out<=8'hff;
AXB=(A1X26+A2X24+A3X22+A4)X(B1X26+B2X24+B3X22+B4)
上式展开后,要做16次2X2的乘法,调用16次lookup函数 然后再做移位相加的处理。
7-5 编写4位并-串转换电路
module wytest(clk,rst,in,out); always@(posedge clk ) input clk,rst; begin input[3:0] in; if(rst) begin output out; i<=2'd0; reg out; out<=1'd0; reg[1:0] i; end else if(i<=3) begin out<=in[i]; i<=i+1; end end
6-11仿真波形
8A-原码表示的十进制数-10 B6-原码表示的十进制数-54 80-原码表示的十进制数128 0A----十进制数10 36-----十进制数53
6-12
6-12 编写两个四位二进制数相减的verilog程序
module wytest(opr1,opr2,out_data); //完成Opr1-opr2的运算 input[3:0] opr1,opr2; output[4:0] out_data; reg[3:0] out; reg cout; function[3:0] abs; input[3:0] data; case(data[3]) 1'b0:abs=data; 1'b1:abs=(~data)+1; //对负数求绝对值,按位取反再加1 endcase endfunction
四级流水线实现的32位加法器
//第二级流水线的输出 reg[7:0] second_sum; reg second_cout; //第二级流水线要缓存的数据 //未用的数据缓存 reg[7:0] second_a_31_24,second_a_23_16; reg[7:0] second_b_31_24,second_b_23_16; //第一级流水线计算结果缓存 reg[7:0] first_sum_1;//第一级流水线计算结果第一次缓存
always@(posedge clk) out<=(outa<<8)+(outb<<4)+(outc<< 4)+outd; endmodule
8x8乘法器实现
用另一种方法实现: 将8位数字分成4段,每段两位,那么操作数可表示如下: A=A1X26+A2X24+A3X22+A4 B=B1X26+B2X24+B3X22+B4
//第四级流水线 always@(posedge clk) begin {cout,sum[31:24]}<=third_a_31_24+third_b_31_24+third_cout; sum[23:0]<={third_sum,second_sum_1,first_sum_2}; end endmodule
//第三级流水线输出 reg[7:0] third_sum; reg third_cout; //第三级流水线要缓存的数据 //未用的数据缓存 reg[7:0] third_a_31_24; reg[7:0] third_b_31_24; //第一级、第二级流水线计算结果缓存 reg[7:0] first_sum_2;//第一级流水线计算结果第二次缓存; reg[7:0] second_sum_1;//第二级流水线计算结果第一次缓存;
6-12
always@(opr1 or opr2) case({opr1[3],opr2[3]}) 2'b00:{cout,out}=opr1-opr2; 2„b01:{cout,out}=opr1+abs(opr2);
//两个正数相减 //正数减负数,化为加 法运算 2„b10:{cout,out}=-(abs(opr1)+opr2); //负数减正数,化为加 法再取反 2„b11:{cout,out}=abs(opr2)-abs(opr1); //负数相减,化为绝 对值相减(顺序调换) endcase
Fra Baidu bibliotek
else begin out<=out+1; if(out==14) co<=1; else co<=0; end endmodule
6-16
四级流水线实现的32位加法器
module wytest(clk,a,b,sum,cout);
input[31:0] a,b; input clk; output[31:0] sum; output cout; //最后输出的结果 reg[31:0] sum; reg cout; //第一级流水线的输出 reg[7:0] fist_sum; reg first_cout; //第一级流水线要缓存的数据 //未用的数据缓存 reg[7:0] first_a_31_24,first_a_23_16,first_a_15_8; reg[7:0] first_b_31_24,first_b_23_16,first_b_15_8;
四级流水线实现的32位加法器
//第一级流水线 always@(posedge clk) begin {first_cout,fist_sum}<=a[7:0]+b[7:0]+cout; first_a_31_24<=a[31:24]; first_b_31_24<=b[31:24];
first_a_23_16<=a[23:16]; first_b_23_16<=b[23:16]; first_a_15_8<=a[15:8]; first_b_15_8<=b[15: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
endmodule
6-15
6-16
设计一个74161的电路。
6-16
注意:异步清零、同步置位
CO= Q3 Q2 Q1 Q0 CTT
6-16
module wytest(reset,load,ctt,ctp,clk,data_in,out,co);//习题6-16 input reset,load,ctt,ctp,clk; input[3:0] data_in; output[3:0] out; output co; reg[3:0] out; reg co; always@(posedge clk or negedge reset) if(!reset) begin out<=4'b0; co<=1'b0; end else if(!load) out<=data_in; else if(!ctt) out<=out; else if(!ctp) out<=out;
6-13
6-14
试编写一个实现3输入与非门的verilog程序;
module
wytest(a,o); a;
input[2:0] output
o; nand nand3(o,a[0],a[1],a[2]); endmodule
6-14
6-15
6-15 设计74138译码器电路
assign out_data={cout,out}; endmodule
6-12
6-12 仿真波形
6-13
6-13 有一个比较电路,当输入的一位BCD码 大于4时,输出1,否则输出0。 module wytest(bcd_in,out); input[3:0] bcd_in; output out; assign out=(bcd_in>4)?1:0; endmodule
四级流水线实现的32位加法器
//第三级流水线 always@(posedge clk) begin {third_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
四级流水线实现的32位加法器
8x8乘法器实现
module wytest(out,a,b,clk); input[7:0] a,b; input clk; output[15:0] out; reg[15:0] out; reg[3:0] firsta,firstb; reg[3:0] seconda,secondb; wire[7:0] outa,outb,outc,outd;
模为9的占空比50%的奇数分频