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 Iuse IEEE.STD_LOGIC_ARITH.ALL;
, k' ^! A' A% iuse IEEE.STD_LOGIC_UNSIGNED.ALL;
! N; a2 h- K7 H3 M7 Y# P1 fentity 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) Yend 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+ [! }! Fbegin
. 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") then8 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") then6 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