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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

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

# ]  Z2 m5 M2 F* R( L9 P  r2 _2 _5 o
4 o1 S- q  q$ N
//uart 2017.10.9  发送接收到的数据 4 A9 V# k/ s2 V9 O7 v
//波特率9600 8个数据位 一个停止位 无奇偶校验
9 Z0 q& Y+ V2 Q, Z  D7 Kmodule uart(* q9 i# |$ G, _6 E2 \
           clk,   //50Mhz0 n# s6 s7 Y/ {! p+ _' V
           rst_n, //reset3 k; V0 y/ U# Y! W: p& }
           rx,    //input   
5 F) @+ y# d" |! F1 \% b# |           tx     //ouptut   
6 }8 y2 c* O! l);
. g0 U! Q2 X+ |input clk,rst_n;8 H: {; r) x/ l/ z" _6 d3 g
input rx;2 t. g: l6 V8 n7 X6 t9 M
output reg tx;
8 Q+ s! \  i# H
1 g7 i% r8 |8 v+ V9 t! L# n( S//-----------------检测是否有数据来--------; l. ^  t1 U$ o* O
//边沿检测  
1 {) ~" `# R4 ~, X. O! q7 @# bwire rx_start;+ O+ M4 n6 [" h$ Q+ C! R- r6 ~
reg rx1;
+ h0 W8 i; y7 n5 N* R8 c2 n" Nalways@(posedge clk or negedge rst_n)) @4 `( ^5 i" m# J* |, Y! }
begin7 Y% N2 f1 F% Q. d. x. p
    if(!rst_n) rx1<=1'b0;# N! H6 ]$ q0 }, E
    else rx1<=rx;
. ]& \, m, I9 {+ _end
$ u0 b, v  {$ k, B1 {' B; Hassign rx_start = ~rx & rx1;) Z( c7 e/ B( S+ o9 v1 G9 S
//-------------------波特率控制------------
0 e4 M. ]5 t  }) H2 _. j: \wire bps_start;" j- w! J7 F7 g+ R, m  _% q2 ]; F
reg bps_start_rx,bps_start_tx;9 Q- W1 R/ U2 _- Z7 w
reg [3:0] rx_num,tx_num;         // 2^4-1=15( n# ~6 Q8 w) }5 k6 B7 u
always@(posedge clk or negedge rst_n)0 ?5 b' o, K3 |/ J$ M, _  t
begin
: w$ u- E/ S" s    if(!rst_n)6 E4 T( S* B; Z) }" @; h
       begin 0 U/ R' o$ R: r8 U0 m: I$ J
        bps_start_rx<=1'b0; 7 H, R$ O4 z! G2 r  K
        bps_start_tx<=1'b0;
( E8 R2 r& l6 J) Z1 S       end8 s9 g; M0 b8 L8 H# t+ c
    else if(rx_start) bps_start_rx<=1'b1;9 R: h+ z* O. l( W
    //接收完数据后 开始发送数据
# q' l/ S6 R" a    else if(rx_num==10) ) g- l) A3 L- U, M2 e
       begin  
) V+ ]6 X0 _4 T) ]5 \         bps_start_rx<=1'b0; 3 H1 t% t( s0 X+ s3 i
         bps_start_tx<=1'b1;
# B& n( {. k+ G% b5 R5 Z       end% G0 s6 l8 B( r( E9 O0 W- h% J* Q
    //发送完数据后 无需产生波特率
