当前位置:文档之家› EDA技术与Verilog设计第六章课后习题部分答案

EDA技术与Verilog设计第六章课后习题部分答案

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;


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
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
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




//第三级流水线输出 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;//第二级流水线计算结果第一次缓存;
四级流水线实现的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;
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
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译码器电路
模为9的占空比50%的奇数分频
四级流水线实现的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
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位加法器




//第二级流水线的输出 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;//第一级流水线计算结果第一次缓存





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;
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
四级流水线实现的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
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
相关主题