相邻的格雷码之间只有一位不同,在跨时钟域里可以减少亚稳态的出现。
格雷码转化为二进制码:
法则是保留格雷码的最高位作为二进制的最高位,二进制的次高位是二进制的最高位于格雷码的此高位异或所得,以此类推。
integer i;
always@(*) begin
for(i=0;i<=3;i=i+1) begin
bin[i]=^(gray>>i);
end
end
二进制转化为格雷码:
gray = bin^(bin>>1);
实现4bit位宽的格雷码计数器。
电路的接口如下图所示。
`timescale 1ns/1ns
/*
code分为两部分,格雷码转化为二进制,二进制计数,二进制转化为格雷码
*/
module gray_counter(
input clk,
input rst_n,
output reg [3:0] gray_out
);
reg cnt_1;
reg [3:0] cnt;
wire [3:0] gray;
//assign gray = cnt^(cnt>>1);
always @(posedge clk or negedge rst_n) begin
if(~rst_n) begin
cnt <= 'b0;
cnt_1 <= 1'b0;
end
else begin
cnt_1 <= ~cnt_1;
cnt <= cnt_1?(cnt+1'b1):cnt;
end
end
always @(*) begin
gray_out=cnt^(cnt>>1);
end
endmodule