不要怀疑,这一章实验是最后的步骤了。经前面几章的式样,我们已经完成各个模块的创建和组织。
这一章,我们要它们结合起来(“SMG4位控制器”和“SMG加码器”)。
这一章的实验,主要是创建一个顶层模块,用来组合“SMG4位控制器”和“SMG加码器”。
项目导航操作:
1.module SMG_Interface
2.(
3. CLK, RST,
4. Data_In,
5. SDO,SCL,STCP
6.);
7.
8. input CLK;
9. input RST;
10. input [25:0]Data_In;
11.
12. output SDO;
13. output SCL;
14. output STCP;
15.
16. /************************************/
17. //Module for Number_Module
18.
19. wire [7:0]Thousand;
20. wire [7:0]Hundred;
21. wire [7:0]Ten;
22. wire [7:0]One;
23.
24. smg_encoder U1
25. (
26. .CLK( CLK ),
27. .RST( RST ),
28. .Data_In( Data_In ), //U1 input
29. .Thousand_Out( Thousand ), //U1 output
30. .Hundred_Out( Hundred ), //U1 output
31. .Ten_Out( Ten ), //U1 output
32. .One_Out( One ) //U1 output
33. );
34.
35. /**********************************/
36. //Module for SMG_Controller
37.
38. smg_controller U2
39. (
40. .RST( RST ),
41. .CLK( CLK ),
42. .Thousand( Thousand ), //U1 drive U2
43. .Hundred( Hundred ), //U1 drive U2
44. .Ten( Ten ), //U1 drive U2
45. .One( One ), //U1 drive U2
46. .SDO( SDO ), //output to global
47. .SCL( SCL ), //output to global
48. .STCP( STCP ) //output to global
49. );
50.
51.endmodule
故之前“4位SMG控制器”的设计是个体的,为了和“SMG加码器”有效的组织起来,如今需要一点修改。
1.module smg_controller
2.(
3. CLK, RST,
4. Thousand, Hundred, Ten, One,
5. SCL, SDO, STCP
6.);
7.
8. input CLK;
9. input RST;
10.
11. input [7:0]Thousand;
12. input [7:0]Hundred;
13. input [7:0]Ten;
14. input [7:0]One;
15.
16. output SCL, SDO, STCP;
17.
18. /*****************************************/
19.
20. //SMG code
21. parameter _0 = 7'h3f,
22. _1 = 7'h06,
23. _2 = 7'h5b,
24. _3 = 7'h4f,
25. _4 = 7'h66;
26.
27. //Row scan code
28. parameter _R1 = 8'b1111_0111,
29. _R2 = 8'b1111_1011,
30. _R3 = 8'b1111_1101,
31. _R4 = 8'b1111_1110;
32.
33. /*****************************************/
34.
35. //state mechine parameter
36. parameter R1 = 4'd1, R2 = 4'd2, R3 = 4'd3, R4 = 4'd4;
37.
38. /*****************************************/
39.
40. reg [7:0]rSMG;
41. reg [7:0]rRow;
42. reg [3:0]Current;
43. reg [3:0]Next;
44.
45. always @ ( posedge CLK or negedge RST )
46. if( !RST )
47. begin
48. Current <= R1;
49. end
50. else
51. Current <= Next;
52.
53. always @ ( posedge CLK or negedge RST )
54. if( !RST )
55. begin
56. Next <= R1;
57. rSMG <= 8'd0;
58. rRow <= 8'd0;
59. end
60. else
61. case ( Current )
62.
63. R1 : //scan row1
64. begin
65. rSMG <= One; rRow <=_R1;
66. //each active low of STCP, end of one row scaning.
67. if( !STCP ) Next <= R2;
68. else Next <= R1;
69. end
70.
71. R2 : //scan row2
72. begin
73. rSMG <= Ten; rRow <=_R2;
74. if( !STCP ) Next <= R3;
75. else Next <= R2;
76. end
77.
78. R3 : //scan row3
79. begin
80. rSMG <= Hundred; rRow <=_R3;
81. if( !STCP ) Next <= R4;
82. else Next <= R3;
83. end
84.
85. R4 : //scan row4
86. begin
87. rSMG <= Thousand; rRow <=_R4;
88. if( !STCP ) Next <= R1;
89. else Next <= R4;
90. end
91.
92. endcase
93.
94. /************************************************/
95.
96. wire Done_Sig;
97. wire Send_Sig;
98. wire [7:0]DI;
99.
100. //construct module
101.
102. spi_controller u1
103. (
104. .SMG_Code( rSMG ), // in - link in to u1
105. .Row_Code( rRow ), // in - link in to u1
106. .CLK( CLK ), // in - global link in
107. .RST( RST ), // in - global link in
108. .STCP( STCP ), // out - global link out
109. .Done_Sig( Done_Sig ), // in - u2 link to u1
110. .Send_Sig( Send_Sig ), // out - u1 link to u2
111. .DI( DI ) // out - u1 link to u2
112. );
113.
114. spi_module u2
115. (
116. .CLK( CLK ), // in - global link in
117. .RST( RST ), // in - global link in
118. .Done_Sig( Done_Sig ), // out - u2 link to u1
119. .Send_Sig( Send_Sig ), // in - u1 link to u2
120. .DI( DI ), // in - u1 link to u2
121. .SDO( SDO ), //global link out
122. .SCL( SCL ) //global link out
123. );
124.
125.
126.endmodule
1. 从第4行可以看到,多出4个输入口“Thousand”,“Hundred”,“Ten”,“One”。然后在第11~14行声明。
2. 在65行,73行,80行,87行“rSMG”的右操作数被修改了。
Testbench代码:
1.`timescale 1 ns/ 1 ns
2.module SMG_Interface_vlg_tst();
3.
4. reg CLK;
5. reg [25:0] Data_In;
6. reg RST;
7.
8. wire SCL;
9. wire SDO;
10. wire STCP;
11.
12. SMG_Interface i1
13. (
14. .CLK(CLK),
15. .Data_In(Data_In),
16. .RST(RST),
17. .SCL(SCL),
18. .SDO(SDO),
19. .STCP(STCP)
20. );
21.
22. initial
23. begin RST = 0; #100; RST = 1; end
24.
25. initial
26. begin CLK = 0; forever #10 CLK = ~CLK; end
27.
28. initial
29. begin Data_In = 26'd4321; end
30.
31.endmodule
仿真载图:
注意SDO的输出,第一个16BIT是“数字4”的数码管码和“右边起第一个”位选码。
第二个16BIT是“数字3”的数码管码和“右边起第二个”位选码。
第三个16BIT是“数字2”的数码管码和“右边起第三个”位选码。
第四个16BIT是“数字1”的数码管码和“右边起第四个”位选码。
m( 囧 )m 对不起,本章笔记没有“问题和答案”和“仿真”。
源码:
用户1373959 2010-5-19 22:34