EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
今天给大侠带来FPGA设计中,对SPI进行参数化结构设计,话不多说,上货。 ; [6 K+ x7 v! x2 _8 O4 b
: W! P6 [' s1 _6 v" H
/ v% Y. x0 g1 B" X" b+ f
2 {: a0 z |+ t# f! z
" v6 C% L% u1 T- n+ r4 E 为了避免每次SPI驱动重写,直接参数化,尽量一劳永逸。SPI master有啥用呢,你发现各种外围芯片的配置一般都是通过SPI配置的,只不过有三线和四线。SPI slave有什么用呢,当外部主机(cpu)要读取FPGA内部寄存器值,那就很有用了,FPGA寄存器就相当于RAM,cpu通过SPI寻址读写数据。代码仅供参考,勿做商业用途。
" n# G& t. ?. y" t' ~% @
/ V; B5 S0 {6 V9 ?" T3 ~& U& }' p" T& `$ X* Q7 V t
4 A6 i. X" C# Q# m1 Q) w# ]$ P& b" Z& @5 W
SPI salve
8 H' U, Q, K$ O: A& NSPI salve支持功能:
" y) U2 ` F/ Y. \
支持三线SPI或者四线SPI。通过define切换。 : {! }; I5 g( W- _9 s8 k+ y0 M. @
支持指令长度、帧长自定义。
1 m4 q% p' c+ ]% K4 x6 w 工作时钟可自定义,大于SPI clk的2倍。
2 i& d+ N0 M# |' P( t6 K. r7 D1 f9 Z0 A$ o
1 e$ [# j6 D7 Q$ ~ c
, m. Q9 c/ m/ l3 _$ `
用户只需修改:
3 K' X& F+ F' y+ ]! o0 W0 S
(1)几线SPI。 (2)单帧长度。 (3)指令长度。 (4)寄存器开辟。 2 U8 _+ r8 Q! P! j
注意:指令最高bit表示读写,低写高读,其余bit表示地址。指令接着为数据端,两者位宽之和即为SPI单帧长。 ' r6 h& K% K/ f- L9 t! o$ M
3 [5 o) T1 h4 l* H: P- o6 x
2 u; Z5 H, K5 a! `. J/ o* `
) _. Z9 s' F2 m* K
5 e2 j& r5 Z! F: w( z! a
SPI master
, }. M4 x! a0 C" J! U2 i4 \7 z3 F/ s0 d- I" F, J# K8 m+ {+ S/ q4 u
spi master内部仅仅封装SPI驱动,写入值读出控制由上层控制,这部分逻辑很simple,不赘述。用户只需给入SPI帧及控制使能即可。 $ F I5 G, @7 _) k! a( Q
用户只需修改parameter参数: 8 |2 [# ]) _' L: v8 w
(1)单帧长; (2)指令长; (3)数据长; (4)工作时钟; (5)SPI clk。 ( I, ^, U; |( M: Z
9 }) F& l e- E1 u( d7 G) X
实现不使用状态机,采用线性序列计数法。 ) G- {: ?5 c$ [) d M
! o: H7 U! S3 {- x$ @
" P' F) B* B( H* A5 C% ?, _
& q' c% C9 P! w6 m8 f2 z
3 b0 J) E; p% I/ @2 p7 I8 A
& T$ w* `0 f2 x
仿真如下所示:写入四个寄存器值,再读出。
( ]; Q5 @* w1 L8 F: \ $ J, {$ G* o! J y7 c
仿真代码如下: 7 ^; p, y! |* z: K' K F
9 l' V6 G9 F1 N0 F [- m1 }1 q% _
5 a3 p" V# w7 e& p/ q3 }( g( w! w
9 V9 r/ X0 W+ k* y* e7 m0 J, D4 t- \
* `4 \# X+ ?6 l s6 K! Q
三线SPI: 5 B: h. |/ `. M3 y) ~4 v, `! N8 v% Z
6 _2 h& r* I. S+ j9 J) w
1 |' j& s, |* |
1 a* R+ Z1 H7 |' u! H
/ Z. `* E6 b0 K6 v: M
* J' ]2 L' F J( b& w
6 U1 A" k0 \: u) l! d) N2 I" ~
四线SPI:
& l" g# }' v" C3 v" l1 e
" \$ ]' K6 T7 j7 U8 @8 ]! ~. D
7 k+ A8 ]! r" d I
' M% ]% h; a" l) ^
# {: k7 U: _; ~: M+ d5 P& \
可以看到读写是一致的,验证通过。
/ Y+ _2 l+ L# ?" r& N/ i4 t: {1 H |