SPI控制模块是专门针对SF-EP1V2的显示电路设计的。更具原理 SF-EP1V2 的显示电路是由2个74HC595来驱动。两个74HC595芯片串联变成16位,高八位为“数码管码”,底八位(BIT1~BIT3有效而已)是位选码。根据上一章的实验,我们设计的SPI发送模块,是以1字节来发送。所以呢,SPI控制器的工作是:
1. 控制发送数码管码。
2. 控制发送位选码。
3. 发送锁存信号(STCP)。
SPI控制模块示意图如上。
1.module spi_controller
2.(
3. RST, CLK, Send_Sig, Done_Sig, DI, STCP
4.);
5.
6. input RST;
7. input CLK;
8. input Done_Sig;
9. output [7:0]DI;
10. output Send_Sig;
11. output STCP;
12.
13. /*****************************************/
14.
15. parameter _0 = 7'h3f, _1 = 7'h06, _2 = 7'h5b, _3 = 7'h4f, _4 = 7'h66;
16.
17. parameter _R1 = 8'b1111_0111, _R2 = 8'b1111_1011,
18. _R3 = 8'b1111_1101, _R4 = 8'b1111_1110;
19.
20. /*****************************************/
21.
22. parameter D1 = 4'd1, R1 = 4'd2, STa = 4'd3, STb = 4'd4;
23.
24. /*****************************************/
25. reg [3:0]Current;
26. reg [3:0]Next;
27. reg [7:0]rData;
28. reg rSTCP;
29. reg isSend;
30.
31. /*****************************************/
32.
33. always @ ( posedge CLK or negedge RST )
34. if( !RST )
35. Current <= D1;
36. else
37. Current <= Next;
38.
39. always @ ( posedge CLK or negedge RST )
40. if( !RST )
41. begin
42. Next <= D1;
43. isSend <= 0;
44. rData <= 8'd0;
45. rSTCP <= 1'b1;
46. end
47. else
48. case ( Current )
49.
50. D1 :
51. begin
52. isSend <= 1; rData <= _4;
53. if( Done_Sig ) begin isSend <= 1'b0; Next <= R1; end
54. else Next <= D1;
55. end
56.
57. R1 :
58. begin
59. isSend <= 1; rData <= _R1;
60. if( Done_Sig ) begin isSend <= 1'b0; Next <= STa; end
61. else Next <= R1;
62. end
63.
64. STa :
65. begin
66. rSTCP <= 1'b0;
67. Next <= STb;
68. end
69.
70. STb :
71. begin
72. rSTCP <= 1'b1;
73. Next <= D1;
74. end
75.
76. endcase
77.
78. assign STCP = rSTCP;
79. assign DI = rData;
80. assign Send_Sig = isSend;
81.
82. /*****************************************/
83.
84.endmodule
1. 第1行到11行是大家熟悉的声明了,这里就不多做介绍了。
2. 第15行是“数码管码”的常量,而17~18行是“为选码”的常量。
3. 第31行到82行,是状态机。
状态机的第一步是发送“数码管码”和置一“isSend”寄存器(52行)。然后判断是否已
经发送结束, 如果发送一个字节已经结束,不使能“isSend”寄存器,然后进入下一个状
态(53行)“R1”,否则的话就一直逗留在同一个状态“D1”(54行)。
状态机的第二步是发送“位选码”和置一“isSend”寄存器(59行)。然后判断是否已经
发送结束?如果发送一个字节已经结束,不使能“isSend”寄存器,然后进入下一个状态
(60行)“STa”,否则的话就一直逗留在同一个状态“R1”(61行)。
状态机的第三步是拉低“rSTCP”寄存器(64行)。然后进入下一步状态(67)“STb”。
状态机的第四步是拉高“rSTCP”寄存器(70行)。然后进入下一步状态(73)“D1”。
4. 当状态机进行从第三步到第四步的时候,就会产生一个锁存信号。所以,rSTCP的初始
值必须为1。
5. 如果一直重复着状态机,就会产生扫描的效果。
6. 我们来谈论一下有关“rSTCP”寄存器的初始化。根据74HC595芯片的时序,STCP信号
时上升沿有效, 所以,“rSTCP”寄存器的初始值必须为1(45行)。
这一章不能仿真 m( _ _ )m 。
问题与答案:
问1: 看了第一章实验和第二章实验,如“rSCL”和“rSTCP”寄存器。为什么初始化为1?
答:你尝试想象一下,“rSCL”和“rSTCP”寄存器如果不初始化为逻辑1吗,那么设计会
大大的猥琐起来。
问2:为什么不能这一章不能仿真?
答:啊!别急,下一章会有的。
总结:
这一章比较容易,也比较简单。所以没有什么好说的。
用户1373959 2010-5-18 21:29