找回密码
 注册
关于网站域名变更的通知
查看: 223|回复: 1
打印 上一主题 下一主题

FPGA 之 SPI

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-7-4 16:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 ulppknot 于 2019-7-4 16:50 编辑 7 c) c8 ^( z# s
9 c% N4 F8 T0 P8 e6 }9 j. ]  O4 q
module spi_ctrl(
! w% q( D2 ]& Y, D5 qinput wire        sclk,//系统时钟
5 h4 U) G; a- C& c2 G9 Iinput        wire        rst_n,
% x& R. u6 p" E. Q! n! p9 y* Finput        wire        work_en,
: h+ X1 s- h1 ~; ioutput        wire        spi_clk,
; `2 h  o! x6 \; M; b3 soutput        wire        spi_sdi,+ f1 B* ]' ^' M
output        wire        spi_csn,4 a: M; `! R* ~1 U3 V( K0 M. B8 ^1 _! f
input        wire        spi_sdo4 L% ]7 I# n. p7 G: p0 ]

4 t5 c2 S1 G& D- k  e7 |);
: I3 J4 \5 i5 h1 C" J' qparameter        IDLE = 5’b0_0001;
. d3 m; M+ \# V/ x+ Dparameter        WAIT = 5’b0_0010;% U+ l2 u2 k! {  [. u# J$ f! U7 d; b
parameter        R_MEM= 5’b0_0100;3 S! C3 G1 {. z3 @1 Q' v: }  T
parameter        W_REG= 5’b0_1000;# q8 e; P) b0 {! h+ W$ b" N7 D
parameter        STOP = 5’b0_0000;3 ?4 ~3 ^$ u' I& [% q

) J& Y4 U* n: H) w2 e4 gparameter        H_DIV_CYC        = 5’d25-1;//分频器(要给他写一个寄存器)实现分频50倍: D. R7 l6 N' ]. x8 j- K5 ?0 v7 u
1 s( _/ ?: u9 `) y4 P
reg        [4:0]        state;//状态机的寄存器变量,独热码,5个bit+ d7 T7 B! j9 h! x$ J! B" J5 o1 t
reg        [4:0]        div_cnt;  S3 `3 s9 _% c  J4 `
reg        clk_p=1’b1
3 f* X, ]# h0 dwire        clk_n;//输出数据的时钟上升沿输出(与sclk相位相反)
1 f' {) h* r! X) K# X8 D' v: @3 \reg        pose_flag;
9 i' w( U" c( b0 [  }+ h- [( k. lreg        [3:0]        wait_cnt;
6 P3 l$ \* g. K6 r. vreg        [3:0]        shift_cnt;//16位数据
! N9 }. y( q* k% V2 [* Y# Sreg        [4:0]        r_addr;
' E& V. T( P: @. l0 j9 T* m$ E# Uwire        [15:0]        r_data;
3 f  ?& o( w) B* k% _! ]wire        wren;
6 z: a' n) q! z0 S, ]3 s8 }) d- ?5 nreg        [15:0]        shif_buf;
' Q" v# r3 A2 @. }* ^$ F7 W6 Vreg        data_end;5 W6 g2 R8 H3 D" f1 U7 ^1 Y! B

8 M% c; \4 i  D' j//分频计数器
# H1 o) z( M: _6 ^5 u4 M" e( Lalways        @(posedge sclk or negedge rst_n)//异步组合逻辑
) @) \1 `: |: V: z' }& Uif(rst_n == 1’b0)
0 }( z# M7 O2 Y: j0 Mdiv_cnt <=5’d0;//复位的时候给他清零
( u* w* H% c4 Y; aelse if(div_cnt == H_DIV_CYC )//计到24的时候清0
) V; O( t4 V$ U7 }" [$ p0 Zdiv_cnt <= 'd0;  b' i3 n' ^0 P% |, v* |3 ?
else. c6 c. n! V4 _5 A% J
div_cnt <= div_cnt + 1’b1;//一个加法器(未达到最大值累加)5 \; _; [+ D8 Q8 n: F
//分频时钟不允许做寄存器的触发时钟,也就四不能写在alwaysk块的触发列表中
0 ^/ d7 n3 t( n/ V. m' Ialways        @(posedge sclk or negedge rst_n)( G' e1 `6 c( n9 @; |
if(rst_n == 1’b0)* t$ X! Q' ^, r& t  x& T
clk_p <= 1’b0;) F" o4 ^- i" a3 c
else if(div_cnt == H_DIV_CYC)# ^5 Y* @" I0 q1 d% ~
clk_p <= ~clk_p;//24反转一次一个周期就是507 a( C9 i# C. z; J

/ N/ W/ X0 \- sassign        clk_n=~clk_p;
' X+ v$ F1 }) C( f3 v: Z5 A% k+ O1 n7 ]7 b
always        @(posedge sclk or negedge rst_n)
/ e. s3 l2 p4 Mif(rst_n == 1’bo)
3 P% i: s, s! |2 o' zpose_flag <= 1’b0;0 ?* ?9 t3 Q( B- [$ F' g3 `/ s3 y& ]; y
else if(clk_p == 1’b0&&div_cnt == H_DIV_CYC)6 J1 R+ a) C' Q  |+ C+ h3 _! _
pose_flag <= 1’b1;
3 a3 A+ o. W& Y" Welse pose_flag <= 1’b0;, D" \2 k( b9 B, p+ u- i$ r$ g

" ?5 V% M& u# e1 ualways        @(posedge sclk or negedge rst_n)//wait# G& w& B+ p3 z/ Z
if(rst_n == 1’b0)
1 a" U  G# ^- r3 @' s& I5 ewait_cnt<='d0;
8 L% R6 Z+ K3 j* j' Ielse if(state == WAIT&&pose_flag == 1’b1)5 i2 K0 O1 e( G
wait_cnt <= wait_cnt + 1’b1;5 h; Y7 D0 ^2 C- O; ]+ o( O4 q
else if(state !=WAIT)9 y) w7 q- f+ c; Z2 B7 s3 L* c
wait_cnt <= 4’d0;
4 z: f" |1 S( u0 X+ K3 _; v; e  a( S  w) h1 Y6 N7 h3 l
//fsm两段式
$ }7 S! \. e# J  ~4 i- y, Aalways @(posedge sclk or negedge rst_n)$ ~& W" q* |2 G( I  N  P
if(rst_n == 1’b0)
0 W: W- q6 i7 K* w! pstate <= IDLE;: q2 |: t  w( m
else case(state)- X* U  C) Q7 P" V7 s1 E: V
IDLE :if(work_en == 1’b1)
8 l  ~. e$ d% bstate <= WAIT;( j! i8 @6 h( N
WAIT :if(wait_cnt[3] == 1’b1)//记到8的时候
' o# ?! @) p2 {6 J  \state <= R_MEM;
2 O  L/ N+ w4 d( p8 B# R# J  K1 AR_MEM:state <= W_REG;
+ M+ I! H. {8 L6 O4 N0 D* x5 RW_REG:if(shift_cnt == 4’d15&&pose_flag == 1&&data_end!=1’d1)//写16个biit8个命令8个数据1 q$ D* |* T6 l, l. }" a
state <= WAIT;
! A, |* `+ F, u3 E+ {# Gelse if(shift_cnt == 4’d15&&pose_flag == 1&&data_end =1’d1)" n9 P" V9 |# d) {8 Y+ A
state <= STOP;
- M  |0 \# F8 q7 ESTOP: state <= STOP;4 P* H+ c0 {8 t4 g9 l7 Q+ e
default:state <= IDLE;* n, c; V: s# @8 B: a
endcase
  [$ o7 a& _% U) P
5 r7 A) c. j* U6 _1 _5 ?always        @(posedge sclk or negedge rst_n)//移位寄存器* c9 t5 p' x7 ~
if(rst_n == 1’b0)1 |: _/ |5 q, v( V
shift_cnt <= 'd0;
8 s% ?3 m8 c+ |& Gelse if(state == W_REG && pose_flag == 1’b1)
/ }$ \' K! k- I; x% r7 |+ `3 Q5 Oshift_cnt <=shift_cnt +1’b1;
& [1 B, S# R  l& q# M* n1 p2 Q# O/ m' qelse if( state !=W_REG)% f0 @/ b' l, K3 E  r$ o9 r/ S7 j5 e
shift_cnt <= 4’d0;
( T3 |2 a" H% C% p; c# p% f" v" n- ~: P7 c; ]$ N* N
//读mem的地址产生* v: c7 N  g6 `
always        @(posedge sclk or negedge rst_n)
( m) W4 s4 i, V$ o2 W( nif(rst_n == 1’b0)        
- l! d! R2 k/ \. cr_addr <= 'd0;
' l; c7 \$ O4 B  R, b, y/ Aelse if(state == R_MEM)$ R; W$ U& T- W9 S# M
r_addr% o! o* M3 O+ f( }

: Q/ m) a& w# k- v! g. Bassign wren =1’b0;3 A5 t: l8 d- ^! h8 e$ i& t

. L. x3 \5 `* r2 G  L( T3 e( _always        @(posedge sclk or negedge rst_n)" ?- W6 e' E% z- m3 o/ [
if(rst_n == 1’b0)        
( Q  h0 e$ |! n: l9 Ishif_buf<='d0;
: E; A3 J+ r$ i3 {) kelse if(state == R_MEM)3 H' s! r) G7 V8 F
shif_buf<=r_data;
2 C5 c# {, b7 w9 D& y: ?else if(state == W_REG&&pose_flag ==1’b1)
4 v5 P6 B% q0 v8 m, q$ ~shif_buf <= {shif_buf[14:0]' e/ I7 O& Z5 G! b
0 ]  k- A- K' ]  w) {! d* s! G
ram_1632_sr        ram_1632_sr_inst (1 T; C7 ], w- j4 H) @4 g
.address ( address_sig ),//读地址5 g6 L* k# x/ w7 j" S) g) Q
.data ( 16’d0 ),//写数据' ^# T6 }7 p8 e! c
.inclock ( sclk ),7 f4 w& {& r) }& |
.wren ( wren ),//写使能高有效2 s+ w$ V2 W0 n4 v! E+ p
.q ( r_data )
; j( d* Y/ ^& B) C) _4 c' d7 _);
) u# z% O5 l* Z( C( g' s& V7 s9 J; A7 R8 V
endmodule0 j2 x* ?' E5 f2 ]0 S
3 V% K, P; d, O6 u; x# M
4 ~/ z: n" V6 }) f, b

该用户从未签到

2#
发表于 2019-7-4 16:51 | 只看该作者
谢谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-13 10:38 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表