转——从零开始学FPGA——by ihalin——38译码器 感谢小梅哥!!
4 o$ B. U* G7 F8 ]; e; H6 N
昨天做了我FPGA的第一个实验
* _5 I, V( a( c3 k从零开始学FPGA我的第一个实验(记录一下)
9 l @8 w% a8 J
今天第二个实验38译码器
; V' ]) h G$ l. E6 g2 U
真值表
0 H/ G& Z" g6 {* s: f! `
( y9 F8 B5 [( L) I8 J原理:
" Z, }- [7 [; b7 f7 f9 U
有三个(一位)输入
2 t6 W) r4 I: G0 a+ Z一个输出(8位)
7 k# P8 c' M5 g( W/ l" h2 m
使用了一个always块,always块语句注意阻塞赋值和非阻塞赋值(<=, = )
& ? E2 W& i" F
{a,b,c}位拼接把三个一位的拼接成一个3位的
4 z: \5 D) Y# U0 G
位拼接:
. J$ S$ i2 h2 l0 q9 H2 ~% C/ S{a,b[3:0],w,3'b101}等价于{a,b[3],b[2],b[1],b[0],w,1'b1,1'b0,1'b1}
7 b7 r+ Q |! `6 F{4{w}}等价于{w,w,w,w}
1 L, J" g2 t& i- S8 @* u{b,{3{a,b}}}等价于{b,a,b,a,b,a,b}
+ w' s2 V/ U V/ M0 d5 N
case用法和c类似记住还有个default
& S) c z4 @4 B4 `; z
3'b000表示位宽是3 的二进制 000
8 P7 q W; B- k7 W
位宽+进制+数值
) `6 T! c4 R0 u8 d+ Q% i
进制+数值(默认位宽有机器系统决定)
) l8 ]" \. ~* r, G; Z5 ]8 c
数字(默认10进制)
) T. @, [1 F) D5 M/ j2进制 b/B bin
) j- C/ H7 O: V1 Z5 G2 i ]8进制 o/O octonary
( m* m% L1 H* R1 D( k10进制 d/D decimal
9 W% R; E! y% ~% G8 s: ^+ [16进制h/H hex
1. module smg3_8(a,b,c,out);
2.
3. input a;//输入端口a
4. input b;//输入端口b
5. input c;//输入端口c
6.
7. output reg [7:0]out;//输出端口out
8.
9. always@(a,b,c)begin
10. case({a,b,c})
11. 3'b000: out=8'b0000_0001;//下划线不影响
12. 3'b001: out=8'b0000_0010;
13. 3'b010: out=8'b0000_0100;
14. 3'b011: out=8'b0000_1000;
15. 3'b100: out=8'b0001_0000;
16. 3'b101: out=8'b0010_0000;
17. 3'b110: out=8'b0100_0000;
18. 3'b111: out=8'b1000_0000;
19. //default:
20. endcase
21. end
22. endmodule
测试代码:% R. c* V4 c, U. h; ~
reg型是激励信号源的5 P7 @' \, I0 ~) Y3 o6 K( d9 ]
wire 型的是输出信号的观察信号
1. `timescale 1ns/1ns
2.
3. module smg3_8_tb;
4.
5. reg a;//reg 型是激励信号源
6. reg b;
7. reg c;
8.
9. wire [7:0]out;//wire 型的是出信号的观察信号
10. smg3_8 smg(
11. .a(a),
12. .b(b),
13. .c(c),
14. .out(out)
15. );
16.
17. initial begin
18. a = 0;b = 0; c = 0;
19. #200;
20. a = 0;b = 0; c = 1;
21. #200;
22. a = 0;b = 1; c = 0;
23. #200;
24. a = 0;b = 1; c = 1;
25. #200;
26. a = 1;b = 0; c = 0;
27. #200;
28. a = 1;b = 0; c = 1;
29. #200;
30. a = 1;b = 1; c = 0;
31. #200;
32. a = 1;b = 1; c = 1;
33. #200;
34. $stop;
35. end
36.
37. endmodul
RTL仿真:
" w7 K3 ^) [# o2 L
符合设计初衷
5 D& r" r4 z# A, N6 B然后是门级仿真
/ a9 Q6 k6 G2 {1 o
5 k, M' W6 k! W9 H/ Z; Y
发现和RTL仿真有些区别会出现一些跳变的过度值如0000 0000,现在还不知道怎么去避免。
" K' H/ W8 C! f) t$ m
. p! n2 @. W3 o' r下面是我在开发板上做的测试1 T1 F6 h( Q: Z" \( V6 ^