EDA365电子工程师网
标题:
SPI程序问题
[打印本页]
作者:
jiaohuang2004
时间:
2011-3-19 05:12
标题:
SPI程序问题
library IEEE;
0 O/ f6 o6 S2 C+ Q6 L {- U
use IEEE.STD_LOGIC_1164.ALL;
) V, S* t% y. `0 z, w0 I
use IEEE.STD_LOGIC_ARITH.ALL;
, k' ^! A' A% i
use IEEE.STD_LOGIC_UNSIGNED.ALL;
! N; a2 h- K7 H3 M7 Y# P1 f
entity spi is
1 z6 i- ?7 L' _2 ~7 v
port
6 K2 R+ J2 p [6 m, P# _
(
2 o% g; r0 M9 s2 Z9 e! l* H B j
reset : in std_logic; --global reset signal
4 q, x! N i) ^8 S% u
sysclk : in std_logic; -- systerm clock
! p* w a2 x) B" G) ~" l
data_in : in std_logic_vector(13 downto 0);
' R- V" t9 E7 H; p4 h
spi_o : out std_logic;
, p" L2 ?2 ^, Y g# m- `7 e U3 D
sck_out : out std_logic;
4 g1 F7 n6 Q$ T, R) W
ss_n : out std_logic_vector(1 downto 0)
* D& [+ a* Z7 U+ N0 x# T$ r
);
" {' ~) ?) g* ^4 L) Y
end spi;
7 u4 C- t. T" r& F
architecture b of spi is
$ |! F8 T% I7 [# T1 r; P0 Q
type state_type is (idle,shift,stop); -- data type define
/ O7 s T( R! f( Q
signal state : state_type;
5 [$ h; n& c% z& z$ F8 l: T
signal out_reg : std_logic_vector(13 downto 0):=(others=>'0');
1 d8 T( Z! k' O6 U
signal clkdiv_cnt : std_logic_vector(3 downto 0) :=(others=>'0');
, J9 ^ l- W5 M, P
signal bit_cnt : std_logic_vector(3 downto 0) :=(others=>'0');
4 q- U$ r! G' v
signal sck_o : std_logic;
4 |$ M. j4 \- {) _) U7 |' { n" b# g* u
signal full : std_logic;
) n3 V7 C2 ?) d: K
6 t3 g' Q. M: C+ [! }! F
begin
. K. b; y1 g& E8 C
sck_out <= sck_o;
+ T) _4 a* M/ C: w( U
process(sysclk)
1 s2 q- ^" d S: R, Z
begin
' E. A. P( z# D6 H: e& ?+ m! c; ~# m
if (sysclk'event and sysclk = '1') then --reset
4 V$ l5 L2 Z2 B, l0 n
if (reset = '1') then
' a; W3 f. b2 Q' ?
ss_n <= (others=>'1'); --AD5553 idle CS =1
/ S) `4 ]" b7 m G4 q
out_reg <= (others=>'0');
/ Q+ V9 R% o$ a3 [" Y" t( E
clkdiv_cnt <= (others=>'0');
, N5 G9 E# X. a8 z) U
bit_cnt <= (others=>'0');
* q& g5 E+ R' w% _# \5 p
spi_o <= '1';
|& Z. u; h W& ^; q8 J
sck_o <= '0'; -- AD5553 SCK idle is 0
% d, l- e6 S5 R0 q7 @
state <= idle;
+ [( D9 j/ c% _& Y1 {. r7 I5 F
full <= '0';
, Y+ }9 `) K3 q8 I4 t. ~: V9 C% r; t
else
/ w$ F5 Z+ Y" q
if(full = '0') then
( w( ]; {$ B& Q4 ]
out_reg <= data_in ;
3 T, l# {8 z0 G5 p' X; c: G
full <= '1';
! R0 O8 H& H: Z# p+ h H
end if;
, O# ]& c2 E" O1 s: H
, G0 [8 s+ j& |+ m' e2 Z( h
case state is
2 H8 y) }$ v) L
when idle =>
8 O( l; b) c9 E# q" G- `
' T5 C. D0 Q( ^( V, W, k' q: h' w% y. I
state <= shift;
" |" e- e% m; I" I; Q& l& L t
spi_o <= out_reg(13);
, I% o2 O0 U4 @2 j
out_reg <= out_reg(12 downto 0) & '0';
4 }$ t+ x$ Y' b/ o, s8 z7 J
sck_o <= '0';
7 M) P6 b, N* K
when shift =>
; W$ T5 v+ Z/ g# w1 ^* G
clkdiv_cnt <= clkdiv_cnt + '1';
5 }4 I! d) k: G6 ^4 }0 r
if (clkdiv_cnt(2 downto 0)="111") then
8 V/ I$ {/ d% U9 X# o1 `
sck_o <= not sck_o;
1 }, p7 I: \$ ~+ D0 L# [
end if;
- x/ G' P P6 l" \2 Y* {
8 L9 O. z8 }0 ]
if (clkdiv_cnt = "1111") then
& `1 }* b$ |3 ]" }' z$ M, Q1 U( R
spi_o <= out_reg(13);
' L) C6 ^' A, L8 u) P0 f) D$ K
out_reg <= out_reg(12 downto 0) & '0';
; u8 H7 K! Z3 N' x- e7 C/ H* ^
bit_cnt <= bit_cnt + '1';
8 S, A: p* U- u0 M9 H
end if;
. D! r! `1 G2 y `% A) O
9 k! | f- |& W0 H
if (bit_cnt="1110" and clkdiv_cnt = "1111") then
6 H5 C$ u+ V1 e: @4 [' h9 u R
state <= stop;
2 n/ {# z1 _1 m* x! H
sck_o <= '0';
; J! z0 E& D/ e/ _' a% z" y
spi_o <= '1';
& e& n U+ Y+ q1 f# m
end if;
r; W% H$ C, T" I% s) v1 S# i
6 D( G5 h* ]. [, I4 U
when stop =>
5 V- X S W" \8 ]! E# g
state <= idle;
8 i; Q' b+ n" Q! ~
sck_o <= '0';
& b' s0 ^4 v( m3 F) w5 [
spi_o <= '1';
6 z3 H" L: j7 `2 i
clkdiv_cnt <= (others=>'0');
+ h! K7 r% c4 n( e
bit_cnt <= (others=>'0');
2 c& G- T. _! `- l3 {6 ]7 X& i
full <= '0';
2 }* _' _, [7 @& ]1 q
when others =>
" T+ C( D+ r( l
state <= idle;
R4 m/ M- f. t4 K9 v" |3 [* p1 ?
end case;
9 s$ f) `( I U1 H8 l
end if;
/ ]7 ~2 P. C% ~% @( c/ c K9 x
end if;
" r# ~# R. F. h# S
end process;
1 ?7 P+ G) j1 g$ ~! [
end b;
. [9 W: x7 R* M( H" t3 g M
' s G9 V A7 y; F+ b F
' W5 {$ r) L/ ?) p2 A/ g/ _
其中out_reg 一直是0,在idle状态赋不上值,大家看是怎么回事
( D" \6 l# i5 M' [% j+ B
欢迎光临 EDA365电子工程师网 (http://bbs.elecnest.cn/)
Powered by Discuz! X3.2