格雷码计数器通常用在跨时钟域的计数值转换中,对于一个4位的计数器,二进制码和格雷码的数值对应关系如下表
十进制数 | 自然二进制数 | 格雷码 |
0 | 0000 | 0000 |
1 | 0001 | 0001 |
2 | 0010 | 0011 |
3 | 0011 | 0010 |
4 | 0100 | 0110 |
5 | 0101 | 0111 |
6 | 0110 | 0101 |
7 | 0111 | 0100 |
8 | 1000 | 1100 |
9 | 1001 | 1101 |
10 | 1010 | 1111 |
11 | 1011 | 1110 |
12 | 1100 | 1010 |
13 | 1101 | 1011 |
14 | 1110 | 1001 |
15 | 1111 | 1000 |
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
格雷码和二进制码的逻辑关系为
bin[0] = gray[3] ^ gray[2] ^ gray[1] ^ gray[0]
bin[1] = gray[3] ^ gray[2] ^ gray [1]
bin[2] = gray[3] ^ gray[2]
bin[3] = gray[3]
用另一种方法来表示这些等式为
bin[0] = gray[3] ^ gray[2] ^ gray[1] ^ gray[0]
bin[1] = 1'b0 ^ gray[3] ^ gray[2] ^ gray[1]
bin[2] = 1'b0 ^ 1'b0 ^ gray[3] ^ gray[2]
bin[3] = 1'b0 ^ 1'b0 ^ 1'b0 ^ gray[3]
根据以上表达式的规律,可以得到格雷码到二进制码的参数化的转换电路,如下表示
.......
parameter size = 4;
output [size-1:0] bin;
input [size-1:0] gray;
reg [size-1] bin;
integer i;
always@ (gray)
for (i=0;i<size;i=i+1)
bin = ^ (gray>>i);
....
下面一段代码是参数化的二进制码--格雷码转换电路
module bin2gray (gray,bin);
parameter size = 4;
output [size-1:0] gray;
input [size-1:0] bin;
assign gray = (bin>>1) ^ bin;
endmodule
下面是参数化的格雷码计数器的verilog 代码
module graycntr (gray,bin,clk,inc,rst_n);
parameter size="4";
output [size-1:0] gray,bin;
input clk,inc,rst_n;
reg [size-1:0] gnext,gray,bnext,bin;
integer i;
always @(posedge clk or negedge rst_n)
if(!rst_n)
gray<=0;
else
gray <= gnext;
always @(gray or inc) begin
for (i=0;i<size;i=i+1)
bin = ^(gray>>i);
bnext="bin"+inc;
gnext = (bnext>>1)^bnext;
end
endmodule
文章评论(0条评论)
登录后参与讨论