Verilog常用运算符及表达式 |
您所在的位置:网站首页 › 亚马逊删除商品和报价24小时 › Verilog常用运算符及表达式 |
本文详细介绍了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 |