3-8 译码器,与4-16译码器

学习了2选一多路选择器之后,记下来又跟着小梅哥学习了3_8 译码器,学习了一些语法知识,然后自己仿照3_8译码器写出了4_16译码器,以此提高自己的写代码能力。

首先3_8译码器。就是很简单的3个输入,8个输出,因为3个输入,有8种排列组合。每一种输入的配列组合,对应着一种输出,这就是3_8译码器。相对应的4_16译码器,就是4个输入,其输入的排列组合方式有16种,每一种对应一个输出。

其中3_8译码器的Verilog代码如下。其中因为out_put是在always块里面,所以一定要将其定义为reg类型。

module decoder_3_8(


//里面是端口列表

    a,
    b,
    c,
    out
    );
    input a;
    input b;
    input c;
    output [7:0] out;
    reg [7:0] out;                          //可以一起赋值 output reg[7:0] out ;
    //描述
    always@(*) begin                    //两个等价,*代替,所有信号   //always@(a,b,c) always 块
                                     //以always 块描述的信号赋值,被赋值的对象必须定义为reg型
        case({a,b,c})              //{}将3个独立的1位信号,转换为一个3位的信号;这种方式叫做位拼接
            3'b000: out = 8'b0000_0001;
            3'b001: out = 8'b0000_0010;
            3'b010: out = 8'b0000_0100;
            3'b011: out = 8'b0000_1000;
            3'b100: out = 8'b0001_0000;
            3'b101: out = 8'b0010_0000;
            3'b110: out = 8'b0100_0000;
            3'b111: out = 8'b1000_0000;
     endcase
     end 

endmodule

 

你完成了一个设计之后,查看原理图,可以了解工具如何将你的代码转换成了电路,综合后的原理图如图所示,

RTL 编码后查看 RTL 分析(RTL ANALYSIS)的原理图。在综合后的原理图中电路已经被映射到器件的 LUT 和 FF 中,并且经过了综合器的优化。相比原先的代码,可以说"面目全非”了``。而 RTL 分析的原理图用逻辑门,选择器以及触发器来表示电路,并尽量使用代码中的变量名表示,可以更清晰地和代码对应。这样一来,就知道自己的代码会变成怎样的电路器件,与门,非门,选择器,加法器等等。尽管我保证他们哪个在 FPGA 上都不存在。代码分析 后设计的原理图如图所示

 

其功能仿真 的代码如下

`timescale 1ns / 1ps

module decoder_3_8_tb();
    reg s_a;
    reg s_b;
    reg s_c;
    wire [7:0]out; 


decoder_3_8  decoder_3_8(

            .a(s_a),
            .b(s_b),
            .c(s_c),
            .out(out)
    );
    initial begin
    
       s_a = 0;s_b= 0;s_c = 0;
    #200 ;
       s_a = 0;s_b= 0;s_c = 1;
    #200;
       s_a = 0;s_b= 1;s_c = 0;
    #200;
       s_a = 0;s_b= 1;s_c = 1;
    #200;
       s_a = 1;s_b= 0;s_c = 0;
    #200;
       s_a = 1;s_b= 0;s_c = 1;
    #200
       s_a = 1;s_b= 1;s_c =0;
    #200;
       s_a = 1;s_b= 1;s_c = 1;
    #200;
     $stop;
    
    end
endmodule

功能仿真图形如下所示,可以看出其输入出随着输入的变化,是一个梯形。

 

在仿照了3_8译码器后,自己仿照写了4_16译码器。代码如下素所示。

`timescale 1ns / 1ps
module decoder_4_16(
    a,
    b,
    c,
    d,
    out 
    
    );
    input a;
    input b;
    input c;
    input d;
    output [15:0] out;
    reg [15:0] out ;
    always@(*)begin
        case({a,b,c,d})
                4'b0000:out = 16'h0001;
                4'b0001:out = 16'h0002;
                4'b0010:out = 16'h0004;
                4'b0011:out = 16'h0008;
                4'b0100:out = 16'h0010;
                4'b0101:out = 16'h0020;
                4'b0110:out = 16'h0040;
                4'b0111:out = 16'h0080;
                4'b1000:out = 16'h0100;
                4'b1001:out = 16'h0200;
                4'b1010:out = 16'h0400;
                4'b1011:out = 16'h0800;
                4'b1100:out = 16'h1000;
                4'b1101:out = 16'h2000;
                4'b1110:out = 16'h4000;
                4'b1111:out = 16'h8000;
                endcase
        end      
endmodule

你完成了一个设计之后,查看原理图,可以了解工具如何将你的代码转换成了电路,综合后的原理图如图所示,

代码分析 后设计的原理图如图所示

 

 

仿真代码如下。

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2021/04/21 11:05:08
// Design Name: 
// Module Name: decoder_4_16_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module decoder_4_16_tb();   
       reg s_a;
       reg s_b;
       reg s_c;
       reg s_d;
       wire [15:0] out;


decoder_4_16 decoder_4_16(
    .a(s_a),
    .b(s_b),
    .c(s_c),
    .d(s_d),
    .out(out) 
    );
    initial begin
    s_a = 0;s_b = 0;s_c= 0;s_d = 0;
    #200;
    s_a = 0;s_b = 0;s_c= 0;s_d = 1  ;
    #200; 
    s_a = 0;s_b = 0;s_c= 1;s_d = 0;
    #200 ;
    s_a = 0;s_b = 0;s_c= 1;s_d = 1;
    #200;
    s_a = 0;s_b = 1;s_c= 0;s_d = 0;
    #200;
    s_a = 0;s_b = 1;s_c= 0;s_d = 1;
    #200;
    s_a = 0;s_b = 1;s_c= 1;s_d = 0;
    #200;
    s_a = 0;s_b = 1;s_c= 1;s_d = 1;
    #200;
    s_a = 1;s_b = 0;s_c= 0;s_d = 0;
    #200;
    s_a = 1;s_b = 0;s_c= 0;s_d = 1;
    #200;
    s_a = 1;s_b = 0;s_c= 1;s_d = 0;
    #200;
    s_a = 1;s_b = 0;s_c= 1;s_d = 1;
    #200;
    s_a = 1;s_b = 1;s_c= 0;s_d = 0;
    #200;
    s_a = 1;s_b = 1;s_c= 0;s_d = 1;
    #200;
    s_a = 1;s_b = 1;s_c= 1;s_d = 0;
    #200;
    s_a = 1;s_b = 1;s_c= 1;s_d = 1;
    #200;
    
    end 
endmodule

功能仿真结果如下

 

 

 

 

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值