|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
library IEEE;. {5 Q: [( _2 m/ n
use IEEE.STD_LOGIC_1164.ALL;
* `2 f/ l2 h4 A! A. s' L: w8 luse IEEE.STD_LOGIC_ARITH.ALL;
: c# ^. n; J4 X! _+ [% ^9 Yuse IEEE.STD_LOGIC_UNSIGNED.ALL;
9 N+ F A- }1 g; V w m: ] Dentity spi is 9 @# a# g6 ~* |+ t
port 3 p: ?( `3 R1 ^ c8 ` u, c
(9 ]$ c. \4 p( w. f% E
reset : in std_logic; --global reset signal
$ |4 {0 ?6 r- O9 F1 X9 O4 Q sysclk : in std_logic; -- systerm clock# [( Z# d3 d1 g; t/ v2 N4 d
data_in : in std_logic_vector(13 downto 0);
# J6 G+ F; D i; S3 K+ d! j spi_o : out std_logic;
9 H5 w3 i( @ c+ J+ e; W sck_out : out std_logic;
6 T( Q4 g# o# z* C% s ss_n : out std_logic_vector(1 downto 0)
. P: A, m3 a6 J: b3 j6 s );. ?6 f I$ S) b! D8 C- n, d
end spi;
2 c! n+ V# R% X+ d% harchitecture b of spi is
) x; p: v" A- S0 A( u type state_type is (idle,shift,stop); -- data type define1 V0 ?0 |9 ~7 M1 o+ }$ j- D
signal state : state_type;+ u9 {. G+ ]0 O* S1 i/ N
signal out_reg : std_logic_vector(13 downto 0):=(others=>'0');+ | y) h3 n9 e$ [* b8 L0 f7 i- L
signal clkdiv_cnt : std_logic_vector(3 downto 0) :=(others=>'0');# r" I% M" _3 t7 S0 l/ W2 [
signal bit_cnt : std_logic_vector(3 downto 0) :=(others=>'0');
) f( }+ u5 Y8 a2 w- j signal sck_o : std_logic;9 r6 X( u" x$ N' J2 F2 }7 K
signal full : std_logic;) t, p; c2 Z8 G+ i4 |
5 E- _9 J& M0 p% K1 m
begin
7 j' |& g4 L4 X7 l6 U sck_out <= sck_o;
2 k1 Z: n- m# d( i process(sysclk)* M. | k5 ?( d) b8 y1 g
begin* z9 U4 L8 R1 z: e3 v2 D7 P
if (sysclk'event and sysclk = '1') then --reset& s) b+ N( V9 m( J, B2 e
if (reset = '1') then- z$ v& \0 l8 y1 X+ }9 q7 `
ss_n <= (others=>'1'); --AD5553 idle CS =1
' R/ {$ f3 q# @ out_reg <= (others=>'0');
4 m: M. Q' H5 G9 h0 y clkdiv_cnt <= (others=>'0');' ~8 N/ F; D9 `* I u
bit_cnt <= (others=>'0');
7 S( T8 ]% f4 c9 B! G- z/ ^ spi_o <= '1';& n- z* h6 f6 i! Q- q$ a' D
sck_o <= '0'; -- AD5553 SCK idle is 09 ?6 z' }$ g" ?' u
state <= idle;/ J8 p2 t/ e; J8 V1 m$ W
full <= '0';
7 F' t9 ?/ y( K& w( K! } else
9 L/ G( m4 [7 T) L5 P if(full = '0') then
1 @/ l* |& u( j! g out_reg <= data_in ;
, q1 N3 P- }; \4 \8 C5 z+ v full <= '1';# M$ y9 v8 s4 {' b9 N0 f0 _5 c
end if;
( K" o1 m' y+ k* ]$ V0 F+ `
0 W, J% s, g' P; `; q' \ `3 a" {( q case state is # H) p+ k, \# R7 [2 c2 I
when idle =>$ S* v8 C% i9 X
3 G" j; O @, e' S
state <= shift;
5 |# Q6 H3 _$ L2 W spi_o <= out_reg(13);$ G& y& O6 N' k3 ]' K
out_reg <= out_reg(12 downto 0) & '0';
- d1 y- X+ l# B2 w$ r sck_o <= '0';
$ O6 k2 y! W6 p, e" i8 ^' A when shift =>! W$ Z% `2 b/ @0 j, z5 K
clkdiv_cnt <= clkdiv_cnt + '1';) ^: }; g+ t ]1 L" Z' B
if (clkdiv_cnt(2 downto 0)="111") then% J! x8 k$ {$ w5 E p5 [
sck_o <= not sck_o;
2 p, Q. u) R' x; O, I# o end if;, U, E7 D1 q [: V9 @
- O( u2 p/ z1 d6 |; A7 d8 d7 q0 m
if (clkdiv_cnt = "1111") then
3 O. E5 X6 c3 _, _4 D2 F9 w spi_o <= out_reg(13);* e {7 V7 E, s5 H1 U% F' }
out_reg <= out_reg(12 downto 0) & '0';( @5 R* ?1 ~' v
bit_cnt <= bit_cnt + '1';9 r# n5 j* L7 t4 X1 G5 A
end if;
2 `# X( Y* d2 ^1 x 7 { y. W& y5 T( [
if (bit_cnt="1110" and clkdiv_cnt = "1111") then3 B, j& h- I* P3 B1 Y# H0 V) Q5 G
state <= stop;
9 Z, [1 S: W* ]- t% Y$ R sck_o <= '0';9 z1 m2 ^! z6 G. c' I& t2 n e
spi_o <= '1';
2 N" w& |. f6 y& L0 U end if;
1 C [1 u" |8 B& r `/ D6 ~ ( t+ G- G; A4 A( Q, @2 n; d
when stop =>
2 t/ }4 t0 l* b. L- C- ~ state <= idle;
" j* G/ x6 ?" S! }" f* {3 T sck_o <= '0';
4 l6 T" T4 h' F5 I- A7 L spi_o <= '1';
* G& l1 c8 z! [! m clkdiv_cnt <= (others=>'0');
7 s( \9 \ V! r- d0 L bit_cnt <= (others=>'0');# T! s; G0 l* Y
full <= '0';7 j" C) E8 o0 g. r
when others =># B/ W0 [- c) l4 [! ^' i! j
state <= idle;. d; R4 p% W# ~1 X- Q& q
end case;. n6 a, I1 m2 Y/ r, ?: m
end if;, z t' f& e6 G3 ?. n% O+ \ u
end if;
) W8 j/ o/ I" B" R1 j3 { end process;
! X3 G4 {0 \: lend b;
2 q, q4 k2 w& R8 C4 S }1 c' Z2 y7 Y! g
3 w) p8 V, W4 |, l
$ \# ~! ?2 {( B( _0 b其中out_reg 一直是0,在idle状态赋不上值,大家看是怎么回事+ n- u8 a0 `" }( C# v
|
|