• Verilog设计参数化的译码器与编码器,以及设计4位格雷码计数器


    Verilog设计参数化的译码器与编码器,以及设计4位格雷码计数器

    使用Quartus+modelsim完成设计

    1. 参数化的译码器

    在这里插入图片描述

    分析

    参数化译码器,由于输出Y使用的是独热码,所以可以直接用移位运算符实现。

    代码实现

    module decodern #(
    	parameter n=3,
    				 m=1<
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    Testbench

    `timescale 1 ns/ 1 ns
    module decodern_vlg_tst();
    reg [2:0] in;
    // wires                                               
    wire [7:0]  y;
                          
    decodern i1 ( 
    	.in(in),
    	.y(y)
    );
    initial                                                
    begin
    	in=3'b010;
    	#10 in=3'b001;
    	#10 in=3'b111;
    	#10 $stop;
    end
    initial 
    	$monitor($time,": in=%b \t -> \t y=%b ",in,y);
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    结果

    输出结果与预期一致

    • Modelsim波形显示以及monitor输出
      在这里插入图片描述
      在这里插入图片描述

    • 逻辑综合电路
      在这里插入图片描述

    2. 参数化的编码器

    在这里插入图片描述

    分析

    参数化的编码器,主要问题点是实现优先编码,只识别最高位最先为“1”的位数,然后赋值给输出y

    • 为了实现优先编码,应该到达就跳出循环,quartus的语法中不支持break;
    • 可以使用disable来跳出循环

    代码

    module encodern #(
    	parameter n=3,
    				 m=1<0;i=i-1)
    			if(in[i]==1)
    			begin
    				y = i;
    				disable encoder;
    				//jump loop called encoder
    			end
    			else y = 0;
    	end
    	
    endmodule 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    Testbench

    `timescale 1 ns/ 1 ns
    module encodern_vlg_tst();
    reg [7:0] in;
    // wires                                               
    wire [2:0]  y;
    
    // assign statements (if any)                          
    encodern i1 (
    // port map - connection between master ports and signals/registers   
    	.in(in),
    	.y(y)
    );
    initial                                                
    begin        
    	in = 8'b1000_0000;
    	#10 in = 8'b0111_1111;
    	#10 in = 8'b0010_1000;
    	#10 in = 8'b0000_0000;
    	#10 in = 8'b0000_0000;
    	#10 $stop;
    end
    initial $monitor($time, ": in:%b \t -> \t y:%b",in,y);
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    结果

    输出结果与预期一致

    • Modelsim波形显示以及monitor输出
      在这里插入图片描述
      在这里插入图片描述

    • 逻辑综合电路
      在这里插入图片描述

    3. 4位格雷码计数器

    在这里插入图片描述

    分析

    对于四位格雷码,可以直接用一个Case解决,实现一个循环,同时注意是异步复位

    Q[3]Q[2]Q[1]Q[0]
    0000
    0001
    0011
    0010
    0110
    0111
    0101
    0100
    1100
    1101
    1111
    1110
    1010
    1011
    1001
    1000

    代码

    module Gray(
    	input clk,
    	input rst_n,
    	output reg[3:0]gray
    );
    	always@(posedge clk or negedge rst_n)
    	if(!rst_n)	gray <= 4'b0000;
    	else
    		case(gray)
    			4'b0000 : gray <= 4'b0001;
    			4'b0001 : gray <= 4'b0011;
    			4'b0011 : gray <= 4'b0010;
    			4'b0010 : gray <= 4'b0110;
    			4'b0110 : gray <= 4'b0111;
    			4'b0111 : gray <= 4'b0101;
    			4'b0101 : gray <= 4'b0100;
    			4'b0100 : gray <= 4'b1100;
    			4'b1100 : gray <= 4'b1101;
    			4'b1101 : gray <= 4'b1111;
    			4'b1111 : gray <= 4'b1110;
    			4'b1110 : gray <= 4'b1010;
    			4'b1010 : gray <= 4'b1011;
    			4'b1011 : gray <= 4'b1001;
    			4'b1001 : gray <= 4'b1000;
    			4'b1000 : gray <= 4'b0000;
    			default : gray <= 4'bx;
    		endcase
    
    endmodule 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    Testbench

    `timescale 1 ns/ 1 ns
    module Gray_vlg_tst();
    reg clk;
    reg rst_n;
    // wires                                               
    wire [3:0]  gray;
    
    // assign statements (if any)                          
    Gray i1 (
    // port map - connection between master ports and signals/registers   
    	.clk(clk),
    	.gray(gray),
    	.rst_n(rst_n)
    );
    initial 
    begin 
    	rst_n = 0;//initial state
    	clk = 0;
    	#5 rst_n = 1;
    	#100 $stop;
    end
    
    always #5 clk = ~clk;
    
    initial $monitor($time,"-> \t now state of gray is : %b",gray);
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    结果

    输出结果与预期一致

    • Modelsim波形显示以及monitor输出
      在这里插入图片描述
      在这里插入图片描述

    • 逻辑综合电路

    在这里插入图片描述

  • 相关阅读:
    【Java面试小短文】HashMap是如何解决Hash冲突的?
    【图论】图深度学习读书笔记:绪论
    中小企业数字化转型难?为什么不试试“企业级”无代码平台
    portainer忘记密码之修改密码
    JUnit 面试题及答案整理,最新面试题
    c++ qt连接操作sqlite
    Python接口自动化测试 —— Selenium+pytest+数据驱动
    SURE:增强不确定性估计的组合拳,快加入到你的训练指南吧 | CVPR 2024
    vite创建Vue3项目:router+pinia+element-plus or antd + sass + ts
    [Linux 基础] make、Makefile自动化构建代码工具
  • 原文地址:https://blog.csdn.net/Zhong_ty/article/details/127614249