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

verilog 怎么写一个串口能够一次性发送多个字节

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2013-11-23 20:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
如题 我最近写了一个比较简单的verilog串口 但一次性只能发送8位数据  (通过串口调试助手发送),如果我发送16位数据,后8位就会产生乱码  求高人指点  代码如下:系统50M时钟 波特率 115200) X* L4 f' x! V6 V! ^
接受模块:
  [' q5 w5 q4 h; O6 |module uartrx(clk,rx,dataout0,rdsig,dataerror,frameerror);5 f. W6 L4 D) r% q8 _9 b, x( a

2 C5 H" L% M$ hinput clk;' j$ [5 G. r: @$ I( Q9 J! X
input rx;, w( l3 R7 h  |5 F, `% Y3 o) w4 X
output dataout0;+ M& r% O- R6 S
output rdsig;3 w6 }' |* m0 b" ?
output dataerror;
. h. b" B1 D/ ~4 g( Q4 p3 Ooutput frameerror;1 ^4 o' _6 p: p, ~" h: K, {
4 S6 T2 v9 I- c) q5 @, e* ]
reg[7:0] dataout0;
$ A4 Q$ }- i3 p( @/ o3 j& ?+ Oreg rdsig,dataerror;( n6 W' q2 z! ~9 P8 u& H
reg frameerror;
+ X, Y2 H5 N; h, q
1 q* Y, H! X; @% g5 N5 Ereg [7:0] cnt;
  H1 z- _, }0 [reg rxbuf,rxfall,receive;
4 r% Q, |4 W) _: ?6 }% r
* R! h1 Z, Q1 n; K, O6 {3 Oparameter paritymode = 1'b0;
" d5 q" F; a9 r$ I6 xreg presult,idle;
2 g" \6 m0 J* ^9 @9 ^9 `+ L0 K
: S+ O- @  z* E  F, ]always @(posedge clk)
! T+ j6 f; {& p, r2 Wbegin
) m. J8 I/ {* I# u8 B' T+ }rxbuf<=rx;
& V  E% `" C: ~5 s7 f: Y3 k' nrxfall<=rxbuf & (~rx);
: l* ?! M4 }* ?0 M; }0 wend6 K% W) [! W# g2 g& P5 l  I! j

3 I2 R6 L7 q5 C/ w  w- t1 \always @(posedge clk)# `% [+ G* n7 z
begin; G) @3 n  T/ D5 e: i! {- U
if(rxfall && (~idle))
0 q7 ^- U& y0 q& Y" b: E/ bbegin
$ S% c$ W' F  d& P9 y; I, Treceive <= 1'b1;
2 O+ c+ `3 e. T* B, Dend
9 e+ I/ H* y) f7 N3 felse if(cnt == 8'd159)
/ H  t2 t& m% z2 \0 D2 p9 J0 hbegin
5 Q$ J1 a5 p% h7 P+ R! H  n+ e3 \receive <= 1'b0;# F7 n4 m6 C' N5 T# k$ w
end
% G' f% I6 k/ F9 z1 U8 d& iend+ X) u: c1 _6 V8 @* h% I
. F' Q1 k/ G7 F! a/ Y
always @(posedge clk)
$ D$ e5 |/ E) P* _  B5 Dbegin 6 \8 m' V- @1 R. e. _8 w/ G$ F
if(receive == 1'b1)
1 J$ s7 ]% c' @) K$ B$ o; E4 k% bbegin! J' ?/ {  V0 U3 N; B
case(cnt)% ?" T+ K( V2 a/ Q$ V. b
8'd0:' C- `* \0 x4 N4 P) n( ~
begin
1 q* [/ f1 s3 Y6 A* Eidle <= 1'b1;' l- e$ e/ \9 H% J
cnt <= cnt+8'd1;6 I" ~/ X* E* e. D- l" W: m1 H
rdsig <= 1'b0;
( L& E* ?: c0 \6 h2 A3 Aend5 U1 ], p" {" ]! |7 V
8'd24:
: }% B6 P2 T9 i/ Kbegin0 G$ \6 l" B0 N& U8 F9 c& I
idle <= 1'b1;( }( Y% t( F; I4 \
dataout0[0] <= rx;( a0 N- q* Y2 [
//presult <= paritymode^rx;
- Q. F3 b: ~+ r8 f0 b: r- ~cnt <= cnt + 8'd1;  f8 U4 l3 p6 V& H" T* e* s
rdsig <= 1'b0;
- I' H; ~9 i' n$ X, x& {* Kend
! R- m9 Q7 f+ r1 i, q, e8'd40:
7 b3 R7 P9 h* r1 h/ lbegin
7 G: _# o# o/ F% qidle <= 1'b1;; X+ o# D) ~3 E/ f; U" F+ ~
dataout0[1] <= rx;
/ ?+ b! H) x3 `" m1 D- r//presult <= presult^rx;5 M2 K; g" C1 S" p4 Q
cnt <= cnt + 8'd1;% `$ _' `* H0 d9 m5 C1 Q( H" K4 l
rdsig <= 1'b0;" M2 H% ~  a# a6 D
end# C1 s6 [% k, l, r
8'd56:
6 O6 s, j0 z# Lbegin
8 H$ a. J3 l  s3 S, o6 t# G& Yidle <= 1'b1;. e) {& X; C$ S1 y& x+ O8 \& {
dataout0[2] <= rx;
7 c; F7 n3 r2 P! \% t6 f//presult <= presult^rx;$ _2 T6 |! u" N4 h2 I
cnt <= cnt + 8'd1;; m1 Q& ~* u0 q5 Q0 V& [  V
rdsig <= 1'b0;
# }' N# i9 r7 h4 J, }5 \end
* p& J3 x/ n7 t4 B5 k8'd72:
. D+ Q% M0 M% d# }/ [begin- i7 j+ \2 w& `! f$ n" ]4 g6 a
idle <= 1'b1;
3 P! h4 i3 V& Qdataout0[3] <= rx;9 |4 b7 Q( a# D8 O$ X
//presult <= presult^rx;$ L' _& J4 _) e' S- |
cnt <= cnt + 8'd1;
$ F; H! G. S8 Crdsig <= 1'b0;: @$ j* K0 q) A: u7 D/ H
end
$ s: W7 i! }- t5 G3 Y8'd88:/ f- {# X1 ?8 P5 a- `' h
begin
) \9 Y% o1 L! V8 r, lidle <= 1'b1;4 T4 Q5 I) C- d4 U1 U* q- `$ W8 y' H
dataout0[4] <= rx;% p3 ^$ W/ e$ \! l& ]. e
//presult <= presult^rx;
  M7 F3 G. ^  m, hcnt <= cnt + 8'd1;9 E8 e$ B8 n! n3 |0 t
