网站备案 抽查,免费注册google账号,适合当手机主页的网站,北京王府井集团股份有限公司本文详细介绍了Verilog常用的运算符和表达式#xff0c;特别是分享了处理“计算位宽溢出”和“负数”的可行方式#xff0c;帮助读者更加轻松地理解和掌握Verilog语言的运算符。 一、常见运算符以及表达式 算数运算符#xff1a;加#xff08;#xff09;、减#xff08;… 本文详细介绍了Verilog常用的运算符和表达式特别是分享了处理“计算位宽溢出”和“负数”的可行方式帮助读者更加轻松地理解和掌握Verilog语言的运算符。 一、常见运算符以及表达式 算数运算符加、减-、乘*、除/、取余% 赋值运算符阻塞赋值、非阻塞赋值 关系运算符大于、小于、等于、不等于!、大于等于、小于等于 逻辑运算符与、或||、非! 条件运算符: 位运算符 取反~、或|、异或^、与 移位运算符左移、右移 拼接运算符位拼接{}复制{n{b}} 二、详细介绍 1、算数运算符 加、减-、乘*、除/、取余%
加法运算或者正值运算ab、a
— 减法运算或者负值运算a—b、—a
* 乘法运算a*b
/ 除法运算a/bb不能等于0
% 求余运算a%b%两侧的数据必须为整型数据b不能等于0 2、赋值运算符 阻塞赋值常用于组合逻辑例如assign语句和always(*)语句块。
wire [5:0] data0;
reg [6:0] data1;
assign data0 d6;
always(*) begindata1 d10;
end 非阻塞赋值常用于时序逻辑例如alwaysposedge clk语句块。
reg [6:0] data1;
always(posedge clk) begindata1 d10;
end 3、关系运算符 大于、小于、等于 不等于!、大于等于、小于等于
a b a小于b
a b a大于b
a b a等于b
a ! b a不等于b
a b a小于或等于b
a b a大于或等于b 4、逻辑运算符 1与 逻辑与aba和b同时为真时才为真否则为假 2或|| 逻辑或a||ba和b同时为假时才为假否则为真 3非! a为真时!a为假 5、条件运算符 条件表达式的值为真或假如果为真返回值1否则返回值2。它主要用于简化if-else语句的书写和提高代码的可读性。 条件表达式 ? 值1 : 值2 assign a (b) ? b1 : b0; 如果b为真那么a b1否则a b0。 6、位运算符 1与 对两个数的二进制形式进行“与”运算只有两个相应位的值都为1时结果才为1。 2或| 对两个数的二进制形式进行“或”运算只要有一个相应位的值为1结果就为1。 3异或^ 对两个数的二进制形式进行“异或”运算当两个相应位的值不同时结果为1否则为0。 4取反~ 对一个数的二进制形式进行取反操作即0变为11变为0。
~ 按位取反 a1001 ~a0110按位与 a1001 b0011 ab0001
| 按位或 a1001 b0101 a|b1101
^ 按位异或 a1001 b0101 a^b1100 7、移位运算符 在Verilog中有两种移位运算符 (左移位运算符) 和 (右移位运算符)。其使用方法如下an或ana是操作数n表示移动几位这两种移位运算都用0填补移出的空位。 reg [5:0] ac;reg [7:0] b;a 6b101001;b a2; 此时b8b10100100c a2; 此时c6b1010 8、拼接运算符 位拼接运算符可以把两个或多个信号的某些位拼接起来进行运算操作或者把单个信号复制多份。其使用方法如下
wire [5:0] a, b;
wire [1:0] c
wire [4:0] d;
wire [11:0] e;
assign a 6b101101;
assign b 6h111000
assign c 2h11
assign d {a[5],b[2:0],c}//即d 100011
assign e {2{b}}; //即e {b,b} 111000111000
wire aa, bb, cc, dd;
assign {aa, bb, cc, dd} 4b1011;
//即 aa 1bb 0cc 1dd 1 运算符优先级 三、常见问题和误区 1、位宽溢出问题 加法和乘法的计算结果需要扩展位宽如果定义的结果变量位宽未做扩展则计算结果将丢失最高位导致结果异常。 简单处理办法结果赋值的寄存器或wire的位宽引入进位即可。
module test
(input clk,output reg [7:0] a,c,d,output reg [8:0] b
);
reg [7:0] d0 8d145, d1 8d128;
always (posedge clk) begina d0 d1;b d0 d1;c (d0 d1) 1;d (d0 d1 0) 1;
end
endmodule 说明 a d0 d1表达式中最大位宽是8bit因此运算结果丢掉了进位得到17 b d0 d1整个表达式中最大位宽是9bit因此运算结果保留了进位得到273 c (d0 d1) 1 表达式中最大位宽只有8bit因此d0 d1的中间结果也是8bit丢掉进位后的17这样不能起到保留最高有效位的效果。 d (d0 d1 0) 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] 1b1) : a[7:0];
assign c_abs a_abs*b;
assign c a_sign ? (~{1b0, c_abs} 1b1) : {1b0, c_abs}; 本文将不断定期更新中关注收藏不走丢哦 有任何问题都可以在评论区和我交流哦 本文由FPGA入门到精通原创公众号为“FPGA入门到精通”github开源代码“FPGA知识库” 您的支持是我持续创作的最大动力如果本文对您有帮助还请多多点赞、评论和收藏。