Verilog常用运算符及表达式

您所在的位置:网站首页 亚马逊删除商品和报价24小时 Verilog常用运算符及表达式

Verilog常用运算符及表达式

2024-04-19 15:13| 来源: 网络整理| 查看: 265

本文详细介绍了Verilog常用的运算符和表达式,特别是分享了处理“计算位宽溢出”和“负数”的可行方式,帮助读者更加轻松地理解和掌握Verilog语言的运算符。

一、常见运算符以及表达式算数运算符:加(+)、减(-)、乘(*)、除(/)、取余(%)赋值运算符:非阻塞赋值(=)、阻塞赋值()、小于(=)、小于等于(三、常见问题和误区1、位宽溢出问题

加法和乘法的计算结果需要扩展位宽,如果定义的结果变量位宽未做扩展,则计算结果将丢失最高位,导致结果异常。

简单处理办法:结果赋值的寄存器或wire的位宽引入进位即可。

module test ( input clk, output reg [7:0] a,c,d, output reg [8:0] b ); ​ reg [7:0] d0= 8'd145, d1= 8'd128; ​ always @ (posedge clk) begin a 1; end ​ endmodule

说明:

a 1,表达式中多了一个未声明位宽的常数0,其默认位宽为32bit,这样加法的中间结果便不会丢掉进位。

2、负数问题

表达式中如果有一个操作数是“负数”,整个表达式的运算需要特别考虑,其实处理起来也很简单。

(1)如果只涉及到加法和减法,负数与表达式中最大操作数的位宽必须保持一致,如下处理:

reg [8:0] a = -128; reg [9:0] b = 512; reg [9:0] c; reg [10:0] d; ​ assign c = {a[8], a} + b; assign d = {{2{a[8]}}, a} - {a[9], a}};

(2)如果涉及乘法,则将负数转换为绝对值与符号位。

reg [8:0] a = -128; reg [9:0] b = 512; reg [17:0] c_abs; reg [18:0] c; reg a_sign; reg [7:0] a_abs; ​ assign a_sign = a[8]; assign a_abs = a[8] ? (~a[7:0] + 1'b1) : a[7:0]; assign c_abs = a_abs*b; assign c = a_sign ? (~{1'b0, c_abs} + 1'b1') : {1'b0, c_abs};

本文将不断定期更新中,点⭐️赞,收⭐️藏一下,不走丢哦

本文由FPGA入门到精通原创,有任何问题,都可以在评论区和我交流哦

@FPGA入门到精通,github开源代码:“FPGA知识库”

您的支持是我持续创作的最大动力!如果本文对您有帮助,请给一个鼓励,谢谢。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3