FPGA学习(二)—— 三八译码器
FPGA学习(二)—— 三八译码器
文章目录
- FPGA学习(二)—— 三八译码器
- 一、三八译码器原理
- 1、三八译码器的真值表
- 2、逻辑表达式
- 3、Verilog代码实现
- 4、RTL原理图
- 5、波形仿真
- 二、点亮数码管
- 1、数码管的介绍
- 2、代码实现
- 3、引脚配置
- 4、测试结果
一、三八译码器原理
1、三八译码器的真值表
输入 A | 输入 B | 输入 C | 输出 Y0 | 输出 Y1 | 输出 Y2 | 输出 Y3 | 输出 Y4 | 输出 Y5 | 输出 Y6 | 输出 Y7 |
---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
2、逻辑表达式
3、Verilog代码实现
module _38yima(a, b, c, out);
input a; // 输入端口a
input b; // 输入端口b
input c; // 输入端口c
output [7:0] out; // 输出端口out,8位宽
reg [7:0] out; // 声明out为寄存器类型
// 或者可以直接写成:output reg [7:0] out;
// always块:当a、b或c发生变化时触发
always @(a, b, c) begin
// case语句:根据{a, b, c}的组合值选择输出
case ({a, b, c})
3'b000: out = 8'b0000_0001; // 当{a, b, c}为000时,out输出0000_0001
3'b001: out = 8'b0000_0010; // 当{a, b, c}为001时,out输出0000_0010
3'b010: out = 8'b0000_0100; // 当{a, b, c}为010时,out输出0000_0100
3'b011: out = 8'b0000_1000; // 当{a, b, c}为011时,out输出0000_1000
3'b100: out = 8'b0001_0000; // 当{a, b, c}为100时,out输出0001_0000
3'b101: out = 8'b0010_0000; // 当{a, b, c}为101时,out输出0010_0000
3'b110: out = 8'b0100_0000; // 当{a, b, c}为110时,out输出0100_0000
3'b111: out = 8'b1000_0000; // 当{a, b, c}为111时,out输出1000_0000
endcase
end
endmodule
4、RTL原理图
5、波形仿真
二、点亮数码管
1、数码管的介绍
、
2、代码实现
/*实现38译码器
module _38yima(a, b, c, out);
input a; // 输入端口a
input b; // 输入端口b
input c; // 输入端口c
output [7:0] out; // 输出端口out,8位宽
reg [7:0] out; // 声明out为寄存器类型
// 或者可以直接写成:output reg [7:0] out;
// always块:当a、b或c发生变化时触发
always @(a, b, c) begin
// case语句:根据{a, b, c}的组合值选择输出
case ({a, b, c})
3'b000: out = 8'b0000_0001; // 当{a, b, c}为000时,out输出0000_0001
3'b001: out = 8'b0000_0010; // 当{a, b, c}为001时,out输出0000_0010
3'b010: out = 8'b0000_0100; // 当{a, b, c}为010时,out输出0000_0100
3'b011: out = 8'b0000_1000; // 当{a, b, c}为011时,out输出0000_1000
3'b100: out = 8'b0001_0000; // 当{a, b, c}为100时,out输出0001_0000
3'b101: out = 8'b0010_0000; // 当{a, b, c}为101时,out输出0010_0000
3'b110: out = 8'b0100_0000; // 当{a, b, c}为110时,out输出0100_0000
3'b111: out = 8'b1000_0000; // 当{a, b, c}为111时,out输出1000_0000
endcase
end
endmodule
*/
//利用38译码器点亮8段数码管
module _38yima(
input wire [2:0] sw, // 3位输入开关,用于选择数码管显示的数字
output reg [6:0] seg // 8位输出,连接到数码管的段选信号(a-g + dp)
);
// 数码管段选信号定义(共阳极)
// seg[6:0] 分别对应数码管的 g, f, e, d, c, b, a
// 共阳极数码管:0 点亮,1 熄灭
always @(sw) begin
case (sw)
3'b000: seg = 8'b1100_0000; // 显示数字 0
3'b001: seg = 8'b1111_1001; // 显示数字 1
3'b010: seg = 8'b1010_0100; // 显示数字 2
3'b011: seg = 8'b1011_0000; // 显示数字 3
3'b100: seg = 8'b1001_1001; // 显示数字 4
3'b101: seg = 8'b1001_0010; // 显示数字 5
3'b110: seg = 8'b1000_0010; // 显示数字 6
default: seg = 8'b1111_1111; // 默认全灭
endcase
end
endmodule
3、引脚配置
4、测试结果
FPGA实现三八译码器