HDLBits (70) — 带符号的加法溢出
高冠避役
2022年03月16日 10:00
收录于文集
共184篇

本题链接:

https://hdlbits.01xz.net/wiki/Exams/ece241_2014_q1c

假设有两个8位的补码a[7:0]和b[7:0]。将这些数字相加生成s[7:0]。此外还要计算是否发生(符号)溢出。


题目

代码块
clike
自动换行
复制代码
module top_module (
    input [7:0] a,
    input [7:0] b,
    output [7:0] s,
    output overflow
); 
复制成功

两个正数相加或两个负数相加会产生一个带正负号的溢出结果。有几种检测溢出的方法:其一可以通过比较输入和输出数字的符号来计算溢出,也可以从位n和n-1的输出中推导是否溢出。


答案

代码块
clike
自动换行
复制代码
module top_module (
    input [7:0] a,
    input [7:0] b,
    output [7:0] s,
    output overflow
); //
 	
     assign s = a + b;
     assign overflow = (a[7] == b[7] && a[7] != s[7]) ? 1 : 0;

endmodule
复制成功


输出波形


按位操作符包括:取反(~),与(&),或(|),异或(^),同或(~^)。

按位操作符对 2 个操作数的每 1bit 数据进行按位操作。

如果 2 个操作数位宽不相等,则用 0 向左扩展补充较短的操作数。

取反操作符只有一个操作数,它对操作数的每 1bit 数据进行取反操作。

下图给出了按位操作符的逻辑规则。

条件(if)语句用于控制执行语句要根据条件判断来确定是否执行。

条件语句用关键字 if 和 else 来声明,条件表达式必须在圆括号中。

条件语句使用结构说明如下:

代码块
clike
自动换行
复制代码
if (condition1)  true_statement1 ; 
else if (condition2)  true_statement2 ; 
else if (condition3)  true_statement3 ; 
else  default_statement ;
复制成功
  • if 语句执行时,如果 condition1 为真,则执行 true_statement1 ;如果 condition1 为假,condition2 为真,则执行 true_statement2;依次类推。

  • else if 与 else 结构可以省略,即可以只有一个 if 条件判断和一组执行语句 ture_statement1 就可以构成一个执行过程。

  • else if 可以叠加多个,不仅限于 1 或 2 个。

  • ture_statement1 等执行语句可以是一条语句,也可以是多条。如果是多条执行语句,则需要用 begin 与 end 关键字进行说明。

参考内容: 2.4 Verilog 表达式 | 菜鸟教程: https://www.runoob.com/w3cnote/verilog-expression.html 4.5 Verilog 条件语句 | 菜鸟教程: https://www.runoob.com/w3cnote/verilog-condition-statement.html