||
格雷码有两个作用:
一是消除多个比特同时变化带来的潜在竞争与冒险.
二是降低功耗(翻转次数减少)。在状态机中通常为了简单起见表示现态与次态的状态参数并不使用格雷码而是二进制码,因为一个状态的变化可能是发散的而非单向的,就是说不同的条件对应不同的次态,这个时候用格雷码对状态进行编码达不到一次只变化一位的目的,除非在特殊情况下,即状态机的变化是单向的,总是由S0到S1,再到S2,等等,这个时候用格雷码就能达到原来的目的。
CPLD程序如下
module gray_cntr (
clk
, reset_
, inc // 输入pulse,每一个pulse,counter + 1
, gray
);
input clk;
input reset_;
input inc;
output [3:0] gray;
reg [3:0] gray; // gray counter
reg polarity; // polarity of gray counter bits
always @( posedge clk or negedge reset_ ) begin
if ( !reset_ ) begin
polarity <= 1'b0;
gray <= 0;
end else if ( inc ) begin // allows clock gating
polarity <= !polarity;
gray <= { gray[3]^(polarity&~gray[1]&~gray[0]),
gray[2]^(polarity&gray[1]&~gray[0]),
gray[1]^(polarity&gray[0]),
gray[0]^(~polarity) };
end
end
endmodule