EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
今天给大侠带来FPGA设计中,对SPI进行参数化结构设计,话不多说,上货。
& d9 H1 e# H& d! d% ^3 W
7 ^: C6 ^1 H" Z* H/ H( C! J1 w$ E/ x" w1 g. n
; r0 f9 `/ C: L z$ T/ e/ R) x
" V' I5 R) D# s; q: l" w; ] 为了避免每次SPI驱动重写,直接参数化,尽量一劳永逸。SPI master有啥用呢,你发现各种外围芯片的配置一般都是通过SPI配置的,只不过有三线和四线。SPI slave有什么用呢,当外部主机(cpu)要读取FPGA内部寄存器值,那就很有用了,FPGA寄存器就相当于RAM,cpu通过SPI寻址读写数据。代码仅供参考,勿做商业用途。
% P- Y4 n5 q5 r9 Z* Z r/ L! Z
- {& l# h7 i- x& t2 K- L5 y# o8 W5 w% t! B# F# y+ i# z
- V% U* Q. z2 T9 h5 U' i* F
0 Q9 T6 e- o* X1 ?) M1 }/ {SPI salve
$ A7 {; ]( O2 f7 o% z. dSPI salve支持功能: 1 Q5 D$ }) r6 @% y/ O3 e
支持三线SPI或者四线SPI。通过define切换。
: D P0 ?& l3 Q& R) } 支持指令长度、帧长自定义。
& g+ [( \1 F. _, {' X3 W 工作时钟可自定义,大于SPI clk的2倍。 ' L3 a8 N5 d5 M6 \1 M: h
9 y6 y* z3 Q6 u+ O9 G$ m3 C
! g; Z" n+ H2 ~9 F# s1 O$ Q" U4 k8 J% q6 u* e+ ~2 S# Y
用户只需修改: . a8 B _( ]/ _
(1)几线SPI。 (2)单帧长度。 (3)指令长度。 (4)寄存器开辟。
' Z) d: p" c/ G
注意:指令最高bit表示读写,低写高读,其余bit表示地址。指令接着为数据端,两者位宽之和即为SPI单帧长。
5 ~. b) q2 C$ p
2 P+ W8 D9 D( u& `+ j
# @( r7 g) m' Q6 ?, H+ \
4 r; X+ ^6 b* q5 {* h! A. ], J
: k/ I% p; h9 Z8 D" Y
SPI master
8 L. y8 W& r2 B* k: {! U
" n5 o' n/ ?4 }4 H8 vspi master内部仅仅封装SPI驱动,写入值读出控制由上层控制,这部分逻辑很simple,不赘述。用户只需给入SPI帧及控制使能即可。
# W- ^: X/ z! b! J
用户只需修改parameter参数: 9 R) N: m5 I1 v `2 z4 K- G
(1)单帧长; (2)指令长; (3)数据长; (4)工作时钟; (5)SPI clk。
2 F5 \. V, A; J' Z% _, e* | 1 ?) a, l2 A- d: R& }
实现不使用状态机,采用线性序列计数法。 6 Q' C, D6 ~$ |* \ a+ _! `
# L( d" |: L8 b! z4 G
3 w8 Z& W6 d# _2 e1 w) B+ f& q
2 m! {6 H8 o" E4 g: r" v
- ]. L+ U* V# b# \& K' v2 G% p
- ?% x, \- S8 ]- ~/ V, s! Y
仿真如下所示:写入四个寄存器值,再读出。
& O% F ~ J4 V % T3 O& _/ g2 \9 X& o
仿真代码如下: 5 w( ^" z; U7 ?; [+ r: z1 j
. O! a2 r& u6 ^8 n6 @2 i
% ^6 E2 k) V2 u5 U% V: ?) W# K7 T, H$ N- n% ^# X7 T* N" @
/ U u) M2 ^' H& F/ p/ o
三线SPI: 1 [4 d+ @0 q0 u C( a: z$ S
1 E. L7 f/ Z1 ^, \1 N1 m1 }
% g/ k( ~. c9 ^2 c4 b0 m
& b5 r' k& f, \! v
0 t, [! k& a% Q& w f( z2 P
* a3 e! T, C9 {+ n+ n4 p: c
7 ]) _8 |6 }: t
四线SPI:
; X; [" x& h& R, _
5 i& X2 h+ V: x: J( s
1 g3 {8 t( d1 M& e# c
' q5 P/ p- X0 ]# Z( P$ h
* k/ M# _$ W7 r3 r) I* [" v+ O
可以看到读写是一致的,验证通过。 7 D1 e0 x. k' L8 `& B' E/ n) W
|