当前位置:
文档之家› 格雷码原理以及格雷码计数器verilog
格雷码原理以及格雷码计数器verilog
//格雷码转二进制 wire [data_width-1:0] bin_out; gray_to_bin gray_to_bin_1( .gray_in (gray_wire), .bin_out (bin_out) ); //二进制加一 wire [data_width-1:0] bin_add_wire; assign bin_add_wire = bin_out + 1'b1; //二进制转格雷码 wire [data_width-1:0] gray_wire; reg [data_width-1:0] gray_out; bin_to_gray bin_to_gray_1( .bin_in (bin_add_wire), .gray_out (gray_wire) );
顶层设计
module gray_counter( clk, reset_n,
// gray_in, gray_out ); parameter data_width = 4;
input clk; input reset_n; // input [data_width-1:0] gray_in; output [data_width-1:0] gray_out;
格雷码 1100 1101 1111 1110 1010 1011 1001 1000
当从 7 变为 8 时,4 位二进制数都发生跳变,这就很可能会发生亚稳态。而采用格雷码,就可以编码 4 位二进制数都同时发生跳变,导 致出现的亚稳态,就算出现亚稳态,最多也就一位出现错误。
格雷码转二进制
观察上表可知,格雷码转二进制是从左边第二位起,将每位与左边一位二进制码的值异或,作为该位二进制码后的值(最左边一位依然不 变)。
always @(posedge clk or negedge reset_n) begin if(reset_n == 1'b0) begin gray_out <= {data_width{1'b0}};
end else begin gray_out <= gray_wire; end end endmodule
格雷码原理与 Verilog 实现
格雷码原理
格雷码是一个叫弗兰克*格雷的人在 1953 年发明的,最初用于通信。格雷码是一种循环二进制码或者叫作反射二进制码。格雷码的特点 是从一个数变为相邻的一个数时,只有一个数据位发生跳变,由于这种特点,就可以避免二进制编码计数组合电路中出现的亚稳态。格雷码 常用于通信,FIFO 或者 RAM 地址寻址计数器中。 如二进制计数编码从 0 到 F 的计数过程如下:
module gray_to_bin( gray_in, bin_out ); parameter data_width = 4;
input [data_width-1:0] gray_in; output [data_width-1:0] bin_out; reg [data_width-1:0] bin_out; always @(gray_in) begin bin_out[3] = gray_in[3]; bin_out[2] = gray_in[2]^bin_out[3]; bin_out[1] = gray_in[1]^bin_out[2]; bin_out[0] = gray_in[0]^bin_out[1]; end endmodule
二进制异或(XOR),作为对应格雷码该位的值,最左边一位不变。
module bin_to_gray( bin_in, gray_out ); parameter data_width = 4;
input [data_width-1:0] bin_in; output [data_width-1:0] gray_out;
RTL 视图,与设计框图一致
十进制 0 1 2 3 4 5 6 7
二进制 0000 0001 0010 0011 0100 0101 0110 0111
格雷码 0000 0001 0011 0010 0110 0111 0101 0100
十进制 8 9 10 11 12 13 14 15
二进制 1000 1001 1010 1011 1100 1101 1110 1111
assign gray_out = (bin_in >> 1) ^ bin_in;
endmodule
格雷码计数器原理
格雷码计数器,采用三个模块进行设计,格雷码转二进制、加法器、二进制转格雷码。 格雷码转二进制将格雷码转换为二进制,并将值输出用于加法器进行加法运算,然后将加法运算结果通过二进制转格雷码转换为格雷码,最 后将格雷码进行输出,同时将结果输出到格雷码转二进制作为输入,形成一个计数功能。