在线咨询 切换到宽版
eetop公众号 创芯大讲堂 创芯人才网

 找回密码
 注册

手机号码,快捷登录

手机号码,快捷登录

搜全文
查看: 11936|回复: 9

[求助] 帮我看下这个二级流水线加法器有什么问题?

[复制链接]
发表于 2011-6-21 01:02:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

×
本帖最后由 418478935 于 2011-6-21 01:05 编辑

我仿照王金明的那本书的例子做了一个二级流水线的十六进制加法器,
可是为什么会有这样的问题:就是最后的输出时,进位始终为0,请各位高手帮我看下,
多谢各位了   ,下面是代码


module adder16(a,b,cin,clk,sum,cout);
  input[15:0] a,b;
  input cin;
  input clk;
  output[15:0] sum;
  output cout;
  reg[15:0] sum;
  reg cout;
  
  reg[15:0] temp_a,temp_b;
  reg temp_cin;
  reg[7:0] first_sum;
  reg first_cout;
  reg[7:0] first_a,first_b;
  
  
  always @(posedge clk)
  begin
    temp_a<=a;temp_b<=b;temp_cin<=cin;
  end
  
  always @(posedge clk)
  begin
    {first_cout,first_sum}<=temp_a[7:0]+temp_b[7:0]+temp_cin;
     first_a<=temp_a[15:8];
     first_b<=temp_b[15:8];
  end
  
  always @(posedge clk)
  begin
    {cout,sum}<={first_a+first_b+first_cout,first_sum};
  end
endmodule


QQ截图未命名.jpg
发表于 2011-6-21 08:56:24 | 显示全部楼层
左端赋值,使用{A,B}。
回复 支持 反对

使用道具 举报

发表于 2011-6-21 09:43:43 | 显示全部楼层




    很明显,你最后一个赋值的右边有错。 你在整个等式右边加一个大括号有什么用?这不就相当于4=(2 + 2 )吗?
回复 支持 反对

使用道具 举报

发表于 2011-6-21 10:56:00 | 显示全部楼层
{cout,sum}<={first_a+first_b+first_cout,first_sum};
这个地方位宽不对,左边17bit,右边16bit,等于没有对高位“cout”赋值;同样的问题存在于first_cout。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-6-21 11:19:47 | 显示全部楼层


   
{cout,sum}
rvnistelrooy 发表于 2011-6-21 10:56




     {first_cout,first_sum}<=temp_a[7:0]+temp_b[7:0]+temp_cin;

我理解的是,temp_a[7:0]和temp_b[7:0]都是8位的,加起来不就9位了吗
请指教
回复 支持 反对

使用道具 举报

发表于 2011-6-21 11:27:01 | 显示全部楼层


   
{first_cout,first_sum}
418478935 发表于 2011-6-21 11:19



从电路角度思考,verilog课程上应该都会强调这一点。
右边的寄存器位宽不够,进位位是无法保存并赋值到左边的。
这几个地方改一下应该就可以了(仅供参考)。
reg[8:0] first_a,first_b;
{first_cout,first_sum}<={1'b0,temp_a[7:0]}+{1'b0,temp_b[7:0]}+temp_cin;
first_a<={1'b0,temp_a[15:8]};
first_b<={1'b0,temp_b[15:8]};
回复 支持 反对

使用道具 举报

发表于 2011-6-21 11:38:48 | 显示全部楼层
always @(posedge clk)
  begin
    {cout,sum}<={first_a+first_b+first_cout,first_sum};
  end
右边是不能用大括号的 ,这个相当于把16位的数据给到17位,所以最高位始终是0.
右边用了大括号 就相当于右边只有16bit了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-6-21 12:23:44 | 显示全部楼层


   
从电路角度思考,verilog课程上应该都会强调这一点。
右边的寄存器位宽不够,进位位是无法保存并赋值到 ...
rvnistelrooy 发表于 2011-6-21 11:27




    十分感谢,对于我这种初学者来说,从电路的角度思考,听起来很容易,但是写起程序不经意间就忘了。
    会了以后看这个模块可能十分简单,但是这个蕴含的思想,我还得好好消化。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-6-21 12:26:02 | 显示全部楼层


   
always @(posedge clk)
  begin
    {cout,sum}
louisesunjie 发表于 2011-6-21 11:38




    多谢了,以后不会犯同样的错误了,
   总结一句话,王金明的书害人呀,他书里流水线加法器就是这么用大括号的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-6-21 12:27:22 | 显示全部楼层


   
很明显,你最后一个赋值的右边有错。 你在整个等式右边加一个大括号有什么用?这不就相当于4=(2 ...
dlb05061131 发表于 2011-6-21 09:43




    多谢,我知道错在哪里了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


手机版| 小黑屋| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-9-15 04:35 , Processed in 0.019348 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表