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

好用的Verilog串口UART程序

[复制链接]
  • TA的每日心情
    开心
    2019-11-20 15:00
  • 签到天数: 2 天

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    好用的Verilog串口UART程序
    ==========================================================================
    * r% W) y7 t9 h8 U3 D: P//-----------------------------------------------------4 Z/ ^' ]$ k. g3 Z* F# C8 U* n% H
    // Design Name : uart
    / a# o. l# A& l9 x1 a( `$ ~// File Name   : uart.v2 c, W( ^; \. z, g* z
    //     : Simple UART
    ) b8 @& E, L1 c, C- t4 w( h8 C// Coder       : Deepak Kumar Tala$ X; Z, ^$ c, D5 I3 j& h% @
    //-----------------------------------------------------, c5 S1 L& ^: F' @
    module uart (# ^5 {6 A$ p. U7 _& }* d' z% P
    reset          ,
    # @4 X  K) u$ o, i' e3 p  jtxclk          ,. e% f8 ]2 ^7 k6 s9 b
    ld_tx_data     ,
    0 e+ F. U& o' qtx_data        ,
    6 ]; R3 }* j! k0 j% `; rtx_enable      ,
    $ K4 O7 {; l* b5 \) ltx_out         ,
    " T. N/ H) S+ jtx_empty       ,
    + ?$ w+ k1 t7 A8 Zrxclk          ,4 y$ t- Z# M) g4 v( w/ Y
    uld_rx_data    ,% ^7 O1 e( v% [/ Q# z9 o8 _7 }
    rx_data        ,) ^  k* m- ^1 N7 l& J
    rx_enable      ,9 Q$ [4 ]' L) n$ z
    rx_in          ,
    " T7 L# ~4 T% [0 R  g& m* c6 u, {rx_empty
    , ?7 ~, B0 Q) |; l% e' ]);& p- \" K" p2 @# k1 p9 W1 g
    // Port declarations% g) C6 }( a6 R! q4 ~
    input        reset          ;
    6 O, ^, C! g; @2 f  [input        txclk          ;9 a0 [* R0 ^: i4 z: V6 @
    input        ld_tx_data     ;
    , k$ T0 |# [3 u& ]$ A% Xinput [7:0] tx_data        ;
    , B; Q( g1 M$ X  A6 l& hinput        tx_enable      ;
      g1 M- [  J9 S. z/ P8 M, _output       tx_out         ;8 M1 H! P; b3 Q' B! t$ M4 x" F2 L
    output       tx_empty       ;/ W4 u& G' V2 o$ E3 @8 `4 N
    input        rxclk          ;
    & V1 j; |( J9 z+ r& `# e/ O! C9 o! Oinput        uld_rx_data    ;
    * \* i9 T/ {0 ?* Uoutput [7:0] rx_data        ;0 a9 B& g; X; _
    input        rx_enable      ;8 M- F8 K. v2 }: [" G5 k% j! c
    input        rx_in          ;, @1 u# }3 j1 W" R- k) u- [8 d; K
    output       rx_empty       ;
    / A$ x  m; V/ T& A- M, D$ e6 d
    - M& u( o2 _7 B// Internal Variables ; C0 J% I! |9 N: Z
    reg [7:0]    tx_reg         ;
    8 d9 W# s  C, a6 e9 k1 F( Oreg          tx_empty       ;
    1 G, j, t$ q- w7 W/ z- n+ C& lreg          tx_over_run    ;% K0 P" j+ H9 X) j& H
    reg [3:0]    tx_cnt         ;
      R) j+ m1 Z2 @1 X2 R& Greg          tx_out         ;$ P  G3 x% T! r( S7 r  q
    reg [7:0]    rx_reg         ;% h$ b2 I2 R6 x- B' T4 n# v, j
    reg [7:0]    rx_data        ;
    % s: J. C4 X- _9 {- k7 Breg [3:0]    rx_sample_cnt ;
    ( S0 n- z& L9 X1 Lreg [3:0]    rx_cnt         ;
    : l2 S, H- M$ ?reg          rx__err   ;6 f. n1 w0 s" t. a! s: u
    reg          rx_over_run    ;) ?1 k. z1 ?  Y, t0 Z/ U2 [3 G
    reg          rx_empty       ;
    7 Q5 z3 T# z" B3 w- Wreg          rx_d1          ;
    ' t+ ~& W" r+ H% o, g# L  Ureg          rx_d2          ;
    - n# g2 U; l1 T2 f0 areg          rx_busy        ;- f4 r- m: H% ?: w7 {
    ) y% w1 y" O5 G" Z1 N3 y& ^
    // UART RX Logic$ f2 c- x: P4 {$ W3 r! y
    always @ (posedge rxclk or posedge reset)
    ( o. {' j8 {# |9 eif (reset) begin
    3 ?: k  i: ]' y$ B; zrx_reg        <= 0;
    0 F- t3 N( x' d5 urx_data       <= 0;. C. [- V+ [* y  K$ M
    rx_sample_cnt <= 0;5 B' B, N4 y( m, v6 w1 W! k6 p
    rx_cnt        <= 0;
    . w$ M  f1 r# ~& o0 a0 c1 srx__err <= 0;4 M% C, G! A4 G+ Z$ S, X
    rx_over_run   <= 0;
    1 C+ l5 ^$ e4 ~' m! G+ Orx_empty      <= 1;
    : k$ s8 _5 d0 ^2 M9 ~; g' Yrx_d1         <= 1;' [6 B) I4 a2 }) C
    rx_d2         <= 1;6 N% a' M; Z8 A0 X- Q' U$ k( |) z
    rx_busy       <= 0;7 t# E9 m- N* A. T/ H/ `
    end else begin$ j3 |6 L; z* C+ _) N8 O' X2 \6 }
    // Synchronize the asynch signal
    + w" u- ?9 V% v9 crx_d1 <= rx_in;# L! K% Q, r" D* t
    rx_d2 <= rx_d1;& m# r$ I5 r1 Z( i2 C5 m
    // Uload the rx data
    5 n$ w( n# A. O2 j: ]4 R3 ?if (uld_rx_data) begin: f( Y7 g2 I' k+ m$ r0 b/ X9 {
        rx_data <= rx_reg;# [9 ?; U1 |3 c) O* ~
        rx_empty <= 1;
    / _2 |8 D! Z. q$ Qend7 T9 q+ h5 t4 a' u, `+ d
    // Receive data only when rx is enabled
    $ w& u0 Q3 B; s) ^2 N  t  [- l; ]if (rx_enable) begin8 s0 ^6 @/ W" ?: w2 J% B+ Y
        // Check if just received start of8 v' b0 f6 ~0 ^
    if (!rx_busy && !rx_d2) begin
    4 W4 P9 T0 k4 Z. c8 _8 U2 G      rx_busy       <= 1;6 ^$ n4 N" G4 e
          rx_sample_cnt <= 1;+ k; x3 s6 ]5 H- c% v
          rx_cnt        <= 0;
    * T6 |* K; R) R7 W6 ~2 C( G2 @) s    end
    ) `$ s  q& i% n    // Start of detected, Proceed with rest of data
    + v" S+ T: i- P1 U0 B0 b  |- I6 }    if (rx_busy) begin1 V: R: Q3 C0 k  y
           rx_sample_cnt <= rx_sample_cnt + 1;
    - f. l6 Z6 A  o* V2 [       // Logic to sample at middle of data
    0 y: o( B) \5 a  W. _0 X" Q# z: H/ k       if (rx_sample_cnt == 7) begin
    , \8 n  B- d+ M( r) d5 G+ j# c          if ((rx_d2 == 1) && (rx_cnt == 0)) begin# e7 R9 X: h' }" d% ?
                rx_busy <= 0;/ U8 C# o( e8 Q. O3 U/ I% y
              end else begin
    2 b) H0 Z8 c1 Z, r            rx_cnt <= rx_cnt + 1; 0 M9 r: }4 W2 U
                // Start storing the rx data
    : {  [" a/ Z/ a6 ?( h7 t            if (rx_cnt > 0 && rx_cnt < 9) begin- X! e, J; j6 i4 j6 K
                  rx_reg[rx_cnt - 1] <= rx_d2;
    % X( p# S8 y7 x2 t$ J' h' }            end
    1 |: p2 a1 F; o) s" G& E            if (rx_cnt == 9) begin2 F' i) G) d8 c' z8 F
                   rx_busy <= 0;$ e6 B3 U/ ]# Y5 C
                   // Check if End of received correctly
    " {  s( M" _" T! O/ t5 N$ K               if (rx_d2 == 0) begin& ?" t" v+ i8 l) I3 Q
                     rx__err <= 1;9 @% N5 S; |9 H; [) Y
                   end else begin6 Q$ w, `- q4 n9 O5 q6 W; _3 e
                     rx_empty     <= 0;
    6 ~% M9 D& B' k# e  v7 C3 O                 rx__err <= 0;( R# i% X* }4 O7 I, \
                     // Check if last rx data was not unloaded,
    - o/ T( c  B- {  T& f, |                 rx_over_run <= (rx_empty) ? 0 : 1;
    ! r+ P" X$ N8 }9 V  N               end: X+ c! k( C2 M7 o' k+ G- H2 o3 q
                end) G. U/ p) @  Z8 D. u- P! G
              end( O) @# l; L8 S! ]8 v% [& k
           end
      e+ `5 g) I% ?0 w4 O1 D0 r    end ( t! }8 O5 s% w( @# F5 f1 `
    end
    - F0 P! o1 x, U- X4 I1 Q4 |9 kif (!rx_enable) begin
    ( x' y6 X, V; F; `, k- r    rx_busy <= 0;
    1 g( W9 ?0 m! Send
    ; H; |7 G" f) W) t% @% B/ p. Vend' V: \: ^: ^& J
    % e* K% `8 @6 a1 y% t. f- @# o8 G& s
    // UART TX Logic( Q& p- x2 Y2 Q# N0 E
    always @ (posedge txclk or posedge reset)
    4 x! b0 y. Q8 S) M% m5 Mif (reset) begin9 s1 A2 F0 h! ~* E4 c
    tx_reg        <= 0;5 L3 d+ A5 S& F6 b: l
    tx_empty      <= 1;  F$ j. K/ e! k1 q( r
    tx_over_run   <= 0;" `4 v  k3 X: z0 ?4 j
    tx_out        <= 1;$ ~# H& A7 _: A9 M2 K; w
    tx_cnt        <= 0;" c4 B! n, W/ y
    end else begin
    7 H" N+ o, X  [6 b- y0 I   if (ld_tx_data) begin; J. ^# n; j, y5 q5 H
          if (!tx_empty) begin
    . q9 |7 X6 A4 L1 w- ^& F        tx_over_run <= 0;
    + {, i# ?4 v7 q      end else begin3 s# {# u5 l0 L; [
            tx_reg   <= tx_data;
    4 b: X  c1 n. ], y        tx_empty <= 0;
    . m# |! v1 H- L9 M      end
    ( \  K# B0 r: s4 y: n( H- K   end
    0 u  o& i0 h! G0 R7 |) Y   if (tx_enable && !tx_empty) begin6 S! y& J( _4 T" D' z: m
         tx_cnt <= tx_cnt + 1;+ J! q1 @$ W- S. ~+ Q6 v
         if (tx_cnt == 0) begin
    4 ~( R/ Z+ @" B) A" V9 z       tx_out <= 0;/ l* M& _3 W6 S5 u6 S
         end
    3 M2 I& i4 O4 A4 @     if (tx_cnt > 0 && tx_cnt < 9) begin
    : E9 g( F2 z2 v. Y: T        tx_out <= tx_reg[tx_cnt -1];1 T0 m& o' @4 R, F6 {7 Q
         end
    + ~5 ?* Q6 j5 j/ ?, E2 N6 k     if (tx_cnt == 9) begin. `9 i) W+ ?& C8 b/ C. T  c) y4 K: v
           tx_out <= 1;+ X( I0 P9 e7 [8 C
           tx_cnt <= 0;
    * P: Y* S. J8 s' J       tx_empty <= 1;$ d+ U8 O& I, J" S
         end1 w! N' @# }! y7 W8 b0 E
       end
    . y& I9 p; M; L$ _5 }$ m   if (!tx_enable) begin
    7 z' g2 V  `* W, q4 H     tx_cnt <= 0;
    % v$ Y8 H7 P+ {! y# B   end' }- U# v5 @) r' X6 o0 l7 t
    end
    3 S5 v# o3 i3 a5 w2 C1 I4 t( z4 J) [( \! Y: K
    endmodule
    3 J+ Y8 V$ k, ?& I
    ! W- p6 r7 ^  F7 H, T; o, ]
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-10-9 15:52 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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