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

好用的Verilog串口UART程序

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    好用的Verilog串口UART程序
    ==========================================================================
    3 t) k& R7 [+ R2 ^//-----------------------------------------------------$ a+ {" q- d) T( F# L( ^
    // Design Name : uart 3 H4 }" ^& S8 C
    // File Name   : uart.v; E! H/ M7 k4 [/ o% x. }% t
    //     : Simple UART* s5 `% J; T" x. u+ j" Z( Q
    // Coder       : Deepak Kumar Tala
      V  Q$ r$ u( x$ U0 U. f9 u/ A4 o//------------------------------------------------------ |( G! W9 p: x) ]
    module uart (5 k% p  O' j9 f9 N4 l. t( Y7 i. N
    reset          ,
    ; G  c& }% _; r8 z5 R- `' W, Ntxclk          ,: s+ {+ ?2 j8 {7 r4 u9 C
    ld_tx_data     ,
    - @1 U0 l: x# P# `8 ?6 @tx_data        ,2 d; I: U% S% G8 T0 |6 [
    tx_enable      ,
    ( O8 K0 ~  C3 r7 ~tx_out         ,( u) }! F' l1 W
    tx_empty       ,9 k* ]2 W* {& i4 b$ L' X2 m/ ]9 Z
    rxclk          ,7 w: |5 f% f! X. q; w/ y1 C+ k/ U& v
    uld_rx_data    ,3 Y# v% P7 S! ?, i' x# P
    rx_data        ,
    - w% y. R! ?, Yrx_enable      ,
    ' K4 ]  T3 B# K8 J) g3 prx_in          ,
    " P9 V. [$ s  J; v0 }8 Krx_empty
    2 J. Y$ }: g* x- p! b4 E);
    7 q) q, M" F' g; Q( Z" D// Port declarations
    " v1 h  ^4 j! g) A. m- Finput        reset          ;
    ; a3 R+ p, j- F! ~input        txclk          ;
    * n4 I9 l8 ~# A$ l' }2 ninput        ld_tx_data     ;
    / C2 {6 x6 W7 Y( C" s/ V% x. H% \input [7:0] tx_data        ;
    " U, b* [  b4 x+ hinput        tx_enable      ;
    / j' f( {5 Z" Y/ _' d! Youtput       tx_out         ;% {" m+ k8 t) _$ _5 K* N
    output       tx_empty       ;
    / H! a2 u( B% c/ tinput        rxclk          ;1 |+ U' F- p) I3 [" t
    input        uld_rx_data    ;
    - r) K) g. n. e) |3 b: V& T0 Q0 H$ Woutput [7:0] rx_data        ;
    - |) s4 H' u8 `input        rx_enable      ;: \  d3 v/ ]+ ^! {' _5 g! I0 I
    input        rx_in          ;
    1 X" l; `1 ~: X0 x, s. [' _output       rx_empty       ;8 w1 b9 [& K  \" H! i, J& M* O
    % z9 A1 N$ L4 l; _! z
    // Internal Variables 3 j; T7 s& F" V
    reg [7:0]    tx_reg         ;
    8 c, W2 l+ F5 m* Ereg          tx_empty       ;4 @3 K! M* B4 w+ J- [
    reg          tx_over_run    ;+ x$ M  L% \2 |0 E1 G5 |- M
    reg [3:0]    tx_cnt         ;
    & t- `7 ~9 x5 H2 _# X& Zreg          tx_out         ;8 J" O' ?! @2 M& k4 Q. O( _
    reg [7:0]    rx_reg         ;
    ! [& [) }. }; k; m! z5 F& r% l# zreg [7:0]    rx_data        ;2 G3 [9 ]& J# o- ~7 b8 S
    reg [3:0]    rx_sample_cnt ;
    5 C$ g3 N1 W6 h( M* kreg [3:0]    rx_cnt         ;
    : y" ~& y* k+ b% @, |reg          rx__err   ;' u5 {1 L% O5 U
    reg          rx_over_run    ;
    * m% L3 [2 V, u" greg          rx_empty       ;
    ) W/ o* f+ K  Y8 Y# q! o/ breg          rx_d1          ;! F4 n( m# L  |  ^! v" D; M
    reg          rx_d2          ;
    2 @. M, M% v; h4 Ereg          rx_busy        ;; c# c. b6 p; F# d% _

    # ~, X' n# E7 H+ Q: Q0 `// UART RX Logic
    8 J5 {# Q+ h2 x1 K6 Q" \2 dalways @ (posedge rxclk or posedge reset), W& L, @4 c6 t( v. _' b$ ^
    if (reset) begin
    . N" f; ?9 H* x1 n2 Krx_reg        <= 0; ; V, b# Y8 R$ G, \" `
    rx_data       <= 0;8 |+ R+ P& B$ I+ e
    rx_sample_cnt <= 0;8 h4 V+ c$ k, q, _5 P
    rx_cnt        <= 0;& \# x2 h/ S, ]
    rx__err <= 0;( E( \# v, l3 u; j
    rx_over_run   <= 0;
    7 V! ]. @, Z4 V9 S' J$ z! P, jrx_empty      <= 1;) U6 ^! o9 x; }& P8 I6 i
    rx_d1         <= 1;
    . R4 L' {6 z' O7 s- z. g1 y. Nrx_d2         <= 1;% r  i" J) n& y1 Z/ m0 {: e
    rx_busy       <= 0;8 L. d/ @' [5 r( ?# ^4 b" \# V- f
    end else begin
    # E9 g3 p3 k( @( E* g// Synchronize the asynch signal
    1 T7 t7 e8 i' [) P+ Qrx_d1 <= rx_in;. a, U3 E; s: p
    rx_d2 <= rx_d1;$ o& \8 m0 T% H' G/ h- {- e8 x2 `
    // Uload the rx data
    5 F* ]+ A) c) r- Bif (uld_rx_data) begin
    % |. o8 t$ c( i; u    rx_data <= rx_reg;3 P+ D- t& S* s. K6 y! w$ S. m
        rx_empty <= 1;
    $ {# w/ `( j+ H, T3 w% Vend/ R9 I3 w" T8 E8 f" ~- S
    // Receive data only when rx is enabled
    , O: A' t' R4 p3 Z- }if (rx_enable) begin
    ) a4 B3 I! v: ~4 _* C# D    // Check if just received start of4 c. X* L' U. w' M2 x+ V
    if (!rx_busy && !rx_d2) begin
    2 h. R' w& `1 n7 v, s      rx_busy       <= 1;1 j' Y$ @% ~3 l% v' g
          rx_sample_cnt <= 1;
    ' b5 n( r; R) N/ b) D$ _      rx_cnt        <= 0;5 L& I  n3 T$ Y5 T! C
        end
    $ ?; b& s* T3 {/ ^% E8 F    // Start of detected, Proceed with rest of data6 E, y/ s; p2 z! ^
        if (rx_busy) begin
    * U6 b' N( y. Z+ \0 G       rx_sample_cnt <= rx_sample_cnt + 1;3 x4 Y1 P  j" g, R$ J+ h
           // Logic to sample at middle of data
    ) M; r3 c+ k$ Q7 @       if (rx_sample_cnt == 7) begin) Z5 D2 m- h$ n; K( b
              if ((rx_d2 == 1) && (rx_cnt == 0)) begin; m6 v; o8 h7 e/ S1 b  ]& l) T
                rx_busy <= 0;
    - h! T+ o6 Q3 X$ b2 B2 M          end else begin
    ( k7 G8 j1 g5 C( }. B# u) C            rx_cnt <= rx_cnt + 1; % {* F( v7 X( S$ ~% h
                // Start storing the rx data
    , Q  W5 p1 e" L9 ~0 K4 l1 C( n            if (rx_cnt > 0 && rx_cnt < 9) begin4 A  X/ U; H8 ]& V2 v" v
                  rx_reg[rx_cnt - 1] <= rx_d2;
    * U! f* s) W) J1 A            end: Y  [4 L8 f5 \. _$ j! ?
                if (rx_cnt == 9) begin
    . o2 [: {+ x/ `9 g" ]5 K' R7 ]2 M               rx_busy <= 0;" ~0 Q+ E% @- d2 l
                   // Check if End of received correctly
    8 Q( [; w! J4 S6 o. r               if (rx_d2 == 0) begin
    / J0 ?+ ~5 N! L, y/ @$ Y                 rx__err <= 1;
    ; ~' r3 b* b6 I" N7 r( t& C               end else begin
    8 q6 A$ {5 K; U- p9 ]                 rx_empty     <= 0;9 K2 b  h" h5 Z' _' c, _
                     rx__err <= 0;
    + Q' S4 }2 A, C$ S9 {! p                 // Check if last rx data was not unloaded,
    7 |. \( H) O5 K$ t/ }                 rx_over_run <= (rx_empty) ? 0 : 1;& c) ^5 W+ q# q: V4 Q( L' a
                   end
    5 b( c$ @8 h; y/ N! Z( u            end5 K9 k% K' x2 V8 Q3 N8 Z# l
              end
    / N  T! c/ s0 `7 X& c% D, I( ^       end , k$ W, j1 j) T; d
        end * A/ ^! |$ a! z# F( b
    end( b1 Y5 j- `& ~- t+ E4 _5 W, I) Y
    if (!rx_enable) begin
    " N$ c7 A, _1 F- O' G: l* k$ v    rx_busy <= 0;$ @9 i9 N  f3 E9 u5 D3 U
    end
    ) @7 N9 N8 r9 D5 ?end
    $ J. |# t: _$ h) v+ p- ^% e. f3 y) p2 u
    ! J+ Q! a: ^0 R$ D6 C// UART TX Logic
    $ s; _8 U/ c/ N, B$ V  Aalways @ (posedge txclk or posedge reset)6 o! O% X( g: F6 B
    if (reset) begin0 o- Q* F" n8 n2 j! ?$ |; I$ r' {
    tx_reg        <= 0;
    $ e- U4 O- ]+ B, otx_empty      <= 1;4 I& W* N. c' _6 {) j
    tx_over_run   <= 0;
    % T0 F* [: a: {tx_out        <= 1;( `: b- ~9 u2 H  m  V+ {
    tx_cnt        <= 0;
    : P3 k3 J; K5 Zend else begin3 M0 X/ k. E1 M& L' |
       if (ld_tx_data) begin+ i" H. C: e) D3 o
          if (!tx_empty) begin* g5 P, B2 @" b
            tx_over_run <= 0;3 m" m+ g6 ~8 X0 ]
          end else begin  v- i1 S# V7 [9 P' T- `9 n
            tx_reg   <= tx_data;' T. @8 i5 l2 I# Y
            tx_empty <= 0;
    8 e% @+ j( J& P, L$ |' s      end- d" m+ Y  N4 ]% E0 j, l
       end
    1 z5 C- l( a- F3 S7 S   if (tx_enable && !tx_empty) begin
    $ m5 B! y  E: F3 W- d+ F     tx_cnt <= tx_cnt + 1;8 G( P; ?$ m' r* Z% n
         if (tx_cnt == 0) begin
    . a( b4 k4 |9 M) H- m       tx_out <= 0;
    " [+ b9 O5 l. r6 V# \% W2 F/ c     end% m1 a4 g) X- ?; @) u
         if (tx_cnt > 0 && tx_cnt < 9) begin
    0 G) K, Q* W8 V4 P/ ~        tx_out <= tx_reg[tx_cnt -1];; r) w' h! A, r7 K+ ~  c; f  X
         end; w1 W8 c6 S; U) q) F
         if (tx_cnt == 9) begin
    / {4 j: {, A' X4 E. I       tx_out <= 1;" ?3 g3 N1 y* U& a: W2 B
           tx_cnt <= 0;3 J3 w1 E3 W0 W7 l% }; t
           tx_empty <= 1;  f2 n  C: C7 t
         end0 L3 J5 p$ Z% g) w7 K! p7 c3 z
       end
    ; K( Z  j( y% x   if (!tx_enable) begin% y! I! _. z6 P3 }# C
         tx_cnt <= 0;6 q* P  G& \  k
       end$ I# W. t5 w2 c8 R& G+ x- q4 S/ `
    end
    4 k, U% D- w# ^( H8 v" x* `( \6 r1 _" v
    endmodule3 S: F* {# n: u8 T4 m0 L
    - i  V: _- V% O4 a/ C* ?- T5 e
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-8-3 12:14 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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