原创 格雷码计数器

2010-7-12 20:30 1921 0 分类: FPGA/CPLD

       格雷码计数器通常用在跨时钟域的计数值转换中,对于一个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
   

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
0
关闭 站长推荐上一条 /3 下一条