EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
今天给大侠带来FPGA设计中,对SPI进行参数化结构设计,话不多说,上货。
0 P: T/ c* y6 }6 |2 y
( P" w/ b, \3 L H0 G) g6 e1 \. B
: f$ X) e& W& ]) k) z% N/ {! J
9 M* Z8 z3 Y* i& E0 c: L/ e2 ]" ?
为了避免每次SPI驱动重写,直接参数化,尽量一劳永逸。SPI master有啥用呢,你发现各种外围芯片的配置一般都是通过SPI配置的,只不过有三线和四线。SPI slave有什么用呢,当外部主机(cpu)要读取FPGA内部寄存器值,那就很有用了,FPGA寄存器就相当于RAM,cpu通过SPI寻址读写数据。代码仅供参考,勿做商业用途。 5 O8 K+ A: v/ ?8 C! ?2 X# v
. L/ V H( ~# X9 k- p8 h" z( C9 Q" Z7 I
( Y7 `; s4 x6 k9 O$ {
. q4 G) k$ b- B/ f E3 Z: R7 I. ~3 x' p
SPI salve
0 [+ k: ?* V9 n& T( S+ nSPI salve支持功能: 7 V' X0 ~3 h; h' R' L6 u' d) q
支持三线SPI或者四线SPI。通过define切换。 3 Q+ p' f! s. V$ B
支持指令长度、帧长自定义。 " c$ i9 g: O0 X, W7 @& Y; ]
工作时钟可自定义,大于SPI clk的2倍。 # e9 Z- g- Q; J
$ @' i1 x0 @/ r, q+ T# j. h1 X; G* [8 a# I
; y1 E7 G1 P2 P! w4 u6 g
用户只需修改: % o3 {2 v( W. Y! g% G! M6 |
(1)几线SPI。 (2)单帧长度。 (3)指令长度。 (4)寄存器开辟。 3 l) ~+ v9 m& X/ t9 {
注意:指令最高bit表示读写,低写高读,其余bit表示地址。指令接着为数据端,两者位宽之和即为SPI单帧长。
' A( ]* ]0 ^+ o( x- u3 l5 S
( V5 Z9 f; p8 W: j
: S/ G- q) c+ F! @
2 Q, y# c7 y+ V
5 I' n$ y# Z8 J5 f' k+ J4 h1 ?
SPI master 6 I$ ]2 x% x8 Q* x0 }# w, `
2 ^* T; t: M+ E( y& a& e$ n; Pspi master内部仅仅封装SPI驱动,写入值读出控制由上层控制,这部分逻辑很simple,不赘述。用户只需给入SPI帧及控制使能即可。 ! S$ @- Y2 [$ \7 E& ^; ]% ?# s! x
用户只需修改parameter参数: / g% t7 I5 D# V- f
(1)单帧长; (2)指令长; (3)数据长; (4)工作时钟; (5)SPI clk。 5 {5 M# ~1 x/ H' f. Q
' E8 g% w- n7 p) s1 Q( R实现不使用状态机,采用线性序列计数法。 ( Y- {* _* u5 N7 _
% o) \; y* C# C
4 R; w/ S! y' F
; A! \9 N) y @9 N$ c
+ \% v1 t5 L) L4 Y5 z1 O
% S9 R2 X/ T8 c1 y
仿真如下所示:写入四个寄存器值,再读出。
3 m& j5 b1 Y$ M9 o7 e $ d( N% _) [& v
仿真代码如下:
) {+ p, Q% V3 y/ g5 \5 B4 Q
4 g' z q6 s6 S. V" ~5 K! T/ A
. [4 E; f+ Y- |8 q: r5 D* q
, N) M/ E7 D6 R! O
2 M/ \ b; J, ]: ^) o- x& }8 O' E
三线SPI:
/ i3 s$ Y, K' }% d% D/ d' B. m, a
% U! a6 Z" z% b/ _; q% Q& ^
( e' z( ~& f R& c
4 C4 D# `6 K& c8 Q
0 o9 @# W; h9 r+ N4 ]
) K' ~1 Q" v: c; Z3 X: \
8 ? Z3 k8 S% o5 e6 [. I9 D
四线SPI:
" i3 D2 r& @+ D, n" }
" v; }8 B& v( g2 t; p2 h5 [& t
4 y& o; }; G* {$ t2 U
2 Y1 Z X1 `' ]$ I" P- ]
1 ?2 Y. [ u) A( [) b
可以看到读写是一致的,验证通过。 % D8 B% _, t& J2 n
|