格雷码&&独热码生成

简介: 格雷码&&独热码生成

一、基本原理


自然二进制码转格雷码

//自然二进制数转格雷码
module bin2gray #(
    parameter width = 4 //定义数据的位宽参数为4
    )(
    input   [width - 1 : 0]  bin,
    output  [width - 1 : 0]  gray
    );
//二进制数逻辑右移与自身进行异或逻辑运算
assign gray = (bin >> 1) ^ bin;
endmodule

格雷码转自然二进制数

//格雷码转自然二进制数
module gray2bin #(
    parameter width = 4 //定义数据的位宽参数为4
    )(
    input   [width - 1 : 0]  gray,
    output  [width - 1 : 0]  bin
);
//利用generate...for逐位循环输出最低位至次高位二进制数
genvar i;
generate
    for(i = width - 2; i >= 0; i = i - 1) begin: gray_2_bin
        assign bin[i] = bin[i + 1] ^ gray[i];  //格雷码与二进制数前一位进行异或逻辑运算
    end
endgenerate
//二进制数最高位为格雷码最高位
assign bin[width - 1] = gray[width - 1];
endmodule

二、Gray&&OneHot生成

ogcode .c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ONEHOT_MODE  (1)
#define GRAY_MODE    (2)
unsigned int binary2gray(unsigned int  n ){
  return n ^ ( n >> 1 );
}
unsigned int getbitnum(unsigned int number){
  unsigned int num = 0;
  while(number){
    number = number >> 1;
    num ++;
  }
  return num;
}
void show_onehot(int index, int total_num){
  for( int i=0;i<total_num-1-index;i++){
    printf("0");
  }
  printf("1");
  for(int i = 0 ;i<index;i++){
    printf("0");
  }
  printf("\r\n");
}
void show_gray(int num,unsigned int total_num){
  unsigned int num_bit = getbitnum((unsigned int) num);
  for( unsigned int i=0;i<total_num-num_bit;i++){
    printf("0");
  }
  int rl = num_bit -1;
  for(int i=0;i<num_bit;i++){
    printf("%d",(num>>rl ) & 0x01);
    rl--;
  }
  
  printf("\r\n");
}
void help_info(){
  printf("\r\nCreate OneHot && Gray Code !\r\n");
  printf("usage:\r\n");
  printf("  ogcode [-g] num \r\n");
  printf("  <-- both start_range and end_range should >= 0 -->\r\n");
  printf("--> -g : gray mode, default onehot mode\r\n");
  printf("--> -h/--help : help info\r\n");
}
int main(int argc ,char * argv[]){
  int  number_num;
  char work_mode ;
  
  if( argc < 2 ){
    help_info();
    return -1;
  } else if( !strcmp(argv[1],"-h") || !strcmp(argv[1],"--help") ){
    help_info();
    return -1;
  }else if( argc == 2 ){
    number_num = atoi(argv[1]);
    work_mode = ONEHOT_MODE;
  }else if( argc == 3){
    if( strcmp(argv[1],"-g") ){
      help_info();
      return -1;
    }
    number_num =atoi(argv[2]);
    work_mode = GRAY_MODE;
  }else{
    help_info();
    return -1;
  }
  if( number_num <= 0 ){
    help_info();
    return -1;
  }
  
  /************************ main function ******************************/
  if( work_mode == ONEHOT_MODE){
    printf("The num bit is %u\r\n",number_num);
    for( int i=0;i<number_num;i++){
      show_onehot(i,number_num);
    }
  }else if( work_mode == GRAY_MODE ){
    unsigned int num_bit = getbitnum((unsigned int)(number_num));
    printf("The num bit is %u\r\n",num_bit);
    for( int i=0;i<number_num;i++){
      show_gray(binary2gray((unsigned int)i),num_bit);
    }
  }else {
    printf("unknown error \r\n");
  }
  return 0;
}

命令格式

  • ogcode n 生成n个独热编码
  • ogcode -g n 生成n个格雷编码

三、在线网站

https://www.lzltool.cn/Tools/DecToGray

可以完成格雷码和10进制之间的转换。

相关文章
|
6月前
leetcode-89:格雷编码
leetcode-89:格雷编码
42 0
|
6月前
【每日一题Day127】LC1238循环码排列 | 格雷码构造 位运算
【每日一题Day127】LC1238循环码排列 | 格雷码构造 位运算
50 0
【每日一题Day127】LC1238循环码排列 | 格雷码构造 位运算
|
5月前
|
存储 人工智能 算法
每日练习——同余方程以及格雷码
每日练习——同余方程以及格雷码
34 1
|
6月前
|
缓存 NoSQL Java
你的码有我的码蠢?
你的码有我的码蠢?
43 0
|
Web App开发 编解码 数据建模
FOURCC四字符码对照表
FOURCC四字符码对照表
165 0
<<计算机网络>>差错控制---奇偶效验码/循环冗余码ORC/海明码
<<计算机网络>>差错控制---奇偶效验码/循环冗余码ORC/海明码
169 0
<<计算机网络>>差错控制---奇偶效验码/循环冗余码ORC/海明码
|
存储
5.1.2_BCD码
计算机组成原理之BCD码
169 0
力扣-89. 格雷编码
n 位格雷码序列 是一个由 2n 个整数组成的序列,其中: 每个整数都在范围 [0, 2n - 1] 内(含 0 和 2n - 1) 第一个整数是 0 一个整数在序列中出现 不超过一次 每对 相邻 整数的二进制表示 恰好一位不同 ,且 第一个 和 最后一个 整数的二进制表示 恰好一位不同 给你一个整数 n ,返回任一有效的 n 位格雷码序列 。
81 0
力扣-89. 格雷编码
|
关系型数据库 项目管理 异构计算
FPGA设计超前进位与8421-BCD码全加器
本文介绍了FPGA设计超前进位与8421-BCD码全加器
603 0
FPGA设计超前进位与8421-BCD码全加器