|
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' ? |
|