感谢小梅哥!!
昨天做了我FPGA的第一个实验
从零开始学FPGA我的第一个实验(记录一下)
今天第二个实验38译码器
真值表
原理:
有三个(一位)输入
一个输出(8位)
使用了一个always块,always块语句注意阻塞赋值和非阻塞赋值(<=, = )
{a,b,c}位拼接把三个一位的拼接成一个3位的
位拼接:
{a,b[3:0],w,3'b101}等价于{a,b[3],b[2],b[1],b[0],w,1'b1,1'b0,1'b1}
{4{w}}等价于{w,w,w,w}
{b,{3{a,b}}}等价于{b,a,b,a,b,a,b}
case用法和c类似记住还有个default
3'b000表示位宽是3 的二进制 000
位宽+进制+数值
进制+数值(默认位宽有机器系统决定)
数字(默认10进制)
2进制 b/B bin
8进制 o/O octonary
10进制 d/D decimal
16进制h/H hex
- module smg3_8(a,b,c,out);
- input a;//输入端口a
- input b;//输入端口b
- input c;//输入端口c
-
- output reg [7:0]out;//输出端口out
-
- always@(a,b,c)begin
- case({a,b,c})
- 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;
- //default:
- endcase
- end
- endmodule
测试代码:
reg型是激励信号源的
wire 型的是输出信号的观察信号
- `timescale 1ns/1ns
- module smg3_8_tb;
- reg a;//reg 型是激励信号源
- reg b;
- reg c;
-
- wire [7:0]out;//wire 型的是出信号的观察信号
- smg3_8 smg(
- .a(a),
- .b(b),
- .c(c),
- .out(out)
- );
-
- initial begin
- a = 0;b = 0; c = 0;
- #200;
- a = 0;b = 0; c = 1;
- #200;
- a = 0;b = 1; c = 0;
- #200;
- a = 0;b = 1; c = 1;
- #200;
- a = 1;b = 0; c = 0;
- #200;
- a = 1;b = 0; c = 1;
- #200;
- a = 1;b = 1; c = 0;
- #200;
- a = 1;b = 1; c = 1;
- #200;
- $stop;
- end
-
- endmodul
RTL仿真:
符合设计初衷
然后是门级仿真
发现和RTL仿真有些区别会出现一些跳变的过度值如0000 0000,现在还不知道怎么去避免。
下面是我在开发板上做的测试
谢谢小梅哥!!