zoukankan      html  css  js  c++  java
  • 格雷码与二进制码互相转换

       参考百科:http://baike.baidu.com/link?url=mr53i-76Ue3cGMnqWwG_lam8Zfwbfhdk8JnHEHhEU0nfzpIZ8l583KdcTIahIQIoSTYtL02DpWnt4goCByUQ9a

             在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码反射码

             

    二进制码→格雷码(编码)
         此方法从对应的n位二进制码字中直接得到n位格雷码码字,步骤如下:
    1. 对n位二进制的码字,从右到左,以0到n-1编号
    2. 如果二进制码字的第i位和i+1位相同,则对应的格雷码的第i位为0,否则为1(当i+1=n时,二进制码字的第n位被认为是0,即第n-1位不变)
    公式表示
    (G:格雷码,B:二进制码)
    例如:二进制码0101,为4位数,所以其所转为之格雷码也必为4位数,因此可取转成之二进位码第五位为0,即0 b3 b2 b1 b0。
    0 xor 0=0,所以g3=0
    0 xor 1=1,所以g2=1
    1 xor 0=1,所以g1=1
    0 xor 1=1,所以g0=1
    因此所转换为之格雷码为0111
    格雷码二进制码(解码)
    从左边第二位起,将每位与左边一位解码后的值异或,作为该位解码后的值(最左边一位依然不变)。依次异或,直到最低位。依次异或转换后的值(二进制数)就是格雷码转换后二进制码的值。
    公式表示
    (G:格雷码,B:二进制码)
    原码:p[n:0];格雷码:c[n:0](n∈N);编码:c=G(p);解码:p=F(c);
    书写时按从左向右标号依次减小,即MSB->LSB,编解码也按此顺序进行
    举例:
    如果采集器器采到了格雷码:1010
    就要将它变为自然二进制:
    0 与第四位 1 进行异或结果为 1
    上面结果1与第三位0异或结果为 1
    上面结果1与第二位1异或结果为 0
    上面结果0与第一位0异或结果为 0
    因此最终结果为:1100 这就是二进制码即十进制 12

    转换不是太难:

     一、二进制码转换成格雷码:

     程序:

    /********************************Copyright**************************************                           
    **----------------------------File information--------------------------
    ** File name  :bintogry.v  
    ** CreateDate :2015.04
    ** Funtions   :二进制转格雷码
    ** Operate on :M5C06N3L114C7
    ** Copyright  :All rights reserved. 
    ** Version    :V1.0
    **---------------------------Modify the file information----------------
    ** Modified by   :
    ** Modified data :        
    ** Modify Content:
    *******************************************************************************/
     
     module  bintogry  (
               clk,
               rst_n,
               
                         databin,
                         datagry
                 );
        localparam width = 4;
     input          clk;
     input          rst_n;
     
     input  [width-1:0] databin;
     
     output [width-1:0] datagry;
     reg    [width-1:0] datagry;
     //----------------------
     reg   [0] databin_1;    /* 输入数据寄存器,扩展多一位 */
     always @(posedge clk or negedge rst_n)
     begin
      if(!rst_n)
       begin
         databin_1 <= 0;
        end
      else 
        begin
          databin_1[width-1:0] <= databin;   /* 寄存下 */    
        end
      end
        
     //---------------------------
     reg   [2:0]    state;
     reg   [width-1:0] n;
     reg            switchover;
     reg   [width-1:0] datagry_1;
     always @(posedge clk or negedge rst_n)
     begin
      if(!rst_n)
       begin
         state <= 0;
             n <= 0;
             switchover <= 0;
             datagry_1 <= 'd0;
        end
      else 
        begin
         case(state) 
                'd0:
                  begin
                         n <= 0;
                         datagry_1 <= 'd0;
                        if(databin_1[width-1:0]!= databin)    
                          state <= 'd1;
                        else 
                            state <= 'd0;
                    end
                'd1:
                     begin
                         datagry_1[width-1-n] <= databin_1[width-n]^databin_1[width-1-n];  /* 当前位与左边一位异或 */
                         state <= 'd2;    
                        end
                'd2:
                  begin
                        if(n==(width-1))
                         begin
                             n <= 0;
                             state <= 'd3;
                             switchover <= 1;
                          end
                        else 
                            begin
                                n <= n + 1;
                              state <= 'd1;                                    
                            end
                        end
                    'd3:
                      begin
                         switchover <= 0;     
                         state <= 'd0;
                        end
                    default:state <= 'd0;
                endcase
        end
      end
        
        
    always @(posedge clk or negedge rst_n)
     begin
       if(!rst_n)
         begin
          datagry <= 'd0;
          end
        else if(switchover) datagry <= datagry_1;
        else datagry <= datagry;
      end    
     
    endmodule
    View Code

    测试程序;

    /********************************Copyright**************************************                           
    **----------------------------File information--------------------------
    ** File name  :bintogry_tb.v  
    ** CreateDate :2015.04
    ** Funtions   : 测试
    ** Operate on :M5C06N3L114C7
    ** Copyright  :All rights reserved. 
    ** Version    :V1.0
    **---------------------------Modify the file information----------------
    ** Modified by   :
    ** Modified data :        
    ** Modify Content:
    *******************************************************************************/
     
     module  bintogry_tb;
     parameter width = 4;
     reg               clk;
     reg               rst_n;
     
     reg   [width-1:0] databin;
     
     wire  [width-1:0] datagry;
     
      bintogry bintogry_1 (
                                         .clk,
                                         .rst_n,
                                         
                                         .databin,
                                         .datagry
                                             );
    
    
      parameter tck = 24;
      parameter t = 1000/tck;
     
      always 
        #(t/2) clk = ~clk;
    
      initial 
          begin
              clk = 0;
                rst_n = 0;
                databin = 0;
                
                #(20*t)  rst_n = 1;
                #(20*t)  databin = 1;
                #(20*t)  databin = 2;
                #(20*t)  databin = 3;
                #(20*t)  databin = 4;
          end
        
    endmodule
    View Code

    仿真图:

    格雷码转换成二进制码:

      程序:

        

    /********************************Copyright**************************************                           
    **----------------------------File information--------------------------
    ** File name  :grytobin.v  
    ** CreateDate :2015.04
    ** Funtions   :将格雷码转化为二进制码
    ** Operate on :M5C06N3L114C7
    ** Copyright  :All rights reserved. 
    ** Version    :V1.0
    **---------------------------Modify the file information----------------
    ** Modified by   :
    ** Modified data :        
    ** Modify Content:
    *******************************************************************************/
     
      module  grytobin  (
                   clk,
                   rst_n,
                   
                             gry,
                             bin
                     );
         localparam width = 4;
         input          clk;
         input          rst_n;
         
         input   [width-1:0]  gry;
         output  [width-1:0]  bin;
         reg     [width-1:0]  bin; 
     //---------------------------
      reg   [width-1:0]  gry_1;  /* 寄存输入值 */ 
        always @(posedge clk or negedge rst_n)
         begin
          if(!rst_n)
           begin
                gry_1 <= 'd0;
            end
          else 
            begin
              gry_1 <= gry;
            end
          end 
        //--------------------------
     reg   [2:0]    state;
     reg   [width-1:0] n;
     reg            switchover;
     reg   [0] bin_1;   /* 扩展一位 */
     always @(posedge clk or negedge rst_n)
     begin
      if(!rst_n)
       begin
         state <= 0;
             n <= 0;
             switchover <= 0;
             bin_1 <= 'd0;
        end
      else 
        begin
         case(state) 
                'd0:
                  begin
                         n <= 0;
                         bin_1 <= 'd0;
                        if(gry_1[width-1:0]!= gry)    
                          state <= 'd1;
                        else 
                            state <= 'd0;
                    end
                'd1:
                     begin
                       bin_1[width-1-n] <= bin_1[width-n]^gry_1[width-1-n];  /* 当前位与上次运算结果异或 */
                         state <= 'd2;    
                        end
                'd2:
                  begin
                        if(n==(width-1))
                         begin
                             n <= 0;
                             state <= 'd3;
                             switchover <= 1;
                          end
                        else 
                            begin
                                n <= n + 1;
                              state <= 'd1;                                    
                            end
                        end
                    'd3:
                      begin
                         switchover <= 0;     
                         state <= 'd0;
                        end
                    default:state <= 'd0;
                endcase
        end
      end
        
        
    always @(posedge clk or negedge rst_n)
     begin
       if(!rst_n)
         begin
          bin <= 'd0;
          end
        else if(switchover) bin <= bin_1;
        else bin <= bin;
      end    
     
    endmodule
    
        
    View Code

    测试文件:

    /********************************Copyright**************************************                           
    **----------------------------File information--------------------------
    ** File name  :grytobin_tb.v  
    ** CreateDate :2015.04
    ** Funtions   :测试文件
    ** Operate on :M5C06N3L114C7
    ** Copyright  :All rights reserved. 
    ** Version    :V1.0
    **---------------------------Modify the file information----------------
    ** Modified by   :
    ** Modified data :        
    ** Modify Content:
    *******************************************************************************/
     module  grytobin_tb;
     parameter width = 4;
     reg               clk;
     reg               rst_n;
     
     reg   [width-1:0] gry;
     
     wire  [width-1:0] bin;
     
      grytobin  grytobin_1 (
                                         .clk,
                                         .rst_n,
                                         
                                         .gry,
                                         .bin
                                             );
    
    
      parameter tck = 24;
      parameter t = 1000/tck;
     
      always 
        #(t/2) clk = ~clk;
    
      initial 
          begin
              clk = 0;
                rst_n = 0;
                gry = 0;
                
                #(20*t)  rst_n = 1;
                #(20*t)  gry = 1;
                #(20*t)  gry = 2;
                #(20*t)  gry = 3;
                #(20*t)  gry = 4;
          end
        
    endmodule
    View Code

    仿真图:

     

  • 相关阅读:
    创建型模式(四) 单例模式
    创建型模式(三) 原型模式
    创建型模式(二) 建造者模式
    创建型模式(一) 简单工厂模式、工厂模式与抽象工厂模式
    Django15-分页功能
    Django14-Ajax删除按钮动态效果
    网络day04-配置备份、清除、密码恢复、IOS更新
    网络day03-NTP配置和SMTP配置
    网络day02-设备配置远程登录
    HTML注释
  • 原文地址:https://www.cnblogs.com/fhyfhy/p/4423934.html
Copyright © 2011-2022 走看看