本系列笔记使用高云 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
endmodule1.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
endmodule1.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
endmodule2.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 板级验证




