|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
三段式描述串口发送程序
9 b' `7 ^9 M0 z/ F4 L. D1 P, J k- J# J& W* X: G+ X" Y
LIBRARY IEEE;! ]4 Q, P1 i n# Z+ u# }
USE IEEE.STD_LOGIC_1164.ALL;
4 k$ K( a z) Z- tUSE IEEE.STD_LOGIC_ARITH.ALL;
7 l9 ?" y2 f8 ? t$ X7 Z, D, RUSE IEEE.STD_LOGIC_UNSIGNED.ALL;, k4 y7 p+ U' F8 K/ h+ f
--LIBRARY ALTERA;! d+ q9 y5 h0 Z0 z" N B |& U% p
--USE ALTERA.MAXPLUS2.ALL;
4 k" W z/ F) K. }( o- ]LIBRARY LPM;
* e- I( i- L2 U, D2 ?. g: lUSE LPM.LPM_COMPONENTS.ALL;
+ ~' r Y/ Y5 z6 l5 b) PENTITY Uart_Tx IS
5 M' @* k( i: W) i" G. P' [GENERIC(Tx_D_Width : POSITIVE := 8; Check: STRING:="Even";Check_En:STRING:="En");
+ N3 i, ]4 x/ S6 Z' vPORT
& w& E C# d4 ] Z2 I& W (
$ A% e' |1 F5 q5 w% k Clk: IN STD_LOGIC;
# r: N( u+ L7 O8 q3 y* i Rst: IN STD_LOGIC;
: \( |- L1 \; q _; _9 N( w( M
8 m6 N& X0 A5 f n1 x/ @ N Tx_En: IN STD_LOGIC;) t9 r( x9 d( X0 \
Tx_Data: IN STD_LOGIC_VECTOR(Tx_D_Width-1 DOWNTO 0);. k4 p* [2 }% T/ `( T! g1 D2 T
9 V7 U1 F& N8 T. q$ B2 y Tx_Busy: OUT STD_LOGIC;
2 H. L- V' S: A- I4 r7 K Txd : OUT STD_LOGIC0 x5 c* S6 e: h6 `5 z0 l
);
- \* R2 O) E+ } q/ t! F" y* vEND Uart_Tx;1 W' ?) T# K O. q/ }: s$ N% z, Q
ARCHITECTURE Arch_Uart_Tx OF Uart_Tx IS8 ]# X7 ^# F2 M3 ^' O
CONSTANT Start_Bit: STD_LOGIC:='0';7 a$ ^; g! B3 t; |
CONSTANT Stop_Bit : STD_LOGIC:='1';
! p+ h( e+ b) HSIGNAL TxData_Reg,TxShift_Reg: STD_LOGIC_VECTOR(Tx_D_Width-1 DOWNTO 0);2 r4 U! s' m/ p0 T* `* m
SIGNAL Par_Bit: STD_LOGIC;1 C3 g: `) S) ]7 q7 {
SIGNAL Tx_Data_Buffer:STD_LOGIC_VECTOR(Tx_D_Width+2 DOWNTO 0);/ O- R1 K& p- d+ |" L* n3 t O' f! X5 q9 N
TYPE State IS (Idle,Data_Ready,Tx_Pro,Start_Tx,Start_Even_Tx,Start_Odd_Tx,Data_Cal,Data_Shift,Tx_Over,Data_Get);
5 u3 I X: _3 n Y! S. |" mSIGNAL Tx_Current_State,Tx_Next_State : State ;8 [( }& s( i- M v( G5 z! T% `. l
SIGNAL Txd_Reg,Tx_Busy_Reg:STD_LOGIC;
; R! E6 U# e! c8 U) t# s3 bSIGNAL Tx_En_Reg: STD_LOGIC;
' {( u7 Y* X* a5 WSIGNAL Tx_Data_Reg:STD_LOGIC_VECTOR(Tx_D_Width-1 DOWNTO 0);2 k, J5 ^4 H+ g
SIGNAL TxDataBit: INTEGER RANGE 0 TO Tx_D_Width+3;$ {# U& Q" M1 q9 v: P
SIGNAL Baud_Cnt : INTEGER RANGE 0 TO Tx_D_Width+1;: K0 @$ o( B- _: c
SIGNAL Cnt: INTEGER RANGE 0 TO Tx_D_Width;
3 f& M# ~8 r/ x3 X8 T6 IBEGIN
: H0 {6 P8 l, D; |PROCESS(Clk,Rst)7 g7 H4 H) H/ C4 h" O) ^
BEGIN
* A7 C! u; W4 _IF (Rst='1') THEN
4 n: Y% J( v l% ?8 Q Tx_Current_State<=Idle;
/ @* T2 a1 d" W5 n3 E& O! X& jELSIF Clk'EVENT AND Clk='1' THEN5 y) C& B3 u7 O! k
Tx_Current_State<=Tx_Next_State;8 R1 w1 U6 f5 z8 }8 V8 t, D8 }3 [ ?
END IF;, [ N+ I7 c9 c. J$ A6 [
END PROCESS;$ ~' c9 q( e- {& j0 N2 v
PROCESS(Rst,Tx_En_Reg,Tx_Current_State,Baud_Cnt,Cnt,TxDataBit)
% w5 e) ~6 x/ L) rBEGIN a7 w2 H+ d2 ~" K
IF (Rst='1') THEN* Y9 J" L$ H; |+ z$ x7 M! O
Tx_Next_State<=Idle;- i$ e) `" O( o& s0 K& t
ELSE" B' Z/ ^, [' B2 Q
CASE (Tx_Current_State) IS
- L1 P- P4 ?2 AWHEN Idle=>$ B" _5 s6 @: K6 ~
IF (Tx_En_Reg='1') THEN
. `5 Y* Q2 T0 y- z2 u0 F* C Tx_Next_State<=Data_Get;
3 h+ c9 C! ?1 J* ?0 r: ]2 } ELSE
% ]: `0 a& D6 _ Tx_Next_State<=Idle;/ b+ V( |: s9 O6 Z0 U& b
END IF;
$ e( s) w# b$ b6 D9 L& h, FWHEN Data_Get=>2 b, I ~. [6 t( F% N' \
Tx_Next_State<=Data_Shift;
0 M" F! e. ~9 WWHEN Data_Shift=>
7 |$ h& m" x7 x7 { _, _2 S$ u Tx_Next_State<=Data_Ready;
% ~+ }$ K/ i9 A8 U" UWHEN Data_Ready=>
- l- H; W, Y, z5 ~7 S$ V IF (Cnt=Tx_D_Width-1) THEN
, T0 Y1 ]; _/ N# e) N8 ~ Tx_Next_State<=Tx_Pro;0 J+ `$ Y& m0 n% C$ |+ z) ^" C+ }" f
ELSE$ m( y" c' J& x4 }1 f; Y1 X6 U R
Tx_Next_State<=Data_Shift;
/ `$ [. k, e: I, V% N+ ~ END IF;
3 ^. ~* K" \% S7 N' G' @% D QWHEN Tx_Pro=>
% X" d9 m1 ~: j7 P4 U" H IF (Check="Even") THEN
5 y) ?9 g+ i3 n) d) {/ i Tx_Next_State<=Start_Even_Tx;
7 _3 x( v1 F) b3 ^ ELSE# t! U7 N; G' t7 n$ ~
Tx_Next_State<=Start_Odd_Tx;
6 F4 V9 ?' ^' p9 K. N END IF;
$ z+ F* K- \& l- P3 q# yWHEN Start_Even_Tx=>4 e c) x( d$ D" Z
Tx_Next_State<=Start_Tx;+ Y- c. K0 X1 L$ q& j! a
WHEN Start_Odd_Tx=>
; u+ {9 V7 A/ Z6 m& \ Tx_Next_State<=Start_Tx;
, \5 ^0 K5 e: OWHEN Start_Tx=> R J: E0 W9 h3 l2 a: j
IF (Baud_Cnt=(Tx_D_Width+1)) THEN8 `, G: L+ `2 r8 r# Z k. M
Tx_Next_State<=Data_Cal;2 h+ X4 @ b' X+ ]$ f- J
ELSE
: ~! c* r; S" |! A Tx_Next_State<=Start_Tx;
/ P$ B5 F% {9 B+ | END IF;
7 [6 B7 S) l" d- ?& H' KWHEN Data_Cal=>
- u L" ~ Y6 ^2 k; b% G1 D IF (TxDataBit=(Tx_D_Width+3)) THEN! W8 \3 r3 p5 [/ h
Tx_Next_State<=Tx_Over;+ o' M) }4 c( o- y0 a) | d2 y M
ELSE
2 _% S) Q' I) g, C" r Tx_Next_State<=Start_Tx;9 F) T+ H2 d% G* `( P
END IF;8 v( u& d* p y9 m) _1 }
WHEN Tx_Over=>) i) l5 m) S+ b6 y- H5 |
Tx_Next_State<=Idle;* [- {0 h+ D ?6 X+ K' q& z
WHEN OTHERS=>
, `, f. l! \/ Y Tx_Next_State<=Idle;! W& v1 ~3 t5 ?3 j9 q% g3 M5 f5 Q
END CASE;& q4 Z: X; [3 @% `" T* Q' f
END IF;
+ [0 q; m0 k7 i6 [$ |, z+ UEND PROCESS;) q' p3 | {3 _8 ? y+ I
% V: W" W: J2 v7 _$ @& V2 Z. O1 d
PROCESS(Clk,Rst)
9 T2 C, M0 q9 H: K7 EBEGIN6 G5 l" t1 u; \5 d/ ~% U' ~
IF (Rst='1') THEN% r, T$ l" {' T
Txd<='1';& |7 A& ` m5 o
Tx_Busy<='0';2 c, M9 j: ~6 G# z* Y
Tx_Busy_Reg<='0';
. O& c% I r+ p% r2 N Txd_Reg<='1';
: R/ P* l) N, J- e w6 ~ Par_Bit<='0';
$ S6 I6 L0 b: l+ x Tx_Data_Buffer<=(OTHERS=>'0');
& t+ `% v' C. k) C( V4 C$ X n2 j1 L TxShift_Reg<=(OTHERS=>'0');7 |6 F0 o0 C1 c/ ^8 y& l$ Q% J
TxData_Reg<=(OTHERS=>'0');
4 z- p& r8 U6 E TxDataBit<=0;
4 _" ~& e8 H, P7 h. p Baud_Cnt<=0;
0 O; v: c6 h5 b# B Cnt<=0;
9 G* @9 m5 ?9 X2 x8 { j p9 QELSIF Clk'EVENT AND Clk='1' THEN" D3 X! F+ u) p5 C) w
Txd<=Txd_Reg;) U: k/ c5 ^6 K" {
Tx_Busy<=Tx_Busy_Reg;6 I/ ~3 }8 |7 G5 _5 r& ~
Tx_En_Reg<=Tx_En;! X4 e4 X0 @+ s: w
Tx_Data_Reg<=Tx_Data;
% s6 x; _4 F. X5 p- {8 k CASE Tx_Next_State IS
. B! q7 p7 `3 b7 R WHEN Data_Get=>
8 L e: [0 s" d- t: N- J# i TxData_Reg<=Tx_Data_Reg;
/ a0 K- o/ l' F" B6 `; ] TxShift_Reg<=Tx_Data_Reg; 8 q' ?) E& l; n1 P$ }; W
Par_Bit<=TxShift_Reg(0); 4 ~4 p( ~" c2 J# | V2 ]
Baud_Cnt<=0;8 I8 K! K9 U, g! D9 D
Cnt<=0;9 X7 U. m* H+ U
WHEN Data_Shift=>4 H. { w$ {* |# ?. x4 X, f* Q
Cnt<=Cnt+1; 8 j4 w$ Z3 @4 ]+ k ?/ x
TxShift_Reg<='0' & TxShift_Reg(Tx_D_Width-1 DOWNTO 1);
& U* ]7 y1 ~* }( U" [ d WHEN Data_Ready=>
# |+ J( h) z& m7 E0 N1 { Par_Bit<=Par_Bit XOR TxShift_Reg(0);
9 b8 K0 k# O% k- ]0 { Tx_Busy_Reg<='1';) q7 J5 n- J) S8 k& ^0 q I
# {% r3 e3 x9 A% d6 W1 G' B* L
WHEN Start_Even_Tx=>1 }+ t& @5 i: O- o4 u. {3 u+ O
Tx_Data_Buffer<=Stop_Bit & Par_Bit & TxData_Reg & Start_Bit; 6 p) g8 w) R, B q9 ?0 v
WHEN Start_Odd_Tx=>4 z5 A3 p. [- i2 j* i4 R& u
Tx_Data_Buffer<=Stop_Bit & (NOT Par_Bit) & TxData_Reg & Start_Bit; 3 L, c1 t; r& M! ?) d! o' [
WHEN Start_Tx=>
0 P/ L% V! p, Q- M! z2 J. ~ Baud_Cnt<=Baud_Cnt+1;( X3 }4 |! M& ]
WHEN Data_Cal=>
" V, z* L3 r, h+ G% v' \ Txd_Reg<=Tx_Data_Buffer(0);1 q, ^* A, S( d
Tx_Data_Buffer<='1' & Tx_Data_Buffer(10 DOWNTO 1);8 m, g& I# U2 r2 q6 s9 ]
TxDataBit<=TxDataBit+1; t0 i8 m) C. O; |9 _4 H- n- `
Baud_Cnt<=0;" r2 c! S8 _( Y8 F; c9 E
WHEN Tx_Over=>- ]5 W+ v: u3 N' m% o
TxDataBit<=0;- S8 }' o5 W. J2 p4 d! U+ ^
Tx_Busy_Reg<='0';
1 F1 g, L8 J0 S/ n7 S0 P WHEN OTHERS=>
, ]4 D+ _$ x3 ] NULL;
/ o7 m9 k( ^7 ^! m" ~& @+ q END CASE;; E9 a; [8 T! b2 B& L! d. q1 B
END IF;# r. ]% u7 v8 L: }! ?5 V
END PROCESS;/ V* W# b/ g, c E1 l, i
END Arch_Uart_Tx;
7 X3 q! \ q( K
. u( f# `2 I6 p三段式描述的程序,电路结构合理,综合器生成的电路更稳定! 本程序支持宽度和和校验位的参数化, 请放心使用!5 j! O" x3 t) e7 k: K
0 I$ e4 h# I4 h8 a J j% A |
|