转——从零开始学FPGA——by ihalin——38译码器 感谢小梅哥!!
+ z' H+ ]* Z( E; l# X* G+ H9 R昨天做了我FPGA的第一个实验
' A3 W! T1 e) K
从零开始学FPGA我的第一个实验(记录一下)
* Y9 U# p: r m7 N% ?) e今天第二个实验38译码器
2 D- G9 U; f1 g1 x真值表
/ U; ~+ h* @! e8 e7 W7 @- Z
t) m; G1 d& X! _8 C原理:
. n* h0 r4 t# I/ T: ^# U
有三个(一位)输入
% D# V8 d) I% f6 |6 f4 x一个输出(8位)
4 s% |9 c( R0 u" K4 e( W使用了一个always块,always块语句注意阻塞赋值和非阻塞赋值(<=, = )
" K _$ I! l/ O. C( B# j* k{a,b,c}位拼接把三个一位的拼接成一个3位的
' J! W8 ~- _0 F位拼接:
B% S1 M( k- G, x$ F
{a,b[3:0],w,3'b101}等价于{a,b[3],b[2],b[1],b[0],w,1'b1,1'b0,1'b1}
4 r# ?' ]& r; k: r5 r
{4{w}}等价于{w,w,w,w}
# V# m' T% p8 J4 u5 H{b,{3{a,b}}}等价于{b,a,b,a,b,a,b}
1 g) t+ [7 b: ~
case用法和c类似记住还有个default
* a. J, z! G: a3 e& `3'b000表示位宽是3 的二进制 000
, ?. B4 E/ K: G h3 i. @位宽+进制+数值
4 p+ \# @% U6 }进制+数值(默认位宽有机器系统决定)
, s6 {6 `) N$ Y1 ]2 Z; r数字(默认10进制)
1 ?& P) e7 L' ?0 q2进制 b/B bin
0 ~1 f5 G- Q* P% a
8进制 o/O octonary
8 f8 Y J' e/ |4 ^) I) G% u/ I0 J10进制 d/D decimal
5 n/ a9 i5 t2 ^" \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
测试代码:; A( H: m3 T6 Y+ f9 O c
reg型是激励信号源的
8 x* @4 p) a8 T5 j$ t! f& X0 twire 型的是输出信号的观察信号
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仿真:
* s/ W6 a* w/ E* f2 U& n; a/ U
符合设计初衷( T# K- R8 {$ T: c
然后是门级仿真
( d- h# E) |, x D% T
. d. O2 K n* q: l8 |5 w
发现和RTL仿真有些区别会出现一些跳变的过度值如0000 0000,现在还不知道怎么去避免。
# j2 Q" l* e. n- G7 L
9 n8 O0 ?: x; r
下面是我在开发板上做的测试/ ?; \5 h# @' j9 `$ J