rdsig <= 1'b0;
" l3 I( W: J2 G( f. v6 nend
- M5 a$ y0 ?/ q2 B& a8'd104:, j1 W. n6 Z4 |. N$ w
begin" [% A& |1 t; Y+ m" f7 K
idle <= 1'b1;
2 ~( ~. e* s& t' p* X) C' ]dataout0[5] <= rx;
* F: ~2 B- F, }; q) H6 S//presult <= presult^rx;
- s% F2 ^& M  B3 u/ p. X; jcnt <= cnt + 8'd1;
3 n& k+ i7 T# l- s) K8 V$ h7 t" crdsig <= 1'b0;
. T* u: q2 X$ k1 Aend
& D$ [) ^. S* f3 t0 L8'd120:
8 r# }4 Q* ]: r8 Kbegin. q+ a6 `2 ?7 K; ^
idle <= 1'b1;3 d, e9 L/ ]0 ^' }8 X; r
dataout0[6] <= rx;1 X8 r: ]# h; S, ~9 a4 `0 |
//presult <= presult^rx;/ {+ F% H6 F( t2 f# ~
cnt <= cnt + 8'd1;
; e- z8 V1 G3 h2 x, ardsig <= 1'b0;
/ j+ a- J- k$ ^& Z8 `4 Zend0 P; A: ~/ t! c" T( i
8'd136:
, _) v6 T: d' U/ k) ^( F0 Kbegin
6 g  T9 ?& A2 }3 fidle <= 1'b1;7 g# N( o. z  A/ i8 P
dataout0[7] <= rx;% I; n$ g: i5 a# q6 K9 b
//presult <= presult^dataout0[7];- w& `7 p. q- ?
cnt <= cnt + 8'd1;$ A* x; P# y, a4 I1 c- N% i- `2 [
rdsig <= 1'b0;
3 \3 }9 @& Z9 [end
* h* B" i# t% K$ ~" E9 f/*8'd152:: E# h4 n) _9 F6 D5 m+ R8 N9 a
begin
( J& X$ D- `5 R8 b& o+ Iidle <= 1'b1;- I( l$ G# ^/ J* q: w; B
if(presult == rx)
% z. {0 w3 ~6 P- q3 n$ t) sdataerror <= 1'b0;
1 e! r6 g1 B  h. D% S0 N
# I6 V, s2 y' e( `$ ^* |- Nelse$ ]1 j- x& Q) l( W7 P

% _+ B: }/ f$ n0 [+ Odataerror <= 1'b1;1 Q3 B7 @+ T, ?
  b2 Q6 M/ G& W" j( r( o
cnt <= cnt +8'd1;1 o( e$ q5 n$ c  j/ z( d  ^
rdsig <= 1'b1;
0 k  w1 h3 H3 g' P/ ~! {end* F4 \% z! C/ R. q. M
*/
. X# X& N7 v; d* ?5 w: s8'd152:* v7 W. p5 G  D, G) g, l
begin
; a0 b/ z% G! a7 H0 iidle <= 1'b1;
" Z) E2 ], D* a1 V. C( Vif(1'b1==rx)
) t( J. u2 R$ [3 h. a# w; x3 k% ~frameerror <= 1'b0;3 [" L9 v2 q9 c) z& q0 g- A" @& I
else- n2 N: c: w% r( `, S, }5 m
frameerror <= 1'b1;4 F. I( i# _& V4 ]. O7 m
5 L, [6 b, \6 ~7 F
cnt <= cnt + 8'd1;
9 I: u7 @( J. Q1 Lrdsig <= 1'b1;
* j* d: A7 D2 H' D) `9 d3 B. F* Eend
. d9 s- R2 _# x4 q) {* v8 gdefault:
$ A8 `0 C* f0 X( ]$ S" Y" v. Dbegin& c( s4 P: w, r( a0 F: r
  cnt <= cnt + 8'd1;
& e% k2 A  _% w  end
4 d/ g4 v( s7 t# ]! kendcase
7 @3 c  V# G1 c+ e& Z8 d7 Y end
* X; u8 b8 ~7 n, m. n1 O% k; ~ ' ?! j! x: [. }5 M" Q, U
else
% q+ R3 N# y- N6 I1 M* H! [8 m  begin$ G$ x7 Y  T4 \8 I* e. |) p
  cnt <= 8'd0;
7 T. A- [0 \) h" E, Q: M) v$ ]  idle <= 1'b0;6 {) }) n3 b( J) K
  rdsig <= 1'b0;
1 Y& n  r2 A9 N9 s  end+ m! ]: x/ B0 a6 c$ v( k) h
end
" j- J- {; W1 Y
/ U* s- \4 x2 @; C3 a6 V; t endmodule
6 R# y+ H4 q$ w
  O* W9 I& A; ]$ F  k发送模块:
: Z+ _+ e! W1 B: W$ j
& \' g/ D7 L# cmodule uarttx(clk,datain,idle,tx,wrsig);
/ E0 G+ r4 v0 w  |& J6 |+ J3 v, Zinput clk;1 W2 j. y7 Q7 d& L/ G# F
input[7:0] datain;: g1 _, ?) I  ]) a8 k  z% z
output idle;% v- |+ Q* n* q- L
output tx;9 x$ A  V6 X( G2 B7 N3 A
input wrsig;. g$ y# W7 Q4 n" h
7 Q; x2 o2 W* m
reg idle;# q  `5 x# X" Q5 l
reg tx;
3 L- n' e$ j; K7 H0 R5 V# sreg [7:0] cnt;
1 t; |1 s4 c1 @' Xreg send;
& o1 Q( I, @7 D' p) Treg wrsigbuf;* p$ ]( x/ s4 v9 z' s! U4 ]4 B
reg wrsigrise;0 R  ?9 ?5 _2 y3 G
reg presult;' |% \1 b* s9 U' Z7 o% k
parameter paritymode = 1'b0;
( T4 o, ~  u# v' X% A: b) V" i
3 W: _8 m0 z2 l1 _$ N  C- G% M+ E- G3 r2 Q# K& l- E8 f
always @(posedge clk), S1 ^; @. c7 z5 ^1 X+ z
begin, O) F7 N' [& U# v; `7 H
wrsigbuf<=wrsig;
6 Q: U1 w/ A( s0 y1 D6 @wrsigrise<=(~wrsigbuf) & wrsig ;& o9 f3 J) O) ]6 h; }9 h
end
0 u9 a+ k( o. Z% C9 S. {
: S' Y. D3 t- D; U' q; D/ Y4 |$ X+ z
always@(posedge clk)
" F1 Y2 s3 q1 E' x  begin
! \( c, q" d9 h1 z/ @) \1 g  if(wrsigrise && (~idle))
6 S- G9 Z8 {7 x( \, @8 w  begin8 K/ A8 e9 T  R7 N  w* m4 g* X
  send<=1'b1;
* e( i1 a" e9 k) _  end6 T: b# J3 g6 [2 T
  else if (cnt==160)1 B+ D/ {: E/ g' \/ ~. Z& d& N! t$ U
  begin
4 d0 d1 ~2 p0 {1 z! {, e- E# ~# F" T# u  send<=1'b0;
0 M7 W) g/ q3 T+ c2 a! }  end' S6 u& W4 b" ?- L9 Q: c! R) b
  end
1 B$ C& l0 i, @/ c% f  / u7 _& j& X  @( c
always @(posedge clk)) o2 e% Q0 u- l! }8 G+ `
begin" E# P; w' b% e9 `  J) d
  if(send==1'b1)
2 B  H  e& H' T# \5 t9 V' H  begin
1 t! Z! I" Z7 D& _- h3 q  case(cnt): [6 k* B2 T( c5 Z3 T
  8'd0:
, W' a6 W# G+ p, E6 e6 \* U  begin
, I( `; s! F6 {$ e  j' j# Q  tx<=0;( P/ v: H8 h. ?7 F' f9 @! |
  idle<=1'b1;
3 Y& O. Y5 u$ w5 v1 R  cnt<=cnt+8'd1;
0 ?) f* e! e! ^9 @4 t+ J  end
$ K6 t" P# h6 e# f2 k  8'd16:8 ?: \$ w* Q" C$ b, }. j
  begin" }+ L0 ?, A  W3 V  A
  tx<=datain[0];
5 T( H$ F% n; F  v2 {- g6 f  idle<=1'b1;! g* H( A# L5 S: G$ ]
  //presult<=datain[0]^paritymode;( U7 J0 T& X- ?
  cnt<=cnt+8'd1;
' [' L) ]  D; x8 Y9 X  end
1 i& L6 Z+ v4 Z$ C  x% h  8'd32:& L4 r8 O+ L& l
  begin
! v- P& l$ f0 D9 D; ?! P! T! g8 m  tx<=datain[1];4 c/ v4 k3 s: J7 l$ N: H
  idle<=1'b1;
* ?( V5 I% g: ~1 O- o4 _  //presult<=datain[1]^presult;9 j% E2 b8 ^1 \( b# G
  cnt<=cnt+8'd1;- H2 a3 t% B+ }2 X+ r
  end
0 B, `; \6 G  z6 b7 L  8'd48:
( ]! ~6 n! e- y5 R4 |* n  begin' J. Q7 M  I$ m( Y  X0 D7 b
  tx<=datain[2];) s; |. L  R' w3 [
  idle<=1'b1;4 p: u/ ~" Z4 h! a+ G$ Z9 {
   // presult<=datain[2]^presult;
. p. R6 n! m: F0 @6 h' \  cnt<=cnt+8'd1;
% N, @' b7 \! ~5 j  end( q% B1 }% ~, f; J! V& T2 c4 C7 @
  8'd64:
. T3 l: i1 Z( h' N2 l8 z  begin
2 ]# {  b; Z4 z  E& `  @% M  tx<=datain[3];( D7 F: t, ^6 o1 P
  idle<=1'b1;
0 ~3 Z/ a% t2 Z    //presult<=datain[3]^presult;
* X: ]0 F( P# U  cnt<=cnt+8'd1;
; H* }# {. v2 R6 U& z" t  end
2 U! f7 R: G6 }4 M  P! m1 H% \  8'd80:
: d  R8 l& B7 S, P) B9 U/ M& ^8 B/ T  begin4 R. j9 V* }1 R
  tx<=datain[4];. ?+ N7 l& j6 S0 L/ U7 S2 _2 M
  idle<=1'b1;, }* W( M0 A* D
   // presult<=datain[4]^presult;0 k, C; h- F! V" d" C1 ~/ ]+ M
  cnt<=cnt+8'd1;' k/ v/ R% E4 w9 l( Z7 w- S) q- I
  end
! N# A) [3 |% j6 Z( z  8'd96:
+ k- Q! D! f" C9 H, J  begin
1 j: q& W! T! y; h# w' j! \5 s  tx<=datain[5];
1 d5 @* w! O  u  c* T  idle<=1'b1;' i- E9 u* U  q3 J- V- M, l
    //presult<=datain[5]^presult;
+ J  M6 y% Q! ~2 ^( I7 ^  cnt<=cnt+8'd1;0 j9 y' K- g! D. O
  end# ?; k0 j) p& `$ c
  8'd112:
1 r9 Z/ H3 J" k3 {) Z  begin' i5 {* G/ g* N  b
  tx<=datain[6];3 L! H" y! R' |4 Y+ T
  idle<=1'b1;
( X! \0 n+ e9 J  g$ f: s6 g     //presult<=datain[6]^presult;5 |8 p' ^2 E) b( k
  cnt<=cnt+8'd1;
* J! j! W) e/ P9 @1 i" V  end: d) E  M1 L# k* v
  8'd128:
6 R4 V2 L7 a- e/ p& d' W  begin3 U  M4 n0 p! N  `. S
  tx<=datain[7];
7 |" [% p9 z( a5 T  idle<=1'b1;' r( M' K. z( m3 t, u6 b( c" Y. R
     //presult<=datain[7]^presult;& U. n' o" C2 w, O
  cnt<=cnt+8'd1;% k7 k6 r6 k2 V/ C
  end
, S5 B9 A& D2 P  /*8'd144:5 m) C1 S3 h! S5 Z& {
  begin  ]! K' W& X/ v: y! o
  tx<=presult;
; }% a# [% B+ P+ }( r# o  idle<=1'b1;
: \$ \" Z7 A( b6 R0 ~  cnt<=cnt+8'd1;6 W4 T' x; {+ g8 ]5 ^9 L1 L
  end*/
$ R- l9 S7 Q4 B6 H6 b  8'd144:
* C% }( B7 x% Y& R* S  begin) m1 i$ ^/ w9 K. }# m% [& d$ \
  tx<=1;# }' a* B, M  E2 X5 i. D
  idle<=1;- v' Q: Q; V  {% f
  cnt<=cnt+8'd1;
8 J% R3 l& y: x1 s' V  end; a6 o! c4 j$ y, [
  8'd160:' E( r; I7 O) B$ C$ [
  begin0 O) h- f- Z0 s" v; i
  tx<=1;
- {( O( F6 g  T0 b7 z- o  idle<=1'b0;
  Q  i3 t8 M2 c0 e9 ]  cnt<=cnt+8'd1;
$ o$ A7 I; H- `$ Q  end0 i' a" j6 B2 N% `! d$ {
  default:0 a+ q& t9 F/ c( }9 ~4 o0 O% P
  begin& E/ Z: I2 I5 v8 L6 Y) _
  cnt<=cnt+1;) L' Z2 e+ K3 j0 O- W* C
  end
3 P3 d' O- h& ^" `  endcase. X/ Z, N9 _, Q9 R9 |, A5 J
  end; A' L8 d. @7 J8 N1 G
  else: X; g6 P, F( ]* c
  begin, k5 M% ?0 V2 E+ W) v, Q, Y; k
  cnt<=8'd0;  K# c$ X! U* M/ b& D1 p8 Q+ x
  idle<=1'b0;
9 P8 r1 ]2 O2 h( [. B  tx<=1;
6 t! ?7 r& M! G' f  end
/ N, t3 M4 _0 i+ k- Z2 A  end( h! I, A9 o3 H. j. ]
  endmodule. m7 _+ r$ k) P' {0 \5 y  A
5 y- f) F# [9 Z
分频模块:& [5 [# Y; j6 s8 H6 V
module clkdiv(sysclk,clkout);
- `5 T" Z) a$ Y2 N5 E" ^6 D! ]input sysclk;
2 F/ n& A! h# a$ t5 A' U) aoutput clkout;
: Z( `; b7 K5 s: breg [7:0] cnt;1 [3 u% C# l2 {) B# ^
reg clkout;9 f  ~- A, L8 B
always @(posedge sysclk)' s1 N8 c+ j$ o. g2 ?# ]
begin
# J) z; f. p+ ~# Y0 a( hif(cnt==8'd12)3 u& t1 a/ J" k2 s6 t
    begin
8 w4 w! u; W7 Q# I) {% S* A- Rclkout=1'b1;
& u& u: i, V" E9 r) qcnt=cnt+8'd1;
: N% a7 ]7 f; V# X) Iend
3 F* F4 {" X# R8 U; telse if(cnt==8'd26)" H! }: J3 O$ v2 m. M. w
    begin& J7 Z6 x) T6 m1 U  I& K8 H
clkout=1'b0;$ x6 u4 F0 s+ e
cnt=8'd0;( C& {& i4 T, i# L0 ~1 P
end0 X( [- j6 Z9 R& _0 f
else
1 Z; H' J" q8 Z- Z    begin
! N5 b9 i6 E1 q/ O$ o1 R) L4 p' gcnt=cnt+8'b1;
* G$ g8 b0 Q9 R. b6 B1 N4 ~end: R9 h  i3 ]; s
end
7 e+ M( D: Y0 ]! Wendmodule

该用户从未签到

2#
发表于 2013-11-24 12:35 | 只看该作者
串口好像就8位数据位最多了,没有听过16位数据的。6 [- ?& z, J7 d$ ], z
; S- K! c3 Z" W2 n9 |
以常用8位为例 1位起始位,8为数据位,1位奇偶校验可选,1位停止位。
5 |! k# P) q5 }6 R' B  I. y! ?- X8 i6 n2 I
# `, D. i- I$ j! q: y
你发16位怎么发现,单片机/电脑串口能行吗?

该用户从未签到

3#
 楼主| 发表于 2013-11-25 09:20 | 只看该作者
zgq800712 发表于 2013-11-24 12:356 x* q& \# i1 F; b3 q
串口好像就8位数据位最多了,没有听过16位数据的。
7 F" _% i# \& f" f
; p0 T% D* K" t$ @! j- T& Q以常用8位为例 1位起始位,8为数据位,1位奇偶校验可 ...

8 q( o4 H7 ~- h( C/ J3 O那假如我要通过串口发送一堆数据 , 那该怎么处理呢 谢谢

该用户从未签到

4#
发表于 2013-11-26 12:04 | 只看该作者
when90 发表于 2013-11-25 09:20
& Z& c5 F5 U) g那假如我要通过串口发送一堆数据 , 那该怎么处理呢 谢谢

% W0 a( o0 w  p9 b9 x2 r( f' k8位是一个字节,单片机等多是这样发的。
1 ]' R* `" s; J一次发送一个完整的串口帧,起始,数据,结束...
5 D# x5 `, T3 t. P8 i很多个数据就重复上面的过程。
4 n8 l+ y: ?, c2 T
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-5 19:50 , Processed in 0.125000 second(s), 24 queries , Gzip On.

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

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

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