转——从零开始学FPGA——by ihalin——38译码器 感谢小梅哥!!
s* [' l! P# c0 e! _) e, j* E# i
昨天做了我FPGA的第一个实验
! F/ q% |1 x% O* L7 }从零开始学FPGA我的第一个实验(记录一下)
* w% \& t0 {! ~3 i1 V# K2 J3 Z6 t6 \
今天第二个实验38译码器
: i; |" Q/ C5 H' H6 D; ?真值表
* e1 ^( {5 C# g. k. k V
7 O/ I. u! ?3 _* Y& z
原理:
9 P2 l2 i L- }1 F' B" L, c" B有三个(一位)输入
) d) t! X# U p7 h
一个输出(8位)
4 o6 `1 ~0 z1 v5 y3 Y0 q
使用了一个always块,always块语句注意阻塞赋值和非阻塞赋值(<=, = )
2 K6 n; b) b5 z6 x) P{a,b,c}位拼接把三个一位的拼接成一个3位的
7 ?& A/ c; u' k/ j* z, o
位拼接:
8 n, j! s0 Y9 |* `# R+ S% ]{a,b[3:0],w,3'b101}等价于{a,b[3],b[2],b[1],b[0],w,1'b1,1'b0,1'b1}
- |) N" Z' H8 T" s5 K" o{4{w}}等价于{w,w,w,w}
( [. M" H2 @. B% U* i! u7 d
{b,{3{a,b}}}等价于{b,a,b,a,b,a,b}
( o# {/ O" t# d2 H' B4 I
case用法和c类似记住还有个default
/ ?" b6 _* D9 X$ L+ q
3'b000表示位宽是3 的二进制 000
; n S) j6 N5 S5 g4 ]
位宽+进制+数值
1 I6 Z* G/ m+ N7 h% e
进制+数值(默认位宽有机器系统决定)
6 A, ~1 Z f- p! A6 m数字(默认10进制)
# I7 h+ N! a* k; t3 P- @ M- t2进制 b/B bin
3 b! c& N# v& u/ x5 u9 Y/ T& T
8进制 o/O octonary
4 r- V/ o4 a: m B) y- k% r
10进制 d/D decimal
. c6 N' h! M3 r; g0 B16进制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
测试代码:
( s3 ^) R( x" l* b& Sreg型是激励信号源的; D) y. @/ t2 c
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仿真:
. p+ n# s* c6 N* Y9 h F0 {符合设计初衷
# G$ _! a' V& O7 A, D3 L4 w5 I4 U然后是门级仿真
3 p* c9 A7 W* e1 D. m; `
. H1 A! r. u: l9 B
发现和RTL仿真有些区别会出现一些跳变的过度值如0000 0000,现在还不知道怎么去避免。
/ B8 r2 q, H/ I
$ t, ]$ K p8 B7 w) [
下面是我在开发板上做的测试* C) ]* E: t- D# |/ o: @