; }( j3 U) v6 m0 C% Q- C0 i    else if(tx_num==10)
3 x3 ]$ q0 a5 h' L         bps_start_tx<=1'b0; $ X2 O3 T) b  e" {
end
- n- a9 F% i; G+ `9 Y" B( ^assign bps_start = bps_start_rx|bps_start_tx;1 H" p7 e2 {% }* Q9 w( J3 U
//------------------产生波特率--------------
3 p6 o* o, E4 r% X+ c$ M//96002 i( ]8 D" L( q; `% [( I; ^
parameter bps_cnt=5208;    //50Mhz / 9600 = 5208.3....../ E0 [1 C$ L' a, R
parameter bps_cnt_half=2604;' s# t' d' m* p9 Z' N2 o
reg [12:0] cnt;+ Q0 x( b3 t: ]7 {. m2 J
always@(posedge clk or negedge rst_n)
. x6 `8 c* k( l) P6 Z& x0 zbegin0 D1 O+ a; o. y5 O* ^, l7 H) K* k
    if(!rst_n) cnt<=13'b0;
2 K3 c2 d: P2 D8 R$ o    else if(cnt==bps_cnt) cnt<=13'b0;8 c: T1 M" ^4 O, T- t" q( y' e- V, T
    else if(bps_start) cnt<=cnt+1'b1;. Z7 t" J9 M* b1 v) U
    else cnt<=13'b0;
+ X% z, F! d6 R7 R! D% q: [/ qend
( o/ M7 H* o6 p1 E( N6 E( z( j$ Z( h. K1 Q9 y( T( T3 I6 l4 F
//--------接收寄存器 发送寄存器------------$ H% ]# a1 _* a' }, _
reg [7:0] rx_data,tx_data;
  x  @+ s1 u2 x7 G, |' q//---------------------接收数据--------------8 @! W% U( P; w3 C8 O
//receive% w9 R4 m& ]0 y' r
always@(posedge clk or negedge rst_n)1 z; d) A; `! p9 e; v: E
begin5 V( j0 T) R; O0 a. c1 \3 j6 j
    if(!rst_n)
9 w* j. `0 y1 D9 @" z1 M+ R% v3 y3 a     begin
% H7 c' R. H- X2 \2 b      rx_num<=4'b0;
4 ]$ n4 X( ]5 I9 Z, X6 P8 z# j      rx_data<=8'b0;
/ N. f" D6 K/ h3 x0 r     end; E# d" k% x6 g/ \& s: M; E: N4 a
    else if(cnt==bps_cnt_half)
( S: l. C. V- s% ?$ r     begin
4 B* S6 ?* z# i5 F                if(bps_start_rx)
3 }" v" z$ u& |8 d                        begin
; i3 k% t- p% a) q2 J                         rx_num<=rx_num+1'b1;8 v9 w! d" U7 H# ~, }
                         case(rx_num). r7 D6 B. \# U3 U7 c
                                 1:rx_data[0]<=rx;
* c! G* M+ g2 `9 ]2 u, k$ N                                 2:rx_data[1]<=rx;
8 W( n: K+ k2 K% \1 Z8 }/ |                                 3:rx_data[2]<=rx;7 w* B. v( @& c9 k
                                 4:rx_data[3]<=rx;6 `$ r* t( {, Z( D. U* x3 c
                                 5:rx_data[4]<=rx;
0 u# a( b( `+ {9 ]1 t& k( }9 U  W                                 6:rx_data[5]<=rx;& S3 b7 v8 K7 D; c. A
                                 7:rx_data[6]<=rx;
% U* ^# T- i" s, Z  e  {                                 8:rx_data[7]<=rx;
" F4 `9 y/ @" U; Y9 m/ y( A* v7 i$ y! ^                                 9:tx_data<=rx_data;
. l" b4 g# Q( p0 ]( W9 J* Z9 _( e4 A                         endcase
; o0 K9 @/ h$ j                        end
& c1 ^7 ^: E5 N- L         end, v, I9 E: g) B; m+ a( |# F% |" u
         else if(rx_num==10) rx_num<=4'b0;
' _2 c4 c4 T" c7 i' V- m0 m  n: W# k7 U2 P1 Z: T( a
end" P. k  I8 s- g  g. n$ a+ d- T
//---------------------发送数据--------------9 `7 F) C9 Q; N
//transport4 A, v. z7 u8 ]# U3 c
always@(posedge clk or negedge rst_n)$ W. Q+ a* c5 V8 D
begin
. |) f4 e) x" W2 m( F    if(!rst_n) tx_num<=4'b0; - N& T# q5 D, B* o
    else if(cnt==bps_cnt_half)
1 b, J- b; |2 q  K! x/ h       begin
/ |# Q  Z9 M* n$ q6 k5 O                if(bps_start_tx)
) c5 n% {2 P8 o) @7 \                begin) _3 g, ~2 u$ q) o7 r) J1 c
                 tx_num<=tx_num+1'b1;
  Q0 U, b4 l# u                 case(tx_num)
' b# y1 ]6 }/ Q9 t8 ~' C) K                         0:tx<=1'b0;8 R: T4 B, l& \2 D& s
                         1:tx<=tx_data[0];' o) T6 P/ W) p, _
                         2:tx<=tx_data[1];
% A# y9 n: i$ S. s9 F1 y                         3:tx<=tx_data[2];
, `% X0 O7 \1 _7 \" D7 I                         4:tx<=tx_data[3];& }* a* y% {  X  k0 {
                         5:tx<=tx_data[4];; {0 ]5 _+ {8 p8 I  S
                         6:tx<=tx_data[5];
2 r1 K/ }4 Q. C# V# @. `. X5 h                         7:tx<=tx_data[6];! u( K' T* j# O. C+ r6 H
                         8:tx<=tx_data[7];! N9 M6 G9 j5 F) m
                         9:tx<=1'b1;
  @9 n2 E6 F5 @+ y* b* e                  endcase
" F0 }) E0 D) m* B( e& A3 m+ i                 end
0 L* U/ W  Q$ X: y# U                else tx<=1'b1;
& J1 g. Q0 e- R) g  s# Z            end, w, s( |$ W6 g+ k
         else if(tx_num==10) tx_num<=4'b0;3 u6 ^1 r! j; p
end# [" |% m" p; _
  b  \3 N9 c# l
endmodule

  C1 c" g( @, [+ E) N* p; E5 Z" M( h% q

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-29 04:20 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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