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

verilog简单实现串口(精简版)

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
verilog简单实现串口(精简版)

8 g5 n2 E% I$ m" P
# _! F2 C+ V# X* Z  v: F* M( A( V$ h/ J. ~6 d: O& g
//uart 2017.10.9  发送接收到的数据 $ l& d) T/ J, t. }; |; r
//波特率9600 8个数据位 一个停止位 无奇偶校验8 u# A3 b& y$ ]. j: R+ y
module uart(
/ |( K6 ~$ ?5 _/ ]/ T2 m           clk,   //50Mhz
2 B! P7 \& A0 E) }           rst_n, //reset
* ?, c3 y3 q7 E% C           rx,    //input   
% ?5 L& T5 R$ X: M' u" @           tx     //ouptut   
; r. v( I) W! [3 h);+ p( q: T9 n2 w1 p" i
input clk,rst_n;, m  ~# R0 A; E9 a. M
input rx;$ Y% V* L- q, v2 N" R/ w
output reg tx;
2 F! \* s9 _4 e7 Q0 Z* m$ W/ e: V
//-----------------检测是否有数据来--------
4 P( y1 e5 A; j( d//边沿检测  
1 S7 n' p1 _* \9 kwire rx_start;9 g1 k6 T! b% D: w: P
reg rx1;
# x0 U8 b: w4 Yalways@(posedge clk or negedge rst_n)7 y' I! f; U3 c& h  i  d* y: A1 L
begin
+ e6 N4 }1 l( i- E  ]2 |) O/ a    if(!rst_n) rx1<=1'b0;# U+ A. D* R# `  X, v7 m
    else rx1<=rx;
; f/ R7 S0 c" Iend
$ Z+ u6 {+ @/ x4 Jassign rx_start = ~rx & rx1;
3 q9 }% P- M" ^3 Q//-------------------波特率控制------------
# }4 I* S. d  I& o% Qwire bps_start;% L$ p% a7 O) A- p
reg bps_start_rx,bps_start_tx;6 b$ k  W: d. U7 R1 g( \
reg [3:0] rx_num,tx_num;         // 2^4-1=15
# ]2 p  P7 a( E8 O$ O* Palways@(posedge clk or negedge rst_n), _- @' h- R8 B6 j, s) O3 ~
begin
6 ~, v% E; d* f, U  s$ O' F1 u    if(!rst_n)
; I9 M/ u2 q8 v- u. O       begin
4 p$ h! g" F! B$ M        bps_start_rx<=1'b0; 2 R8 W; x. @9 e1 _, R
        bps_start_tx<=1'b0; % C# R! `- G3 n+ ^( n, v1 _
       end
( G* l$ C% ]% {9 N    else if(rx_start) bps_start_rx<=1'b1;! r6 ~* l1 \5 I* v& _" S8 C1 b
    //接收完数据后 开始发送数据
5 [( y1 P( E# w8 c    else if(rx_num==10) 2 R7 D, K8 {8 x  r8 U- L
       begin  
, u! a; X: T' ?/ y( ~. N! F         bps_start_rx<=1'b0; ) h+ }4 P% b$ ^+ V
         bps_start_tx<=1'b1; ' n# u1 |4 F% j: o: ^& C  n2 u& C
       end4 r+ q5 {* k* P8 _+ M" ?3 q$ |
    //发送完数据后 无需产生波特率. V, r9 z% N- _9 F' y
    else if(tx_num==10)
# |) w* C' w( h  B& Z% B         bps_start_tx<=1'b0;
% _* `3 Q# N& q, cend; Z0 J: F7 F: b0 |# M5 e5 G' y
assign bps_start = bps_start_rx|bps_start_tx;4 H) x. R' P' w2 _4 M( C# v& O6 T
//------------------产生波特率--------------
3 u9 t! Z1 F' L; ~3 O  M//96005 x% C+ q- I; l$ d* G
parameter bps_cnt=5208;    //50Mhz / 9600 = 5208.3......
9 n6 `' m( C" o& A- X! oparameter bps_cnt_half=2604;/ N0 N9 x  d: ]+ B9 G% ~
reg [12:0] cnt;5 C, p" Z7 p2 q- X/ }( M. i
always@(posedge clk or negedge rst_n)  M" s' l' v' ^& P/ J
begin% q1 l, l! \- ^$ Y1 R
    if(!rst_n) cnt<=13'b0;
, p8 K9 n0 c" Y& Z2 ]5 O. B+ F    else if(cnt==bps_cnt) cnt<=13'b0;* T: X# z4 l- v, R
    else if(bps_start) cnt<=cnt+1'b1;
9 n  r6 z3 ~0 P4 t    else cnt<=13'b0;
# l6 k6 M: Y: N3 Eend 6 ], E1 g3 c  J* _/ l9 ?! T( B5 o! H
) g, u, p4 ^( S1 B6 R. n& X0 X
//--------接收寄存器 发送寄存器------------) o% t  l+ b' K, _& P/ I
reg [7:0] rx_data,tx_data;
3 Q: {9 M! @: `' M, N7 `//---------------------接收数据--------------. ]8 J5 Z9 v- S# b! v
//receive
9 X# i3 [3 S# P8 s: Z1 Lalways@(posedge clk or negedge rst_n)
8 x( o+ o. G5 O. D6 V  Y0 s8 Wbegin! N. _6 v' ~& _# G* s9 A& D
    if(!rst_n) 4 F8 {2 p/ ?: b) j+ u
     begin
4 P7 A2 Y1 D; k+ `      rx_num<=4'b0; # H5 ]/ `6 z  U' j5 u# g
      rx_data<=8'b0;
1 A# x, e& a4 R. ^  r* _8 _0 s2 a     end4 W7 D4 @: M: r/ X3 l2 [
    else if(cnt==bps_cnt_half)
9 l0 r6 w9 F8 w% b. M     begin
" X5 N, K, K: |( A$ R2 o: y                if(bps_start_rx)  K9 d5 k: Q. o+ V5 D! N
                        begin
& Q! @8 c% w5 Q9 H6 ^, k7 _                         rx_num<=rx_num+1'b1;# v1 y2 }5 O+ t2 \2 \
                         case(rx_num)
3 Q  e4 J0 Y. F' l  U1 N                                 1:rx_data[0]<=rx;
& Z' ]/ J( S3 U2 r2 Q& o) W                                 2:rx_data[1]<=rx;
' W! K& y# o7 C                                 3:rx_data[2]<=rx;1 L+ Q) L( q: V
                                 4:rx_data[3]<=rx;
, f. R, S7 t1 x# p                                 5:rx_data[4]<=rx;
( A7 G8 h/ G. a" m' }2 ]                                 6:rx_data[5]<=rx;
" e5 E5 S$ F& g) i! g7 a                                 7:rx_data[6]<=rx;
5 p. W  S& W5 N, _                                 8:rx_data[7]<=rx;
) w: o# |* w4 Z+ j# r                                 9:tx_data<=rx_data;6 W. ?( r. B- d0 c
                         endcase0 Q3 s. G+ }1 m  F8 v/ |9 e: \
                        end& j8 m( c8 c$ \: d9 j' I/ O. D0 k
         end/ _) Z1 V3 n; _# D) [* g
         else if(rx_num==10) rx_num<=4'b0;
7 t( ^* j0 C; j! d
7 h; m  [  T9 o9 Y) Nend
1 z3 t) }8 b, P3 L/ G- p* Q//---------------------发送数据--------------
1 B6 A3 ?( ?4 g3 J//transport
+ b, X+ b4 q) g( ealways@(posedge clk or negedge rst_n)
9 X  S) X( s8 S6 xbegin
0 U' u" N; F9 K) e% X4 j3 y1 L    if(!rst_n) tx_num<=4'b0;
6 M: Z0 t/ \8 Y$ k( d6 X    else if(cnt==bps_cnt_half)
% |9 P( \0 R$ c3 D4 ]2 A; N       begin
: o' Q4 J5 B, r3 F# N1 d                if(bps_start_tx)
4 H0 c% z7 i: L- m0 C7 g) x4 h! n                begin$ H2 q5 a3 w' L' P/ M" N1 {
                 tx_num<=tx_num+1'b1;1 D' Y: V- g: M" r0 X5 Q, `- ?
                 case(tx_num)) j- r' e8 Z3 d+ N- P0 J" E
                         0:tx<=1'b0;
7 H" ~4 m; M* v8 i                         1:tx<=tx_data[0];8 ]% ]% N/ L8 d1 N' V+ {0 H
                         2:tx<=tx_data[1];; v6 _! }* o$ {- x% O' E1 K
                         3:tx<=tx_data[2];
* ~) y; g% e, q4 S# x' a+ U6 @                         4:tx<=tx_data[3];3 h2 y. f  ^7 ?6 {- Z. a  K$ M2 {
                         5:tx<=tx_data[4];& g$ _% O! Z. v- V2 X. V5 ?6 h
                         6:tx<=tx_data[5];
5 h- x4 D7 O* h" e0 f! j4 F# e                         7:tx<=tx_data[6];" X6 q+ \5 N. [* E/ ?% ^1 }, I
                         8:tx<=tx_data[7];
5 l. K( K# x$ m& Y* S6 P7 H                         9:tx<=1'b1;# A7 f! ?. D5 ]! h3 _3 n! E6 X8 x
                  endcase
9 C7 W4 _7 x) s8 _1 u7 Q                 end
' L$ g  o5 I0 s/ t" H                else tx<=1'b1;
" [$ W: ?( p# G( x4 ^  X  l6 e            end) q5 \# V' O$ c9 V3 U& t$ R
         else if(tx_num==10) tx_num<=4'b0;, q  @  s! c2 P4 V8 h) E( m8 r; n
end. O0 U7 Y5 }5 T4 d$ G

& O& L" A$ @! Z) L# i8 r7 ]endmodule

/ y- M  ]' q2 T! Q9 W% m2 g
% `4 f' e, k; D2 C& W" t' ?

该用户从未签到

2#
发表于 2019-3-18 18:53 | 只看该作者
最近在找这方面的资料 谢谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-8 18:39 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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