求助:verilog语言编写加法
答案:2 悬赏:50 手机版
解决时间 2021-02-05 17:00
- 提问者网友:兔牙战士
- 2021-02-05 03:39
两个实数-1.25跟0.5相加,得到的-0.75,在端口输出...
最佳答案
- 五星知识达人网友:人间朝暮
- 2021-02-05 04:17
使用补码相加,代码如下,供参考。
input a_neg, b_neg; //a数据的符号,b数的符号。1为负数。
input [7:0] an_in, bn_in; //加数的整数
input [7:0] ad_in, bd_in; //加数的小数
output reg [7:0] cn_out, cd_out; //加结果
output c_neg; //结果的符号。
reg [8:0] an_comp, ad_comp, bn_comp, bd_comp; //a和b的补码
wire [8:0] cn_add, cd_add; //
always@(*)
begin
if (a_neg) //a的补码
begin
an_comp[8] = 1'b1;
an_comp[7:0] = ~an_in[7:0] + 1'b1;
ad_comp[8] = 1'b1;
ad_comp[7:0] = ~ad_in[7:0] + 1'b1;
end
else
begin
an_comp[8:0] = {1'b0, an_in[7:0]};
ad_comp[8:0] = {1'b0, ad_in[7:0]};
end
if (b_neg) //b的补码
begin
bn_comp[8] = 1'b1;
bn_comp[7:0] = ~bn_in[7:0] + 1'b1;
bd_comp[8] = 1'b1;
bd_comp[7:0] = ~bd_in[7:0] + 1'b1;
end
else
begin
bn_comp[8:0] = {1'b0, bn_in[7:0]};
bd_comp[8:0] = {1'b0, bd_in[7:0]};
end
end
//加法
assign cd_add = ad_comp + bd_comp;
assign cn_add = an_comp + bn_comp + cd_add[8];
assign c_neg = cn_add[8];
//补码转回二进制码
always@(*)
if (c_neg)
begin
cn_out = ~(cn_add[7:0] - 8'b1);
cd_out = ~(cd_add[7:0] - 8'b1);
end
else
begin
cn_out = cn_add[7:0];
cd_out = cd_add[7:0];
end
input a_neg, b_neg; //a数据的符号,b数的符号。1为负数。
input [7:0] an_in, bn_in; //加数的整数
input [7:0] ad_in, bd_in; //加数的小数
output reg [7:0] cn_out, cd_out; //加结果
output c_neg; //结果的符号。
reg [8:0] an_comp, ad_comp, bn_comp, bd_comp; //a和b的补码
wire [8:0] cn_add, cd_add; //
always@(*)
begin
if (a_neg) //a的补码
begin
an_comp[8] = 1'b1;
an_comp[7:0] = ~an_in[7:0] + 1'b1;
ad_comp[8] = 1'b1;
ad_comp[7:0] = ~ad_in[7:0] + 1'b1;
end
else
begin
an_comp[8:0] = {1'b0, an_in[7:0]};
ad_comp[8:0] = {1'b0, ad_in[7:0]};
end
if (b_neg) //b的补码
begin
bn_comp[8] = 1'b1;
bn_comp[7:0] = ~bn_in[7:0] + 1'b1;
bd_comp[8] = 1'b1;
bd_comp[7:0] = ~bd_in[7:0] + 1'b1;
end
else
begin
bn_comp[8:0] = {1'b0, bn_in[7:0]};
bd_comp[8:0] = {1'b0, bd_in[7:0]};
end
end
//加法
assign cd_add = ad_comp + bd_comp;
assign cn_add = an_comp + bn_comp + cd_add[8];
assign c_neg = cn_add[8];
//补码转回二进制码
always@(*)
if (c_neg)
begin
cn_out = ~(cn_add[7:0] - 8'b1);
cd_out = ~(cd_add[7:0] - 8'b1);
end
else
begin
cn_out = cn_add[7:0];
cd_out = cd_add[7:0];
end
全部回答
- 1楼网友:平生事
- 2021-02-05 04:31
用verilog hdl 改成vhdl 就可以了 用状态机写的
module sell(one_dollar,half_dollar,
collect,half_out,dispense,reset,clk);
parameter idle=0,one=2,half=1,two=3,three=4;
//idle,one,half,two,three为中间状态变量,代表投入币值的几种情况
input one_dollar,half_dollar,reset,clk;
output collect,half_out,dispense;
reg collect,half_out,dispense;
reg[2:0] d;
always @(posedge clk)
begin
if(reset)
begin
dispense=0; collect=0;
half_out=0; d=idle;
end
case(d)
idle:
if(half_dollar) d=half;
else if(one_dollar)
d=one;
half:
if(half_dollar) d=one;
else if(one_dollar)
d=two;
one:
if(half_dollar) d=two;
else if(one_dollar)
d=three;
two:
if(half_dollar) d=three;
else if(one_dollar)
begin
dispense=1; //售出饮料
collect=1; d=idle;
end
three:
if(half_dollar)
begin
dispense=1; //售出饮料
collect=1; d=idle;
end
else if(one_dollar)
begin
dispense=1; //售出饮料
collect=1;
half_out=1; d=idle;
end
endcase
end
endmodule
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