verilog全加器、全减器和乘法器及溢出判断

全加器

转自:https://www.cnblogs.com/SYoong/p/5917296.html

先以一位全加器为例:Xi、Yi代表两个加数,Cin是地位进位信号,Cout是向高位的进位信号。列表有:

  Xi    Yi   CinSumCout
00000
00110
01010
01101
10010
10101
11001
11111

    

          由左边表格可知:

                         Sum=X’Y'Cin+X'YCin'+XY'Cin'+XYCin=X'(Y⊕Cin)+X(Y⊙Cin)=X'(Y⊕Cin)+X(Y⊕Cin)'=X⊕Y⊕Cin

                              Cout=X’YCin+XYCin'+XY'Cin+XYCin=XY+(X⊕Y)Cin

                  如果取:P=X⊕Y ;   G=XY

                     那么:Sum=P⊕Cin     Cout=PCin+G

 

 

 

图中对Cout的公式进行了,即Cout'=(AB)'(PCin)'=(AB)'((A⊕B)Cin)'

 下面是全加器的门级Verilog语言描述:

module Fadd(x,y,Cin,Cout,Sum);
  input x,y,Cin;
  output Cout,Sum;
  wire a,b,c;

xor xor1(a,x,y);
xor2(Sum,a,Cin);
and and1(b,x,y);
and2(c,Cin,a);
or or1(Cout,b,c);

endmodule

 全加器的行为描述:

1 module add(x,y,Cin,Sum,Cout);
2   input   x,y,Cin;
3   output  Sum,Cin;
4   assign Sum=x^y^Cin;
5   assign Cout=x&y+(x^y)&Cin;
6 endmodule
View Code
module add_N(x,y,Cin,Cout,Sum);
  input  x,y,Cin;
  output  Sum,Cout;
  assign  {Cout,Sum}=x+y+Cin;
endmodule

利用行为级描述的Verilog全加器可以很简单的扩展成4位或者16位等全加器:

module add_4(x,y,Cin,Cout,Sum);
  input [3:0]x,y;
  input Cin;
  output [3:0]Sum;
  output  Cout;
  assign  {Cout,Sum}=x+y+Cin;
endmodule
module add_N(x,y,Cin,Cout,Sum);
  input [N-1:0]x,y;
  input  Cin;
  output [N-1:0]Sum;
  output  Cout;
  assign  {Cout,Sum}=x+y+Cin;
endmodule

 

全减器

https://blog.csdn.net/qq_43483403/article/details/103473593
https://baike.baidu.com/item/%E5%85%A8%E5%87%8F%E5%99%A8/2084280?fr=aladdin

加法溢出判断

补码加法运算溢出判断三种方法:
(1) 两个符号相同的补码数相加,如果和的符号与加数的符号相反,或两个符号相反的补码数相减,差的符号与减数的符号相同,都属于运算结果溢出。这种判别方法比较复杂,要区别加还是减两种不同运算情况,还要检查结果的符号与其中一个操作数的符号的同异,故很少使用;
(2)** 两个补码数相加减时,若最高数值位向符号位送的进位值与符号位送向更高位的进位值不相同,也是运算结果溢出。
(3) 在采用双符号位(如定点小数的模4补码)运算时,若两个符号位的得值不同(01或10)则是溢出。01表明两个正数相加,结果大于机器所能表示的最大正数,称为"上溢";10表明两个负数相加,结果小于机器所能表示的最小负数,称为"下溢";双符号位的高位符号位,不管结果溢出否,均是运算结果正确的符号位,这个结论在乘法运算过程中是很有实际意义的。请注意,在采用双符号位的方案中,在寄存器和内存储器存储数据时,只需存一位符号,双符号位仅用在加法器线路部分。 再次强调,这三种不同说法是对同一个事实的略有区别的表述,实现时用到的线路可以有所区别,但问题的实质是完全一样的。

乘法器

https
😕/blog.csdn.net/dongdongnihao_/article/details/79583425

### 实现Verilog中的乘法运算 在FPGA设计中,乘法运算是常见且重要的基础操作之一[^1]。通过使用Verilog语言可以方便地实现这一功能。 #### 无符号二进制数的乘法运算 对于无符号二进制数而言,其乘法规则遵循基本算术逻辑。当执行两个n位宽的操作数相乘时,结果将是最多2n位宽度的结果。为了简化硬件资源消耗,在某些情况下可以选择截断高位或低位来减少输出数据路径长度[^2]。 ```verilog // Example of unsigned binary multiplication in Verilog module mul_unsigned ( input [N-1:0] a, input [M-1:0] b, output reg [(N+M)-1:0] product ); always @(*) begin product = a * b; end endmodule ``` #### 有符号二进制数的乘法运算 处理带符号整数时,则需考虑正负号的影响以及可能产生的溢出情况。通常采用补码形式表示负数值,并按照特定规则完成最终积值计算过程中的符号扩展调整工作。 ```verilog // Example of signed binary multiplication in Verilog module mul_signed ( input signed [N-1:0] a, input signed [M-1:0] b, output reg signed [(N+M)-1:0] product ); always @(*) begin product = a * b; end endmodule ``` #### 移位与常量乘法优化 针对固定系数(即常量)参与的乘法场景下,可利用移位指令代替部分实际乘法器电路结构以达到节省面积的目的。例如要将某变量扩大八倍只需简单向左移动三位即可达成目标[^4]。 ```verilog wire [WIDTH+LOG_MULT-1:0] result; // LOG_MULT is log base 2 of the multiplier (e.g., 3 for multiplying by 8) assign result = {input_signal, {(LOG_MULT){1'b0}}} when performing left shift. ``` #### 动态控制下的乘法流程管理 考虑到复杂应用场景的需求变化,有时还需要引入额外的状态机或者条件判断语句用于指导整个乘法进程的发展方向。比如依据当前状态决定是否继续推进下一步骤或是重新加载初始参数等动作[^3]。 ```verilog if(mult_valid == 1) begin // Shift right one bit position during each cycle while valid flag asserted elseif((mult_valid != 1)&&(mult_begin == 1)) begin // Initialize with absolute value at start-up phase only once per operation endif ``` 综上所述,基于不同类型的输入源特性选择合适的方法能够有效地提高效率并降低功耗成本。同时合理运用各种技巧有助于构建更加灵活高效的算法模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值