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

三段式描述串口发送程序 

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
三段式描述串口发送程序
6 [( r7 M4 p4 i% o5 x

* T7 m5 B" j2 E. `" [+ X" N0 E+ C' @( oLIBRARY IEEE;- l  L$ m0 x( X  V+ U) P- b$ r  N
USE IEEE.STD_LOGIC_1164.ALL;
. i. {+ K' L$ D" q1 N: CUSE IEEE.STD_LOGIC_ARITH.ALL;
5 B% P# F6 c+ t+ S4 z. _USE IEEE.STD_LOGIC_UNSIGNED.ALL;; ~& k. k& y  l2 V- P) X
--LIBRARY ALTERA;' K" s# T9 h/ Z0 I3 e9 B
--USE ALTERA.MAXPLUS2.ALL;8 J1 G& _0 R  A+ X
LIBRARY LPM;  D$ C2 F- A6 M, o
USE LPM.LPM_COMPONENTS.ALL;
# ?1 Q( s& l6 v; C, L; vENTITY Uart_Tx IS+ x- X& \$ }, a
GENERIC(Tx_D_Width : POSITIVE := 8; Check: STRING:="Even";Check_En:STRING:="En");4 l0 u& i6 H$ W+ E* ^
PORT, Z8 w9 q9 u& [: O
   (! B  {/ N3 h2 `; R5 {, q3 Z
    Clk: IN STD_LOGIC;- i' T3 ?& f3 h2 p# D: _" l( \6 H
    Rst: IN STD_LOGIC;
$ T9 g2 H, y$ C5 u# t9 M0 C# s      W( E/ l( w% `- w) m
    Tx_En: IN STD_LOGIC;
9 f, V3 d( O8 G7 Q    Tx_Data: IN STD_LOGIC_VECTOR(Tx_D_Width-1 DOWNTO 0);
$ G, W( K, N% S    ( A5 G5 o: i9 d+ {. X- a
    Tx_Busy: OUT STD_LOGIC;- g! W# B  M! |4 S. [
    Txd    : OUT STD_LOGIC* i! l% |& [: e( {0 U
    );
9 f  h' y5 e4 VEND Uart_Tx;4 Y) C! B% m1 f2 ]7 u, Z' o* Q
ARCHITECTURE Arch_Uart_Tx OF Uart_Tx IS
" q/ I( @! T* NCONSTANT Start_Bit: STD_LOGIC:='0';+ N8 N/ W* l) e& g+ w% i& T2 B
CONSTANT Stop_Bit : STD_LOGIC:='1';   5 D7 m* w2 D& k$ Z7 e# U/ e
SIGNAL TxData_Reg,TxShift_Reg: STD_LOGIC_VECTOR(Tx_D_Width-1 DOWNTO 0);
' a2 e) H3 T) K  l0 ]' h3 Z+ RSIGNAL Par_Bit: STD_LOGIC;
  g4 l1 P, ~% tSIGNAL Tx_Data_Buffer:STD_LOGIC_VECTOR(Tx_D_Width+2 DOWNTO 0);
3 n1 g, d! a( B6 c! R: e; l) e- I; iTYPE  State IS (Idle,Data_Ready,Tx_Pro,Start_Tx,Start_Even_Tx,Start_Odd_Tx,Data_Cal,Data_Shift,Tx_Over,Data_Get);
; j. R; }+ q- v7 d8 s; k* SSIGNAL Tx_Current_State,Tx_Next_State : State ;: ?4 \/ ~/ C* }% `3 W
SIGNAL Txd_Reg,Tx_Busy_Reg:STD_LOGIC;
0 i6 V9 K% g, {, Y4 k  B8 y3 _SIGNAL Tx_En_Reg: STD_LOGIC;
: Q% f2 K4 `2 u4 HSIGNAL Tx_Data_Reg:STD_LOGIC_VECTOR(Tx_D_Width-1 DOWNTO 0);: r  i' ^6 V7 Y% |1 m5 [
SIGNAL TxDataBit: INTEGER RANGE 0 TO Tx_D_Width+3;
' S# Y5 `3 `' ?SIGNAL Baud_Cnt : INTEGER RANGE 0 TO Tx_D_Width+1;: h8 V/ ^9 G: A8 f
SIGNAL Cnt:       INTEGER RANGE 0 TO Tx_D_Width;
' ~6 J* D: B5 I1 dBEGIN, T3 u" U& T2 z3 E# U; V
PROCESS(Clk,Rst)
! ?5 M1 m1 n  y5 N2 E. `6 x) oBEGIN
* S- H) F# |# CIF (Rst='1') THEN
3 f$ \0 P) O: f+ L$ U; n0 \, v Tx_Current_State<=Idle;. p1 w6 }0 {" {5 ?
ELSIF Clk'EVENT AND Clk='1' THEN/ D2 G) O% |5 }2 Q
Tx_Current_State<=Tx_Next_State;. H4 ?8 n6 J6 B0 @& C" l
END IF;& n8 F! p. k' D# n( P
END PROCESS;
. E( \3 q! f3 w; x! G5 nPROCESS(Rst,Tx_En_Reg,Tx_Current_State,Baud_Cnt,Cnt,TxDataBit)
) d& v3 ?# @! v5 CBEGIN% e! w6 Z  u$ s1 R5 ~* P8 S
IF (Rst='1') THEN
! V4 k, D& m* _# {8 ?# t Tx_Next_State<=Idle;, r6 W5 U! p' A9 C
ELSE
; X2 {# X+ Z+ |+ N4 A: K  CASE (Tx_Current_State) IS
" A. M/ q5 W  c* o5 fWHEN Idle=>
# |. ]4 i1 q" s4 F2 E* X  IF (Tx_En_Reg='1') THEN& K2 r5 T5 P! }# w; e# y8 n
    Tx_Next_State<=Data_Get;
" {% Z1 u% K! R! G  ELSE1 ?3 r  c6 `) Z# _
    Tx_Next_State<=Idle;& H7 G% D) W1 u/ n! F
  END IF;) ?9 u. [: l' \4 p% R' Q
WHEN Data_Get=>8 P; ~  e6 \8 R9 L/ f3 h6 m- Z: W/ N1 d
   Tx_Next_State<=Data_Shift;
' z! y( ?& q. B4 p; EWHEN Data_Shift=>  . A1 g' D) G; P# H3 ~
   Tx_Next_State<=Data_Ready;
% v, P5 l' y* c6 X8 q: L* ^' UWHEN Data_Ready=>; f1 x8 p1 A+ Z% ~# D' p
   IF (Cnt=Tx_D_Width-1) THEN
' R' I# t8 f, B# r+ _     Tx_Next_State<=Tx_Pro;/ Z/ F* m7 U0 f/ O  R
   ELSE) n2 X& U$ U( V/ \" D/ S: H* y
     Tx_Next_State<=Data_Shift; 3 E. y8 I. H. j$ R8 y# N) k8 m& O6 h' `
   END IF;
$ u! T- X& v5 WWHEN Tx_Pro=>1 m4 m3 X8 B0 o' w
  IF (Check="Even") THEN
: S( ]5 @9 _6 W2 u9 r! X) Z  Tx_Next_State<=Start_Even_Tx;: o3 g0 [$ E& a! q- u
  ELSE* _  g$ T0 O6 l6 o+ O+ f- F; @6 c
  Tx_Next_State<=Start_Odd_Tx;: M* }: R5 Z4 a/ ?# k: k6 d
  END IF;+ P6 c! h; L! T5 ]9 H- m, ]8 H- n
WHEN Start_Even_Tx=>6 R: N4 _2 V6 C- K& y7 F: |
  Tx_Next_State<=Start_Tx;
' E$ {' c) s: N3 n6 cWHEN Start_Odd_Tx=>
9 T* E+ C5 E) A$ }5 n$ [9 W( w, c  Tx_Next_State<=Start_Tx;; v2 |' f$ }& O0 s. Y: ^
WHEN Start_Tx=>
1 |7 Y/ y+ X7 W  {  IF (Baud_Cnt=(Tx_D_Width+1)) THEN
0 B9 u6 X% h/ z( A& O    Tx_Next_State<=Data_Cal;, E- n; T' \" ~3 {: }- J) C
  ELSE
5 {- e- G8 O* ]; F2 [    Tx_Next_State<=Start_Tx;  d+ v+ a; ~6 b- p
  END IF;
  p4 A/ d* q3 L# fWHEN Data_Cal=>
+ T, a, y$ e8 G! m6 t7 z8 p' V5 M) R  IF (TxDataBit=(Tx_D_Width+3)) THEN
9 I8 }2 T/ g3 D2 t9 A$ {$ Y    Tx_Next_State<=Tx_Over;5 {1 l+ A/ ?0 ?) Z0 I5 s1 f1 o2 B
  ELSE$ k9 V( k& n/ h- a$ M4 S
    Tx_Next_State<=Start_Tx;& `: T1 I# K( B. P( h
  END IF;
& D4 A2 j, j4 o1 ^" v: IWHEN Tx_Over=># z1 O1 _# K: g$ `% W: T
   Tx_Next_State<=Idle;6 B% a% z* v# Z6 U3 H0 W$ u
WHEN OTHERS=>
0 i( m- Y" T; v/ [9 g/ \   Tx_Next_State<=Idle;. b+ t; H" p# x4 C; }
END CASE;
6 i$ R( m! V2 ~4 t8 u; pEND IF;
- r8 b- c4 ^/ J3 v' r8 KEND PROCESS;+ U7 o0 n& L5 h" `
  
. M* s3 P$ y8 l. x. o3 ePROCESS(Clk,Rst)
' l# m+ B" ]& ?7 ^5 q% PBEGIN
% i: U  V: Q: mIF (Rst='1') THEN
: O% j' R( p9 u   Txd<='1';7 \0 c1 w4 b! d7 D( a3 i5 ~0 Y
   Tx_Busy<='0';2 g* q0 u- \$ ~& c& L
   Tx_Busy_Reg<='0';
* r" W; a# y( s% j/ B; v   Txd_Reg<='1'; " V8 K7 V4 e5 w3 p; o% r5 c) J
   Par_Bit<='0';
& D) E  T% i  b, [' s$ O+ T5 v) L  g   Tx_Data_Buffer<=(OTHERS=>'0');
9 q9 v0 H$ u- R5 M7 y9 y$ {; |   TxShift_Reg<=(OTHERS=>'0');7 p4 F) ~3 ^' V6 F& H$ i, S
   TxData_Reg<=(OTHERS=>'0');
6 R  a0 |8 y: ^  ?7 i- c6 q5 v; x   TxDataBit<=0;
3 j" I! e' n- p3 H2 e8 v   Baud_Cnt<=0;
9 {) i7 q2 u. i2 j   Cnt<=0;' N; C3 Z5 A# K1 H8 [- p
ELSIF Clk'EVENT AND Clk='1' THEN
, @; E. X+ d  N$ M& u+ n- b. S6 @   Txd<=Txd_Reg;
+ n9 u6 J( r% c) \6 K   Tx_Busy<=Tx_Busy_Reg;4 `1 ~2 ^- m0 N, e" r
   Tx_En_Reg<=Tx_En;0 \$ z! O6 b% p
   Tx_Data_Reg<=Tx_Data;7 J5 O; R/ V5 ~
   CASE Tx_Next_State IS
& e& Z+ k! b! d  WHEN Data_Get=>* r* E1 Q1 [/ Y) x! I2 ^/ s
      TxData_Reg<=Tx_Data_Reg;
* M+ i  {: b& o; B/ h      TxShift_Reg<=Tx_Data_Reg; * h3 c/ @" O& Q% w! n
      Par_Bit<=TxShift_Reg(0);   . I0 R+ A# o! _8 D. Z# p
      Baud_Cnt<=0;$ R. T, ?3 p! `5 @6 m; ?
      Cnt<=0;
) M$ h0 B- x* j# i  WHEN Data_Shift=>
* u! J& a( b" ^      Cnt<=Cnt+1;  $ V! u( u% k! L
      TxShift_Reg<='0' &  TxShift_Reg(Tx_D_Width-1 DOWNTO 1);
1 b8 A6 G8 W% [8 ]  WHEN Data_Ready=>3 ^/ F* Z; C" ?5 G3 p( @1 z- ^
      Par_Bit<=Par_Bit XOR TxShift_Reg(0);
/ \: N" C- P% k; \2 v      Tx_Busy_Reg<='1';
' l, s2 \* y" n$ j     
/ z& t$ l* E1 k6 {  WHEN Start_Even_Tx=>, r. m, ]' H/ e5 V" P+ u
      Tx_Data_Buffer<=Stop_Bit & Par_Bit & TxData_Reg & Start_Bit; / ]+ L. R, J# _
  WHEN Start_Odd_Tx=>. D6 P, `, E. o, o6 _
      Tx_Data_Buffer<=Stop_Bit & (NOT Par_Bit) & TxData_Reg & Start_Bit; 0 H% u: ^- b6 ]4 a
  WHEN Start_Tx=>
6 S; y" ~* W# t$ w# c2 F$ F* O      Baud_Cnt<=Baud_Cnt+1;
" A' m  q5 U" n7 S. Z  WHEN Data_Cal=>
% k6 n' T3 F% r$ D  `4 X2 r, Q" a      Txd_Reg<=Tx_Data_Buffer(0);
# G* N2 w) F2 ?5 G1 |7 F9 Q      Tx_Data_Buffer<='1' & Tx_Data_Buffer(10 DOWNTO 1);
1 [  m$ x$ f( e7 |      TxDataBit<=TxDataBit+1;
" ?( K& `' N* H3 s3 q9 L      Baud_Cnt<=0;, c: p( J) E& s' i+ {" K( o
   WHEN Tx_Over=>7 A* S0 g9 Y. r: A( N( V- R
      TxDataBit<=0;
: A: U3 `! ^/ O2 P' B      Tx_Busy_Reg<='0';   
, R, V! J& C& W2 F, z4 v3 t   WHEN OTHERS=>- ]! c. z3 h  x! L
      NULL;
: M$ g: G  [& }, R8 j4 M) b   END CASE;; r9 J) |/ a9 e( g0 }4 r
  END IF;
- y" k% S0 C" B' \ END PROCESS;& h! p1 l9 e: p; {0 }6 |. |
END Arch_Uart_Tx;
/ O3 D) x3 n# E2 _
9 k5 \1 ~. T0 `2 ?三段式描述的程序,电路结构合理,综合器生成的电路更稳定! 本程序支持宽度和和校验位的参数化, 请放心使用!
8 [2 x% L$ r) q, K+ \' F* g4 U+ J3 [# L1 e& J5 E: A- ?7 |9 X

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-4 14:38 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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