微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > verilog 笔试题 求助

verilog 笔试题 求助

时间:10-02 整理:3721RD 点击:
遇到一个不会的笔试题  求助网友
A :8bit unsigned number
B :8bit signed number (2' complementary code)
用verilog实现加法功能
欢迎讨论

将B和A按位扩展为10位(有符号位),A转换为signed表示,然后进行加法运算。



    那为何要扩展是10位? 9位不就可以了?
B为补码 补码怎么扩展? signed转换,不可以综合吧?



    将A和B的高位扩展一位相加,结果为9位有符号数。可以仿真一下


A加上符号位就是9bits,那么A加B就有可能是个10位的带符号数。
补码扩位,高位补符号位,再相加,结果是补码(有符号)。



    那是理论看上去的样子,两个八位无符号数相加最大的结果也才是九位数。另一个数是有符号数,那结果就更不好超过九位了。


你没把符号位算进去吧。

考虑两个极端
A=255,B=127,A+B=385
A=0,B=-128, A+B=-128
所以9位有符号数足够了


9位有符号数表示的范围是: -256到255。

385用几位表示?符号位不要了?



   说得很对,顶你的ID!



   

assign sum = {1'b0, a[7:0]} + {b[7], b[7:0]};

9位就够了,

10楼正解。

wire [9:0] sum = {1'b0,A} + {B[7],B};
sum output 10bit signed number

要十位

我不知道大家怎么计算的。我这边查了dc的user guide:“hdl compiler for verilog" 2011版。里面的介绍是有符号和无符号数字的相加是把有符号数转换成无符号数字做处理的,并且如果有符号数位宽比无符号数位宽低的话,高位添0!
我用vcs+v2k做了以下实验:
reg signed [3:0] a;
reg [7:0] b;
reg signed [7:0] c0;
reg signed [8:0] c1;
reg [7:0] d0;
reg [8:0] d1;
assign c0 = a + b;
assign c1 = a + b;
assign d0 = a + b;
assign d1 = a + b;
initial
  begin
      a = 4'sb1111;
      b = 8'b1111_1111;
  end
结果为: a=-1, b=255, c0=14, c1=-242, d0=14, d1=270.
也就是说: a被当成无符数处理了,并且是{4'd0, 4'b1111}。
然后我把上面代码"reg [7:0] b"改为"reg signed [7:0] b"(b的赋值改不改结果一样)。
结果为:a=-1, b=-1, c0=-2, c1=-2, d0=254, d1=510.
也就是说:a被当成有符号数处理了,并且是{4'b1111, 4'b1111},高位添1!
所以我觉得小编的加法器直接用个正常的加法器就可以了。除非他表示虽然A是一个无符号数,但是希望当做有符号数做处理。也就是说,实现一个有符号位的加法器。

顶LS一个

1、无符号数和有符号数相加,结果肯定是有符号数
2、相加后的有符号数的位宽为,两个相加数的最大位宽+2,注意有符号数不包括符号位
比如小编的题目:
reg [7:0] A; reg signed [7:0] B;
reg [9:0] sum;
always @(*)
   if(B[7])  //negative
      sum = {2'b00, A} + {2'b11, B}
   else  //positive
      sum = {2'b00, A} + {2'b00, B}

楼上貌似正解

if(B[7])  //negative
      sum = {2'b00, A} + {2'b11, B}
B要取补码吧。



     无符号数的补码是它本身

1. 有符号数和无符号数相加,结果为什么肯定是有符号数?请问您是怎么确定的呢?
2. “有符号数不包括符号位”?那还叫有符号数?8位的有符号数代表的范围为-128~+127。8位的无符号数代表的范围是0~+255,都是代表256个数,为什么有符号数就不包括符号位呢?那么有符号数和它的符号位一起我们应该如何称呼?-----------------------
always @(*)
   if(B[7])  //negative
      sum = {2'b00, A} + {2'b11, B}
   else  //positive
      sum = {2'b00, A} + {2'b00, B}

既然8位有符号数不包括符号位,那么为什么要用B[7]位来判断B是否为负数呢?如果B[7]是符号位,那么结果只用9位就可以了,不用10位,因为9位已经可以表示-128~+382了。

如有异议,欢迎讨论。

我觉得是这样的,用9位的话,你得自己判断最高位是不是符号位,但是用10位的话则不需要这个步骤。

wire signed [9:0] = $signed(a) + b;

这么简单的问题
无符号数要扩展符号位到有符号数 所以 wire [8:0] signed_a={1'b0,a};
有符号数要本身最高位即是符号位 但是两数相加 所以 wire [8:0] expand_b = {b[7], b};
wire [9:0] c_tmp = {signed_a[8],signed_a} + {expand_b[8],expand_b};

    最后输出为10bit有符号数 这就是结论

对的。主要原因是要给无符号数一个符号位,所以需要多一位。
但是题目本身是有问题的,因为如果使用verilog语句S=A+B的话,A为无符号,B为有符号,B会被转成无符号,无论S是否为有符号数!这个可以查看verilog - 2001的文档,vcs文档和design compiler文档,也可以自己做一下实验。
所以如果大家的讨论要成立,则题目应该为“如何设计一个有符号数加法器,输入一个为有符号数,一个为无符号数,结果为有符号数”。
如果只是说“设计一个加法器,实现有符号数和无符号数相加”那么当成无符号数处理才是符合事实的。虽然我觉得考官会觉得有符号数加法器才是对的。哎~现在的人出题一点都不严谨。

嗯嗯,应该加一位做符号位

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top