找回密码
 注册
关于网站域名变更的通知
查看: 247|回复: 1
打印 上一主题 下一主题

三段式描述串口发送程序 

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-5-31 07:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

该用户从未签到

2#
发表于 2019-5-31 16:09 | 只看该作者
最喜欢这种测试过的代码了  谢谢楼主分享啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-11 20:19 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表