EDA技术与Verilog设计第六章课后习题部分答案
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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) 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;
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;
module wytest (RESET,CLK,COUT); input CLK,RESET; output COUT; reg[3:0] m,n; wire COUT; reg COUT1,COUT2;
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;
module wytest(bcd_in,out); input[3:0] bcd_in; output out; assign out=(bcd_in>4)?1:0;
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;
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)
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
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;
endmodule
6-15
6-16
6-16 设计一个74161的电路。 注意:异步清零、同步置位 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;
first_sum_2<=first_sum_1; second_sum_1<=second_sum;
end
//第四级流水线 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[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)
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); //负数减正数,化为加
begin
if(data_in[7])
//正数负数判断,从最高是否为1来判断
data_out=((~data_in)+1)|8'h80;
else
data_out=data_in;
end
endmodule
6-11仿真波形
8A-原码表示的十进制数-10 B6-原码表示的十进制数-54 80-原码表示的十进制数128
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
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
模为9的占空比50%的奇数分频
reg out; always@(bcd_in) if(bcd_in-4>0) out=1; else out=0; endmodule
6-13
6-14
试编写一个实现3输入与非门的verilog程序;
module wytest(a,o);
input[2:0] a; output o; nand nand3(o,a[0],a[1],a[2]); endmodule
6-14
6-15
6-15 设计74138译码器电路
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;
//第三级流水线输出 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位加法器
//第二级流水线的输出 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) 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];
endmodule
end
8x8乘法器实现
用另一种方法实现: 将8位数字分成4段,每段两位,那么操作数可表示如下: A=A1X26+A2X24+A3X22+A4 B=B1X26+B2X24+B3X22+B4
四级流水线实现的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];
四级流水线实现的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;
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 )
out<=out;
else if(!ctp)
out<=out;
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);
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<=(outa<<8)+(outb<<4)+(outc<< 4)+outd;
法再取反
2‘b11:{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。
first_sum_1<=fist_sum;
end
四级流水线实现的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;
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;
module wytest (RESET,CLK,COUT); input CLK,RESET; output COUT; reg[3:0] m,n; wire COUT; reg COUT1,COUT2;
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;
module wytest(bcd_in,out); input[3:0] bcd_in; output out; assign out=(bcd_in>4)?1:0;
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;
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)
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
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;
endmodule
6-15
6-16
6-16 设计一个74161的电路。 注意:异步清零、同步置位 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;
first_sum_2<=first_sum_1; second_sum_1<=second_sum;
end
//第四级流水线 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[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)
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); //负数减正数,化为加
begin
if(data_in[7])
//正数负数判断,从最高是否为1来判断
data_out=((~data_in)+1)|8'h80;
else
data_out=data_in;
end
endmodule
6-11仿真波形
8A-原码表示的十进制数-10 B6-原码表示的十进制数-54 80-原码表示的十进制数128
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
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
模为9的占空比50%的奇数分频
reg out; always@(bcd_in) if(bcd_in-4>0) out=1; else out=0; endmodule
6-13
6-14
试编写一个实现3输入与非门的verilog程序;
module wytest(a,o);
input[2:0] a; output o; nand nand3(o,a[0],a[1],a[2]); endmodule
6-14
6-15
6-15 设计74138译码器电路
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;
//第三级流水线输出 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位加法器
//第二级流水线的输出 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) 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];
endmodule
end
8x8乘法器实现
用另一种方法实现: 将8位数字分成4段,每段两位,那么操作数可表示如下: A=A1X26+A2X24+A3X22+A4 B=B1X26+B2X24+B3X22+B4
四级流水线实现的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];
四级流水线实现的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;
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 )
out<=out;
else if(!ctp)
out<=out;
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);
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<=(outa<<8)+(outb<<4)+(outc<< 4)+outd;
法再取反
2‘b11:{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。