题解 | #格雷码计数器#
格雷码计数器
http://www.nowcoder.com/practice/311754bcd45d42eb8d981eeddbdf1e43
1. 代码
`timescale 1ns/1ns module gray_counter( input clk, input rst_n, output reg [3:0] gray_out ); reg [4:0] cnt_bin; always @ (posedge clk&nbs***bsp;negedge rst_n) begin if( ~rst_n ) begin cnt_bin <= 5'b0; end else begin cnt_bin <= cnt_bin + 5'b1; end end wire [3:0] bin; assign bin = cnt_bin[4:1]; always @ (gray_out, bin) begin //gray_out = bin ^ (bin>>1); gray_out[3] = bin[3]; gray_out[2] = bin[3] ^ bin[2]; gray_out[1] = bin[2] ^ bin[1]; gray_out[0] = bin[1] ^ bin[0]; end endmodule
2. 问题解析
这个题会做就行了,出的有问题,二进制计数值每2个时钟才+1。
格雷码——>二进制:
gray = bin ^ (bin>>1);
或者:
gray[最高位] = bin[最高位]; for(i=最高位;i>0;i=i-1) begin gray[i] = bin[i] ^ bin[i-1]; end最高位一致,其他位等于二进制的错位异或。