本系列笔记使用高云 GW5AT-LV138PG484AC1/10

1. 3-8译码器

1.1 简介

译码(decoder)是编码(coder)的逆过程。其功能是将具有特定含义的二进制码进行辨别,并转换成控制信号,具有译码功能的逻辑电路称为译码器。如果有n个二进制选择线,则最多可译码转换成2n个数据。

1.2 功能

将输入的3位2进制数翻译成10进制的8位输出。

3-8译码器输入是二进制。3只脚也就是3位二进制数。输入可以3位二进制数。3位二进制最大是111 也就是8。

3-8译码器输出是8个脚,表示10进制。是根据输入的二进制数输出。如果输入是101 那么就是第5只脚高电平,表示二进制数是5。

3-8线译码器是一种全译码器(二进制译码器)。全译码器的输入是3位二进制代码,3位二进制代码共有8种组合,故输出是与这8种组合一一对应的8个输出信号。

1.3 逻辑真值表

逻辑真值表中,输入信号的每种组合对应着一个输出端的高电平信号 ,即输出端为高电平时认为该输出端有输出信号。当然,根据有需要也可以定义输出端为低电平时认为该输出端有输入信号,此时称输出端低电平有效。这些都是我们在设计译码器的时候人为设定的。

通过逻辑真值表我们可以写出逻辑表达式

1.4 3-8译码器的Verilog实现

module decoder_3_8 (
    A0,
    A1,
    A2,
    Y0,
    Y1,
    Y2,
    Y3,
    Y4,
    Y5,
    Y6,
    Y7
);
    input A0;
    input A1;
    input A2;
    output reg Y0;
    output reg Y1;
    output reg Y2;
    output reg Y3;
    output reg Y4;
    output reg Y5;
    output reg Y6;
    output reg Y7;

    always@(*)
        case ({A2, A1, A0})
            3'b000: {Y7, Y6, Y5, Y4, Y3, Y2, Y1, Y0} = 8'b00000001;
            3'b001: {Y7, Y6, Y5, Y4, Y3, Y2, Y1, Y0} = 8'b00000010;
            3'b010: {Y7, Y6, Y5, Y4, Y3, Y2, Y1, Y0} = 8'b00000100;
            3'b011: {Y7, Y6, Y5, Y4, Y3, Y2, Y1, Y0} = 8'b00001000;
            3'b100: {Y7, Y6, Y5, Y4, Y3, Y2, Y1, Y0} = 8'b00010000;
            3'b101: {Y7, Y6, Y5, Y4, Y3, Y2, Y1, Y0} = 8'b00100000;
            3'b110: {Y7, Y6, Y5, Y4, Y3, Y2, Y1, Y0} = 8'b01000000;
            3'b111: {Y7, Y6, Y5, Y4, Y3, Y2, Y1, Y0} = 8'b10000000;
            default: {Y7, Y6, Y5, Y4, Y3, Y2, Y1, Y0} = 8'b00000000;
        endcase

endmodule

1.5 仿真验证

`timescale 1ns/1ns

module  decoder_3_8_tb();
    reg A0;
    reg A1;
    reg A2;
    wire Y0;
    wire Y1;
    wire Y2;
    wire Y3;
    wire Y4;
    wire Y5;
    wire Y6;
    wire Y7;

    decoder_3_8 decoder_3_8_inst0(
                .A0(A0),
                .A1(A1),
                .A2(A2),
                .Y0(Y0),
                .Y1(Y1),
                .Y2(Y2),
                .Y3(Y3),
                .Y4(Y4),
                .Y5(Y5),
                .Y6(Y6),
                .Y7(Y7)
    );
    initial begin
        A2 = 0; A1 = 0; A0 = 0;
        #20;
        A2 = 0; A1 = 0; A0 = 1;
        #20;
        A2 = 0; A1 = 1; A0 = 0;
        #20;
        A2 = 0; A1 = 1; A0 = 1;
        #20;
        A2 = 1; A1 = 0; A0 = 0;
        #20;
        A2 = 1; A1 = 0; A0 = 1;
        #20;
        A2 = 1; A1 = 1; A0 = 0;
        #20;
        A2 = 1; A1 = 1; A0 = 1;
    end
endmodule

1.6 板级验证

通过3个拨码开关即可控制8个LED

通过开发板的原理图约束硬件引脚

第一组:SW0:0 SW1:0 SW2:0 预期现象LED0亮

第一组:SW0:1 SW1:0 SW2:1 预期现象LED5亮

2. 时序逻辑电路

时序逻辑电路是指电路任何时刻的稳态输出不仅取决于当前的输入,还与前一时刻输入形成的状态有关。这跟组合逻辑电路相反,组合逻辑的输出只会跟目前的输入成一种函数关系。换句话说,时序逻辑拥有储存元件来存储信息,而组合逻辑则没有。

2.1 D触发器

D触发器是一种最简单的触发器,在触发边沿到来时,将输入端的值存入其中,并且这个值与当前存储的值无关。在两个有效的脉冲边沿之间,D的跳转不会影响触发器存储的值,但是在脉冲边沿到来之前,输入端D必须有足够的建立时间,保证信号稳定。

2.2 计数器

计数器的核心元件是触发器,基本功能是对脉冲进行计数,其所能记忆脉冲最大的数目称为该计数器的模/值。 计数器常用在分频、定时等处。计数器的种类很多,按照计数方式的不同可以分为二进制计数器、十进制计数器以及任意进制计数器,按照触发器的时钟脉冲信号来源可分为同步计数器与异步计数器。按照计数增减可分为加法计数器、减法计数器以及可逆计数器。

2.3 计数器 Verilog 实现

module led(
    input clk,
    input rst_n,
    output reg led
);
    reg [25:0] cnt;
    always @ (posedge clk or negedge rst_n)
    begin
        if (!rst_n)
            cnt <= 26'd0;
        else if (cnt < 26'd49_999_999)
            cnt <= cnt + 1'b1;
        else
            cnt <= 26'd0;
    end

    always @ (posedge clk or negedge rst_n)
    begin
        if (!rst_n)
            led <= 1'b0;
        else if (cnt == 26'd49_999_999)
            led <= ~led;
        else
        led <= led;
    end
    
endmodule

2.4 仿真验证

`timescale 1ns/1ns
`define CLOCK_PERIOD 20

module bin_counter_tb();

    reg  clk;
    reg  reset_n;
    wire led;

    // 例化被测模块
    bin_counter bin_counter_inst (
        .clk     (clk),
        .reset_n (reset_n),
        .led     (led)
    );

    // 产生周期为 20 ns 的时钟
    initial clk = 1'b1;

    always #(`CLOCK_PERIOD / 2)
        clk = ~clk;

    // 产生复位信号并控制仿真时间
    initial begin
        reset_n = 1'b0;               // 低电平复位
        #(`CLOCK_PERIOD * 200 + 1);   // 保持复位 4001 ns

        reset_n = 1'b1;               // 解除复位
        #2000000000;                 // 再仿真 2 秒

        $stop;                       // 暂停仿真
    end

endmodule

2.5 板级验证

3. 使用移位实现LED流水灯

3.1