我是靠谱客的博主 文艺大侠,最近开发中收集的这篇文章主要介绍手撕Verilog面试题专题——(2)格雷码与二进制码的相互转换2 实现格雷码与二进制码的相互转换,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

2 实现格雷码与二进制码的相互转换

Verilog代码(用一个函数实现):

    // 定义函数 完成 二进制和格雷码的相互转换
	function [WIDTH:0] data_out(input op, input [WIDTH:0] data_in);
		integer	i;
		begin
			if(op == 1'b0)               // ENCODE = 1'b0 二进制转为格雷码
				data_out = (data_in >> 1) ^ data_in;
			else if(op == 1'b1)	begin    // DECODE = 1'b1 格雷码转为二进制
				data_out[WIDTH] = data_in[WIDTH];
				for(i=WIDTH-1; i>=0; i=i-1)
					data_out[i] = data_out[i+1] ^ data_in[i];
			end 
		end
	endfunction

testbench仿真代码:

module GRAY_tb();
    // 定义函数 完成 二进制和格雷码的相互转换
	function [WIDTH:0] data_out(input op, input [WIDTH:0] data_in);
		integer	i;
		begin
			if(op == 1'b0)               // ENCODE = 1'b0 二进制转为格雷码
				data_out = (data_in >> 1) ^ data_in;
			else if(op == 1'b1)	begin    // DECODE = 1'b1 格雷码转为二进制
				data_out[WIDTH] = data_in[WIDTH];
				for(i=WIDTH-1; i>=0; i=i-1)
					data_out[i] = data_out[i+1] ^ data_in[i];
			end 
		end
	endfunction
	
    parameter WIDTH = 4;
    parameter ENCODE = 1'b0;
    parameter DECODE = 1'b1;
    
    reg             clk;
    reg             rst;
    reg [WIDTH-1:0] data_in;
    wire [WIDTH-1:0] data_encode;
    wire [WIDTH-1:0] data_decode;
    
    initial begin
        clk = 0;
        rst = 1;
        #5 rst = 0;
        #15 rst = 1;
    end
    initial begin
        forever #2 clk = ~clk;
    end
    
    always@(posedge clk or negedge rst) begin
        if(!rst)
            data_in <= 0;
        else begin
            data_in = data_in + 1'b1;
        end
    end
    assign data_encode = data_out(ENCODE, data_in);
    assign data_decode = data_out(DECODE, data_encode);
endmodule

仿真波形:
在这里插入图片描述

最后

以上就是文艺大侠为你收集整理的手撕Verilog面试题专题——(2)格雷码与二进制码的相互转换2 实现格雷码与二进制码的相互转换的全部内容,希望文章能够帮你解决手撕Verilog面试题专题——(2)格雷码与二进制码的相互转换2 实现格雷码与二进制码的相互转换所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部