格雷码原理与Verilog实现格雷码原理格雷码是一个叫弗兰克*格雷的人在1953年发明的,最初用于通信。格雷码是一种循环二进制码或者叫作反射二进制码。格雷码的特点是从一个数变为相邻的一个数时,只有一个数据位发生跳变,由于这种特点,就可以避免二进制编码计数组合电路中出现的亚稳态。格雷码常用于通信,FIFO或者RAM地址寻址计数器中。如二进制计数编码从0到F的计数过程如下:十进制二进制格雷码十进制二进制格雷码000000000810001100100010001910011101200100011101010111130011001011101111104010001101211001010501010111131101101160110010114111010017011101001511111000当从7变为8时,4位二进制数都发生跳变,这就很可能会发生亚稳态。而采用格雷码,就可以编码4位二进制数都同时发生跳变,导致出现的亚稳态,就算出现亚稳态,最多也就一位出现错误。格雷码转二进制观察上表可知,格雷码转二进制是从左边第二位起,将每位与左边一位二进制码的值异或,作为该位二进制码后的值(最左边一位依然不变)。modulegray_to_bin(gray_in,bin_out);parameterdata_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)beginbin_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];endendmodule二进制转格雷码从最右边一位起,依次将每一位与左边一位异或(XOR),作为对应格雷码该位的值,最左边一位不变。modulebin_to_gray(bin_in,gray_out);parameterdata_width=4;input[data_width-1:0]bin_in;output[data_width-1:0]gray_out;assigngray_out=(bin_in1)^bin_in;endmodule格雷码计数器原理格雷码计数器,采用三个模块进行设计,格雷码转二进制、加法器、二进制转格雷码。格雷码转二进制将格雷码转换为二进制,并将值输出用于加法器进行加法运算,然后将加法运算结果通过二进制转格雷码转换为格雷码,最后将格雷码进行输出,同时将结果输出到格雷码转二进制作为输入,形成一个计数功能。顶层设计modulegray_counter(clk,reset_n,//gray_in,gray_out);parameterdata_width=4;inputclk;inputreset_n;//input[data_width-1:0]gray_in;output[data_width-1:0]gray_out;//格雷码转二进制wire[data_width-1:0]bin_out;gray_to_bingray_to_bin_1(.gray_in(gray_wire),.bin_out(bin_out));//二进制加一wire[data_width-1:0]bin_add_wire;assignbin_add_wire=bin_out+1'b1;//二进制转格雷码wire[data_width-1:0]gray_wire;reg[data_width-1:0]gray_out;bin_to_graybin_to_gray_1(.bin_in(bin_add_wire),.gray_out(gray_wire));always@(posedgeclkornegedgereset_n)beginif(reset_n==1'b0)begingray_out={data_width{1'b0}};endelsebegingray_out=gray_wire;endendendmoduleRTL视图,与设计框图一致