Verilog学习——三八译码器

文章详细描述了一个使用Verilog编写的3-8解码器模块,通过case语句实现输入信号S0,S1,S2控制输出。随后进行了时序仿真,展示了不同输入组合下的输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 一、代码实现

`timescale 1ns / 1ns



module decoder_3_8(

    input             S0  ,

    input             S1  ,

    input             S2  ,

    output [7:0]   out   //output reg[7:0] out

    );

    reg[7:0]      r_out ; //利用了always模块,需对输出定义reg类型

    assign  out = r_out ;//或者直接在输入端定义reg类型

    always @(*) begin

        case({S2,S1,S0})

        3'b000: r_out = 8'b0000_0001;   //out = ........

        3'b001: r_out = 8'b0000_0010;

        3'b010: r_out = 8'b0000_0100;

        3'b011: r_out = 8'b0000_1000;

        3'b100: r_out = 8'b0001_0000;

        3'b101: r_out = 8'b0010_0000;

        3'b110: r_out = 8'b0100_0000;

        3'b111: r_out = 8'b1000_0000;

        default:r_out = 8'b0000_0000;

        endcase

    end

endmodule

 

二、仿真 

`timescale 1ns / 1ns


module decoder_3_8_tb();
    reg         S0  ; 
    reg         S1  ; 
    reg         S2  ;  
    wire[7:0]   out ; 

decoder_3_8 inst0(
    .S0 (S0 ) ,
    .S1 (S1 ) ,
    .S2 (S2 ) ,
    .out(out)   
    );
    initial begin
      S0 = 0 ; S1 = 0 ; S2 = 0;
      #200
      S0 = 1 ; S1 = 0 ; S2 = 0;
      #200
      S0 = 0 ; S1 = 1 ; S2 = 0;
      #200
      S0 = 1 ; S1 = 1 ; S2 = 0;
      #200
      S0 = 0 ; S1 = 0 ; S2 = 1;
      #200
      S0 = 1 ; S1 = 0 ; S2 = 1;
      #200
      S0 = 0 ; S1 = 1 ; S2 = 1;
      #200
      S0 = 1 ; S1 = 1 ; S2 = 1;
      #200
      $stop;
    end
endmodule

给予如上图的激励,仿真图如下: 

### 74LS138 译码器 Verilog 实现 以下是基于引用内容和专业知识编写的 Verilog 代码,用于实现 74LS138 译码器的功能。此模块可以接收三个地址输入信号 `A`, `B`, 和 `C`,两个使能信号 `E1` 和 `E2`(低电平有效),并输出八个解码后的信号。 #### 74LS138 译码器 Verilog 模块 ```verilog module decoder_74ls138 ( input E1, // 使能信号1 (低电平有效) input E2, // 使能信号2 (高电平有效) input A, // 地址输入 A input B, // 地址输入 B input C, // 地址输入 C output reg [7:0] Y // 输出信号 (低电平有效) ); always @(*) begin if (~E1 & E2) begin case({A, B, C}) 3'b000 : Y = 8'b11111110; // Y0 active low 3'b001 : Y = 8'b11111101; // Y1 active low 3'b010 : Y = 8'b11111011; // Y2 active low 3'b011 : Y = 8'b11110111; // Y3 active low 3'b100 : Y = 8'b11101111; // Y4 active low 3'b101 : Y = 8'b11011111; // Y5 active low 3'b110 : Y = 8'b10111111; // Y6 active low 3'b111 : Y = 8'b01111111; // Y7 active low default: Y = 8'b11111111; endcase end else begin Y = 8'b11111111; // 当未启用时,所有输出为高阻态 end end endmodule ``` 上述代码实现了标准的 74LS138 功能[^1],其中当 `E1=0` 并且 `E2=1` 时,译码器被激活;否则,所有的输出均为高电平。 --- ### 使用 74LS138 驱动数码管 为了驱动一个七段数码管显示特定数值,可以通过将 74LS138 的输出连接到对应的段选信号上。假设我们希望根据输入的三位二进制数来控制数码管上的数字显示,则需要额外编写一个映射逻辑,将译码器的输出转换为适合数码管的段选信号。 #### 数码管驱动 Verilog 模块 以下是一个简单的例子,展示如何利用 74LS138 来选择不同的数字模式: ```verilog // 定义一个函数,将输入值转为七段数码管的段选信号 function [6:0] seven_seg_decoder(input [3:0] data); case(data) 4'h0: seven_seg_decoder = 7'b1000000; // 显示 '0' 4'h1: seven_seg_decoder = 7'b1111001; // 显示 '1' 4'h2: seven_seg_decoder = 7'b0100100; // 显示 '2' 4'h3: seven_seg_decoder = 7'b0110000; // 显示 '3' 4'h4: seven_seg_decoder = 7'b0011001; // 显示 '4' 4'h5: seven_seg_decoder = 7'b0010010; // 显示 '5' 4'h6: seven_seg_decoder = 7'b0000010; // 显示 '6' 4'h7: seven_seg_decoder = 7'b1111000; // 显示 '7' 4'h8: seven_seg_decoder = 7'b0000000; // 显示 '8' 4'h9: seven_seg_decoder = 7'b0010000; // 显示 '9' default: seven_seg_decoder = 7'b1111111; // 默认关闭 endcase endfunction module driver_seven_segment ( input wire [2:0] addr_in, input wire enable, output reg [6:0] segments_out ); wire [7:0] decoded_output; decoder_74ls138 uut_decoder( .E1(enable), .E2(~enable), // 假设 E2 是反相的 .A(addr_in[0]), .B(addr_in[1]), .C(addr_in[2]), .Y(decoded_output) ); always @(decoded_output) begin integer i; for(i = 0; i < 8; i=i+1) begin if(!decoded_output[i]) begin segments_out = seven_seg_decoder(i); // 将对应位置的输出设置为段选信号 end end end endmodule ``` 在此设计中,通过调用 `seven_seg_decoder()` 函数完成从二进制数据到七段数码管段选信号的转换[^3]。 --- ### 总结 以上展示了如何使用 Verilog 设计 74LS138 译码器及其应用案例——驱动七段数码管。这种组合方式能够灵活应用于各种嵌入式系统中的数据显示场景。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值