|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
library IEEE;
: E/ S U, v. g1 Suse IEEE.STD_LOGIC_1164.ALL;. J9 ]7 ]) e1 Z$ n+ ]; i
use IEEE.STD_LOGIC_ARITH.ALL;) ~, S1 W" m% C3 W0 g: l
use IEEE.STD_LOGIC_UNSIGNED.ALL;6 y( r' l. y- J9 w
entity spi is - Z) c/ [0 A, X9 x4 Y# z" ^
port
0 X5 m: U# C/ s- P6 z* e (/ ~! A1 \7 z0 a. K4 x* t! z
reset : in std_logic; --global reset signal
7 I/ c3 k, _4 Y, l; y+ s sysclk : in std_logic; -- systerm clock i! K; S; Z, Y* p4 @) u4 K1 q
data_in : in std_logic_vector(13 downto 0);
$ S3 m1 {+ Q, F5 Z* p spi_o : out std_logic;1 Y. B& E* V1 L" m' m, `0 N
sck_out : out std_logic;
' _# |4 X8 \: _ ss_n : out std_logic_vector(1 downto 0)& d4 Y9 A4 i( K \
);# n) Y' E- ?8 g. v& E' |" q' R- v& Q
end spi;% P: U( c5 J/ i; F" W
architecture b of spi is
$ _) g& ^3 y" C0 b! U! j" E0 N! b" g type state_type is (idle,shift,stop); -- data type define
5 f/ I8 t8 G# y, S5 S6 D' { signal state : state_type;
( T& A3 _. ~2 i+ I6 I. r( G signal out_reg : std_logic_vector(13 downto 0):=(others=>'0');) s/ Z7 l2 `! i0 g. h, R, S
signal clkdiv_cnt : std_logic_vector(3 downto 0) :=(others=>'0');- B6 g3 P1 h$ f% `7 [
signal bit_cnt : std_logic_vector(3 downto 0) :=(others=>'0');
$ y# S8 b: G& ^( ^; A* T signal sck_o : std_logic;. M+ h6 t* }! t8 `4 B7 T7 A
signal full : std_logic;' j. d5 @! s7 K/ q0 Z; D$ r( C
# }( o) u, e1 W/ r
begin# P J- M9 k% y
sck_out <= sck_o;
, E$ N* G( G% E6 C process(sysclk)/ M; n$ @! J0 w9 ]( S9 N$ b2 v. P) @7 `
begin; j( C" ~$ i8 U/ E
if (sysclk'event and sysclk = '1') then --reset
4 h, V8 N" t' G& L) ?) f if (reset = '1') then, U# Z9 p2 O- P$ q
ss_n <= (others=>'1'); --AD5553 idle CS =19 o Z# O% g* A9 i5 o% _) d! G, H
out_reg <= (others=>'0');
8 s: o/ ~1 w: y. V clkdiv_cnt <= (others=>'0');
- @- e4 R+ r) o4 E i4 Z5 k bit_cnt <= (others=>'0');8 k0 Z, B$ U1 A; i) X
spi_o <= '1';
( a! U3 b$ M7 g& z sck_o <= '0'; -- AD5553 SCK idle is 0: x( `6 @5 h# J S9 x8 M
state <= idle;/ }& J1 h" v. X4 f- S
full <= '0';8 c' f. w0 u3 R2 o- M1 v
else
/ L E% a4 m% f$ X( {4 R% C if(full = '0') then1 j' o. e+ ~0 ]& G% W
out_reg <= data_in ;
* M% }# l% S' K# H+ y6 t1 M* K2 O full <= '1';
4 O3 a0 @& F' A ]- A end if;8 F; r5 d3 p+ ]0 _1 U
4 _- z" Q; Z1 T' k3 \2 x case state is 7 T4 v# W8 \, Z5 j
when idle =>* t; j1 i9 _7 U1 @' V* k$ s4 i
5 G8 X0 o: z+ q; x I/ L8 z* x* Z% ] state <= shift;3 q: W& m; l4 T7 o" n
spi_o <= out_reg(13);( I/ V3 a( @- c4 q9 e& t
out_reg <= out_reg(12 downto 0) & '0';
4 C$ G' \5 y; x& U/ e" Q8 j" q sck_o <= '0';
0 s0 x# v8 a* z% N/ i: z* k when shift =>* v) [: T! S2 i/ i! U
clkdiv_cnt <= clkdiv_cnt + '1';
! [8 f5 B3 ?1 ^+ W' M if (clkdiv_cnt(2 downto 0)="111") then
' ~( t; ]0 k* T% _; A7 R+ o* ` sck_o <= not sck_o;
% R- v( z% x) _! h) R/ C- b$ n- a end if;
$ Z4 e" e2 Z! F) D9 K6 L, e2 _
9 {0 `9 w0 T/ h3 ?( M5 y if (clkdiv_cnt = "1111") then
0 z1 a8 u/ `! _ spi_o <= out_reg(13);
- H: Z/ d& V+ k, n* e; g8 x6 q( L out_reg <= out_reg(12 downto 0) & '0';# j6 b$ G: g( ^) f
bit_cnt <= bit_cnt + '1';/ p) y* V* b, T4 q, B* O4 y
end if;
7 e$ v9 V: `- A+ b 0 f/ a9 k9 A2 T
if (bit_cnt="1110" and clkdiv_cnt = "1111") then
: @1 u, L3 S# t% w- n! @' t state <= stop;) A6 c% w+ `- Q
sck_o <= '0';
/ I- P5 E6 o! E* m" D! C, s0 Z9 s spi_o <= '1';
0 n$ O# n C+ z. p ?. h5 O' r) D end if;& g& r4 e5 b8 E
* V$ H- x% t# f9 H when stop =>
: P3 h: B0 N4 h' e2 k& \" a) s state <= idle;, | \2 T |! t4 q r: U- y
sck_o <= '0';
* X& j& T+ z! y7 D" m! _ spi_o <= '1';
5 _" F; J; @3 t7 z" K" i8 s clkdiv_cnt <= (others=>'0');
3 c4 O( A9 s9 m, |. h bit_cnt <= (others=>'0'); u' }1 S1 Q& E( g
full <= '0';
& l, l- `( J9 {5 d, H3 \& c when others =>) q# t) E8 x2 q, n( |; h
state <= idle;' S$ i5 ~' j/ G$ v n
end case;
0 F5 b& Q5 M+ B+ s2 ? end if;
5 R% x* T2 u2 m end if;9 U2 w$ G' ]6 U) X0 m1 J
end process;
$ E" o8 U0 \, |1 B1 M: M6 tend b;9 Y$ d9 J* t- R+ t% ^# }" T: i+ W) |
/ l+ N0 \! a% d9 C, ~
+ r3 n% ~ j* |其中out_reg 一直是0,在idle状态赋不上值,大家看是怎么回事
3 b4 a( u/ `+ x1 p |
|