[转帖]Verilog的语法及generate使用
格雷码(Gray code)是由贝尔实验室的Frank Gray在1940年提出,用于在PCM(Pusle Code Modulation)方法传送讯号时防止出错,并于1953年三月十七日取得美国专利。格雷码是一个数列集合,相邻两数间只有一个位元改变,为无权数码,且格雷码的顺序不是唯一的。
直接排列
以二进制为0值的格雷码为第零项,第一项改变最右边的位元,第二项改变右起第一个为1的位元的左边位元,第三、四项方法同第一、二项,如此反覆,即可排列出n个位元的格雷码。
二进制数转格雷码
(假设以二进制为0的值做为格雷码的0)
格雷码第n位 = 二进制码第(n+1)位+二进制码第n位。不必理会进制。 Verilog 代码:gray=(binary>>1)^binary;
格雷码转二进制数
二进制码第n位 = 二进制码第(n+1)位+格雷码第n位。因为二进制码和格雷码皆有相同位数,所以二进制码可从最高位的左边位元取0,以进行计算。 verilog 代码://------假设 reg [n-1] gray,binary; integer i; for(i=0;i<=n-1;i=i+1) binary[i]= ^(gray>>i)//gray移位后,自身按位异或^(gray>>i)//第一次看到这样的用法,特意查了下verilog语法 Verilog 的位运算语法: 位逻辑运算符
在Verilog语言中有7种位逻辑运算符:
1 ~ (非)
2 & (与)
3 | (或)
4 ^ (异或)
5 ^~ (同或)
6 ~& (与非)
7 ~| (或非)
位逻辑运算符对其自变量的每一位进行操作,例如,表达式A & B的结果是A和B的对应位相与的值。对具有不定值的位进行操作,视情况而定会得到不同的结果。例如:x和FALSE相与得结果x,x和TRUE相或得结果TURE。如果操作数的长度不相等,较短的操作数将用0来补位,逐位运算将返回一个与两个操作数中位宽较大的一个等宽的值。
在此需要注意的是,不要将逻辑运算符和位运算符相混淆,比如,!是逻辑非,而~是位操作的非,即按位取反,例如:对于前者!(5 = = 6)结果是TRUE,后者对位进行操作,~{1,0,1,1} = 0100。
一元约简运算符
约简运算符是单目运算符,也有与、或、非运算。其与、或、非运算规则类似于位运算符的与、或、非运算规则,但其运算过程不同。位运算是对操作数的相应位进行与、或、非运算,操作数是几位数则运算结果也是几位数。而约简运算则不同,约简运算是对单个操作数进行与、或、非递推运算,最后的运算结果是1位的二进制数。约简运算的具体运算过程是:1°先将操作数的第1位与第2位进行与、或、非运算;2°将运算结果与第3位进行与、或、非运算,依次类推,直至最后一位。
例如:
reg [3:0] B;
reg C;
C = &B;
相当于:
C = ( (B[0]&B[1]) & B[2] ) & B[3];
一完整的模块举例如下:
module reduction(a, out1, out2, out3, out4, out5, out6);
input [3:0] a;
output out1, out2, out3, out4, out5, out6;
reg out1, out2, out3, out4, out5, out6;
always @ (a)
begin
out1 = & a; //与约简运算
out2 = | a; //或约简运算
out3 = ~& a; //与非约简运算
out4 = ~| a; //或非约简运算
out5 = ^ a; //异或约简运算
out6 = ~^ a; //同或约简运算
end
endmodule
一. 自然二进制码转换为二进制格雷码原理:若二进制码表示为: B[N-1]B[N-2]...B[2]B[1]B[0];相应地, 则二进制格雷码表示为: G[N-1]G[N-2]...G[2]G[1]G[0].其中最高位保留: G[N-1] = B[N-1];其他各位: G[i] = B[i+1] xor B[i]. (i = 0, 1, 2, ..., n-2) Binary_to_Gray.v / Verilog
module Binary_to_Gray (
input [N-1:0] B,
output reg [N-1:0] G
);
parameter N = N_bit_Binary; // 设置自然二进制码的位宽 integer i; always @ (B)
begin
G[N-1] = B[N-1];
for (i=0; i<N-1; i="i"+1)
G[i] = B[i+1] ^ B[i];
end endmodule图2. N="4" 二. 二进制格雷码转换为自然二进制码
原理:若二进制格雷码表示为: G[N-1]G[N-2]...G[2]G[1]G[0];相应地, 则二进制码表示为: B[N-1]B[N-2]...B[2]B[1]B[0].其中最高位保留: B[N-1] = G[N-1];其他各位: B[i-1] = G[i-1] xor B[i]. (i = 1, 2, ..., n-1) Gray_to_Binary.v / Verilog
module Gray_to_Binary (
input [N-1:0] G,
output reg [N-1:0] B
); parameter N = B_bit_Gray; // 设置二进制格雷码的位宽 integer i; always @ (G)
begin
B[N-1] = G[N-1];
for (i=1; i<=N-1; i="i"+1)
B[i-1] = G[i-1] ^ B[i];
end
endmodule