#学习记录#
1 verilog中~和!的区别
- !表示逻辑取反,~表示按位取反。
- 当面对位宽为1时,两个操作符的作用相同。
- 当位宽不为1时:
~会将变量的各个位依次取反:a[2:0]={1,1,0},~a={0,0,1}。
!会将变量作为一个值去处理:a[2:0]={1,1,0},a=6,!a=0; a[2:0]={0,0,0},!a=1。
2 verilog中的复制拼接
a=2'h4,b=2'h5将a,b拼接起来{a,b}=4'h45。如果要将a,b重复拼接32次,需要用到复制拼接,如下所示:
c={32{a,b}};
//等效于
c={{a,b},{a,b},{a,b}...{a,b}};
便于代码维护,定义一个parameter,如下所示:
parameter COPY_NUM = 'd32;
c={COPY_NUM{a,b}};
这里的复制次数必须为常量,不可以为变量。
3 verilog参数例化
- 参数定义parameter,如下所示:
module print#(
parameter TIMES =32)
(
input clk,
input rst_n,
output reg print_out
);
- 参数例化
ram #(
.width(16),
.depth(4)
)
ram_test(
.clk(clk),
.rst(rst)
);
在模块例化时可以使用参数传递如上所示。
4 verilog中^的用法
- 奇偶判断:a=1010,^a=1^0^1^0=0。
- 格雷码与二进制码转换
二进制码转换为格雷码:格雷码(n)=二进制码(n+1)^二进制码(n)。代码如下:
gray=(bin>>1)^bin;
格雷码转换为二进制码:二进码(n)=二进制码(n+1)^格雷码(n)。代码如下:
for(i = 0; i < n-1; i++)
b[i] = ^(gray >> i); //gray移位后按位异或
- 奇数分频
_______________________________________________________________________
会持续更新...