格雷码(Gray code)仿真

作者:桂。

时间:2018-05-12  16:25:02

链接:http://www.cnblogs.com/xingshansi/p/9029081.html



前言

FIFO中的计数用的是格雷码,简要记录格雷码的分析思路。

一、格雷码与8421码对应关系

通过真值表分析,可以得出:

即格雷码是:8421码从最右边起,依次与左边一位异或,最左边一位不变,对应实现语言:

GrayCount_out <= {BinaryCount[COUNTER_WIDTH-1],BinaryCount[COUNTER_WIDTH-2:0] ^ BinaryCount[COUNTER_WIDTH-1:1]};

二、仿真实现

Graycounter.v:

`timescale 1ns/1ps

module GrayCounter(Enable_in, Clear_in, Clk, GrayCount_out);
parameter   COUNTER_WIDTH = 4;

output reg  [COUNTER_WIDTH-1:0]    GrayCount_out;  //‘Gray‘ code count output.

input wire  Enable_in;  //Count enable.
input wire  Clear_in;   //Count reset.
input wire  Clk;

/////////Internal connections & variables///////
reg    [COUNTER_WIDTH-1:0]         BinaryCount;

/////////Code///////////////////////

always @ (posedge Clk)
begin
    if (Clear_in) begin
        BinaryCount   <= {COUNTER_WIDTH{1‘b 0}} + 1;  //Gray count begins @ ‘1‘ with
        GrayCount_out <= {COUNTER_WIDTH{1‘b 0}};      // first ‘Enable_in‘.
    end
    else if (Enable_in) begin
        BinaryCount   <= BinaryCount + 1;
        GrayCount_out <= {BinaryCount[COUNTER_WIDTH-1],
                          BinaryCount[COUNTER_WIDTH-2:0] ^ BinaryCount[COUNTER_WIDTH-1:1]};
    end
end

endmodule

testbench:

`timescale 1ns / 1ps
module graycounter_tb;
parameter   COUNTER_WIDTH = 4;

logic clk,rst;
logic clr,en;
logic [COUNTER_WIDTH-1:0]    GrayCount_out;
initial
begin
clk = 0;
rst = 1;
#20
rst = 0;
clr <= 1;
en <= 0;
#100
clr <= 0;
en <= 1;
#2000
$stop;
end

logic [3:0] counter;

always #2 clk = ~clk;

always @(posedge clk)
begin
    if(rst | clr)
    begin
        counter <= 0;
        clr <= 1;
        en <= 0;
    end
    else
    begin
        counter <= counter + 4‘b1;
    end
end
//main
GrayCounter gray_inst(
.Enable_in(en),
.Clear_in(clr),
.Clk(clk),
.GrayCount_out(GrayCount_out)
);

endmodule

电路图看出:

主要是LUT、D触发器、DS触发器,原语实现也较为方便。

原文地址:https://www.cnblogs.com/xingshansi/p/9029081.html

时间: 2024-11-09 00:41:14

格雷码(Gray code)仿真的相关文章

格雷码(Gray Code)

https://www.yuque.com/docs/share/45ca4609-0038-4ae1-beb5-76320d5b0acd 原文地址:http://blog.51cto.com/4754569/2326827

格雷码 Gray

格雷码 Gray 格雷码定义: 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code) 格雷码的求解: 上一次求解到的Gray码, 按顺序给每一个都加上前缀0,  得到前一半,然后,将Gray码逆序,给每一个都加上前缀1就是答案. 例如: n = 1 Gray: 0 1 n = 2 00  01  (顺序 0 1) 11  10  (逆序 1 0) 具体代码 #include <bits/stdc++.h> using namespace std

位运算 格雷码 gray

题目: It is necessary to arrange numbers from 0 to 2^(N+M)-1 in the matrix with 2^N rows and 2^M columns. Moreover, numbers occupying two adjacent cells must differ only in single bit in binary notation. Cells are adjacent if they have common side. Mat

格雷码的实现

问题:产生n位元的所有格雷码. 格雷码(Gray Code)是一个数列集合,每个数使用二进位来表示,假设使用n位元来表示每个数字,任两个数之间只有一个位元值不同. 例如以下为3位元的格雷码: 000 001 011 010 110 111 101 100 . 如果要产生n位元的格雷码,那么格雷码的个数为2^n. 假设原始的值从0开始,格雷码产生的规律是:第一步,改变最右边的位元值:第二步,改变右起第一个为1的位元的左边位元:第三步,第四步重复第一步和第二步,直到所有的格雷码产生完毕(换句话说,已

[腾讯]生成格雷码

时间限制:3秒 空间限制:32768K 热度指数:24655 本题知识点: 递归 题目描述 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码. 给定一个整数n,请返回n位的格雷码,顺序为从0开始. 测试样例: 1 返回:["0","1"] 思路: class GrayCode {public:    vector<string> getGray(int

格雷码那点事——递归非递归实现

简介 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码.在数字系统中,常要求代码按一定顺序变化.例如,按自然数递增计数,若采用8421码,则数0111变到1000时四位均要变化,而在实际电路中,4位的变化不可能绝对同时发生,则计数中可能出现短暂的其它代码(1100.1111等).在特定情况下可能导致电路状态错误或输入错误.使用格雷码可以避免这种错误.格雷码有多种

腾讯生成格雷码

在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码. 给定一个整数n,请返回n位的格雷码,顺序为从0开始. 测试样例: 1 返回:["0","1"] 代码: import java.util.*; public class GrayCode {    public String[] getGray(int n) {        int m = 1<<n

产生n位元的所有格雷码

原文链接:http://blog.csdn.net/beiyeqingteng/article/details/7044471 问题:产生n位元的所有格雷码. 格雷码(Gray Code)是一个数列集合,每个数使用二进位来表示,假设使用n位元来表示每个数字,任两个数之间只有一个位元值不同. 例如以下为3位元的格雷码: 000 001 011 010 110 111 101 100 . 如果要产生n位元的格雷码,那么格雷码的个数为2^n. 假设原始的值从0开始,格雷码产生的规律是:第一步,改变最右

[编程题]生成格雷码

[编程题] 生成格雷码 腾讯在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码.给定一个整数n,请返回n位的格雷码,顺序为从0开始.测试样例:1返回:["0","1"] class GrayCode { vector<string> res; public: vector<string> getGray(int n) { // write c