Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 7904|回復: 5
打印 上一主題 下一主題

[問題求助] uart 的verilog程式的問題

[複製鏈接]
跳轉到指定樓層
1#
發表於 2010-10-20 14:30:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是我的程式:
5 G+ ]% _# s9 Imodule async_receiver_1(clk, RxD, RxD_data_ready, RxD_data_out, RxD_endofpacket, RxD_idle);
# P4 P' A8 t/ d, x! B$ f4 J- zinput clk, RxD;. b8 V8 r# u' M* M+ v& R* K
output RxD_data_ready;  // onc clock pulse when RxD_data is valid
3 P1 m2 F6 l0 `. B$ N3 Goutput [7:0] RxD_data_out;3 X1 t! H$ V! H8 _  w/ `) _! t( }( h

8 X* q9 U% J9 U2 r  d8 v# _parameter ClkFrequency = 5000000; // 5 MHz
( D: g& z4 s$ |4 kparameter Baud = 115200;
& t0 e1 ^7 B' f8 T9 s$ r. D% S6 O# w; i- b: v
// We also detect if a gap occurs in the received stream of characters) D, k7 W' a1 D! ^( h
// That can be useful if multiple characters are sent in burst' X4 U. m/ I1 }  A9 t
//  so that multiple characters can be treated as a "packet"& J0 {0 f$ j2 H7 w4 a% u+ ]' C
output RxD_endofpacket;  // one clock pulse, when no more data is received (RxD_idle is going high)
1 |# p3 s! V. _; ~output RxD_idle;  // no data is being received
. ]. ]; [, Q4 [! U# p# y  w4 a3 n4 y' z
// Baud generator (we use 8 times oversampling)+ I  V8 [8 D) n9 W. k$ y
parameter Baud8 = Baud*8;8 G6 @, b) X/ t
parameter Baud8GeneratorAccWidth = 16;, r- @4 Z+ z/ {. _8 |4 y+ ]
parameter Baud8GeneratorInc = ((Baud8<<(Baud8GeneratorAccWidth-7))+(ClkFrequency>>8))/(ClkFrequency>>7);
; g( d7 q+ z# j8 v2 c  ?2 U! u9 x3 ireg [Baud8GeneratorAccWidth:0] Baud8GeneratorAcc;% J# B% Q$ Y1 K) J5 A$ _* C
always @(posedge clk)
1 |% c5 f' A" d! @; a        Baud8GeneratorAcc <= Baud8GeneratorAcc[Baud8GeneratorAccWidth-1:0] + Baud8GeneratorInc;
2 E/ M/ J: C/ }3 Swire Baud8Tick = Baud8GeneratorAcc[Baud8GeneratorAccWidth];
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2010-10-20 14:30:49 | 只看該作者
////////////////////////////3 F+ }8 Z6 l2 N) k# w; V
reg [1:0] RxD_sync_inv;
& s& b' T$ |- |  q7 N- talways @(posedge clk) , l9 U% i' y) A; B$ h. H* h# d
if(Baud8Tick)
3 Q% k# U# Y4 @! m        RxD_sync_inv <= {RxD_sync_inv[0], ~RxD};
4 z+ y4 z9 t8 A, b$ A// we invert RxD, so that the idle becomes "0", to prevent a phantom character to be received at startup
& a- s' {, Y9 K! X- }, i( k/ Z$ y" n  J, {3 x
reg [1:0] RxD_cnt_inv;( L! H# r8 s* N# h6 u7 i3 }
reg RxD_bit_inv;* b6 U% m' R) F" B' Q

8 N, a3 ~3 h3 k" v/ Xalways @(posedge clk): x3 V4 t& k# T, h/ q! o9 [% N
if(Baud8Tick)  N1 y/ p" Z) D6 _0 l
begin/ M/ J6 l8 E. Y) ]/ o% q1 M$ g
  if( RxD_sync_inv[1] && RxD_cnt_inv!=2'b11) RxD_cnt_inv <= RxD_cnt_inv + 1;
3 h7 Z& R2 {/ ^4 L2 n7 D  else 6 m% D: m  Q  y5 L, |
  if(~RxD_sync_inv[1] && RxD_cnt_inv!=2'b00) RxD_cnt_inv <= RxD_cnt_inv - 1;: E; F2 t$ s) Z) T1 c
  |3 Y3 n0 t) z* G* K- Q& u" r
  if(RxD_cnt_inv==2'b00) RxD_bit_inv <= 0;9 }3 @$ _, q) r& R- F0 W8 N$ w
  else) y$ \& d* b/ E+ y5 ^9 s
  if(RxD_cnt_inv==2'b11) RxD_bit_inv <= 1;! x0 X0 a2 e0 K: w
end" j$ t# k7 O  r" i

% m0 T; `) p& a- V& G  Jreg [3:0] state;, K5 ~0 Y' ~; o/ p4 ~! g
reg [3:0] bit_spacing;' @  r4 H% \+ P
0 a3 i; z" c0 U. |& E
// "next_bit" controls when the data sampling occurs. F. T( r1 _% ~  l0 M
// depending on how noisy the RxD is, different values might work better4 b/ n: L; D5 o- Y3 V: {
// with a clean connection, values from 8 to 11 work
# g* G* k# s7 O& \8 f4 S! Zwire next_bit = (bit_spacing==10);. V; R# ?( P' `" f( u/ U
, `! [: b; \8 v5 \+ ]6 n  B. w
always @(posedge clk)
0 v  E- V2 A: p5 }% \4 n) F( mif(state==0)# B2 m5 p5 N0 I1 U; p0 i
  bit_spacing <= 0;4 y2 b2 B/ ~* Z) f( [- |9 `3 F3 e
else
' X* j- L8 T: K0 yif(Baud8Tick)- P+ b. |4 V  M$ r
  bit_spacing <= {bit_spacing[2:0] + 1} | {bit_spacing[3], 3'b000};
3#
 樓主| 發表於 2010-10-20 14:31:09 | 只看該作者
always @(posedge clk)* O* V0 p) w( H+ n- f3 B% r
if(Baud8Tick)
, H- b6 I8 ?, Z; N# A& p' tcase(state)6 i! N1 p3 a* T& ~1 M  c. q0 Q
  4'b0000: if(RxD_bit_inv) state <= 4'b1000;  // start bit found?
4 s0 b( p; f  L/ d) j7 d/ q- e3 i  4'b1000: if(next_bit) state <= 4'b1001;  // bit 03 R/ h: d" Q" c$ {" H- L! D$ T1 }( a
  4'b1001: if(next_bit) state <= 4'b1010;  // bit 18 k& W" m! y* ?% v9 L- }
  4'b1010: if(next_bit) state <= 4'b1011;  // bit 2
$ w# b) }, X6 ^; v  4'b1011: if(next_bit) state <= 4'b1100;  // bit 3
# {& ^# @5 L9 N. I, i, C* R  4'b1100: if(next_bit) state <= 4'b1101;  // bit 4+ P& m) E. v! Q9 F
  4'b1101: if(next_bit) state <= 4'b1110;  // bit 5% |- O& U; O. G+ @
  4'b1110: if(next_bit) state <= 4'b1111;  // bit 6% ]% f5 u  P) P! I) G
  4'b1111: if(next_bit) state <= 4'b0001;  // bit 7+ [# L. E, ^8 p3 c7 \
  4'b0001: if(next_bit) state <= 4'b0000;  // stop bit
3 p2 P( `4 O: x7 d" N2 w' e  default: state <= 4'b0000;
. t6 z( m8 f6 g+ M5 s% X! ~2 y: V5 ~endcase
4#
 樓主| 發表於 2010-10-20 14:31:16 | 只看該作者
reg [7:0] RxD_data;  A* o3 \% g0 y- p+ c7 M
reg [7:0] RxD_data_out;
0 x! {4 t$ {9 N* s! Q. t; g; y, `always @(posedge clk) begin+ f/ J3 T' e6 C# H1 P
if(Baud8Tick && next_bit && state[3]) begin
( E; M( _9 y% g) _- Q   RxD_data <= {~RxD_bit_inv, RxD_data[7:1]};4 p6 Q& {( O8 D- `1 o' }( G
end# H/ y" _5 M/ l' E5 E, d
if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin8 A" L" n$ I& H# ?6 B
RxD_data_out <= RxD_data;
! y! H# ?( ?, o* e3 g% A end
6 Y# t8 y; j5 D+ o$ Fend
2 q+ f  y: F4 k. g0 f
; u. F. _( c3 }/ e1 I0 f8 c
* b$ p5 f" {+ G  Ereg RxD_data_ready, RxD_data_error;* o* ?0 w6 X$ T* j/ ~0 I) C% x$ V0 _
reg RxD_data_ready_in;, S6 b$ l/ h. h9 f. l, u" Q' g
reg[0:2] count;
2 l* G5 n( T' W6 s+ Y/ s& z4 kreg[0:2] count2;" m* l3 ~+ L' g5 q+ m' V
reg count1;$ v; Y) l+ R3 h
always @(posedge clk)
) ?4 J) c# R$ dbegin5 I" a8 C4 t9 P' N* C' w
( q8 Y9 y' S9 W5 s  k* r3 f* b
  if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin
) T( W6 I0 B0 j' m9 t- G2 Q   RxD_data_ready_in <= 1'b1;/ y* p& i5 g: Y2 F3 j4 C; M, O- Z  N
        count1 <= 1'b1;
9 [9 E  x& ?: W* F: C  E' i) R        count <= 3'b000;
0 A9 q9 ~0 D1 w: ~4 ?/ v( f        count2 <= 3'b000;
! w1 i( {- U$ x3 W2 B: ~  end                     
  i6 C, r3 N# s# O& F8 B. i/ y  else if(count==4 && count1==1 )begin/ ~3 y- i' X: I: A, |
           RxD_data_ready <= 1'b0;
1 I. d# Y" P2 _9 l. X           count <= 3'b000;  p2 Y( M0 o1 j# j( d* k# U
                count2 <= 3'b000;
. }$ M' n4 S, j: D1 V. k                count1 <= 1'b0;5 @" V, t+ A  {9 A5 U
          end
! Q& n6 {- L, u, a1 f& d          else if(count2==4 && count1==1 ) begin+ ~' u- r; o  r) ~0 T
          count <= count+1 ;2 o3 \6 W* s5 M7 e4 @8 f7 u) ^
          RxD_data_ready <=  RxD_data_ready_in ;
$ B* E' X. g8 A9 f& s3 b          end$ b2 F0 N( A$ m+ e: e  g4 u/ }+ O& l
          else begin8 i) x  E+ B6 P, d& B. J$ I
          count2 <= count2+1 ;
5 ^2 }# H# ?( B( Y: N8 D          RxD_data_ready <=  1'b0;
. }% g+ u  D, S) h9 h          end
! m# |8 S# I# X$ q, O* g  ?& `; `" D% \  RxD_data_error <= (Baud8Tick && next_bit && state==4'b0001 &&  RxD_bit_inv);  // error if the stop bit is not received
* J8 S5 R5 E( q" C1 \
" V1 j, E, t* i2 Q9 U6 ?. j! gend  ?- c) T$ a2 h; \# V. L
' L* n  e4 u3 F; w& J& d

" m/ e) V( X6 C0 R+ s4 g. i
" ]. q: r9 E6 R. a4 v& P" [reg [4:0] gap_count;6 |2 m: p" \! {4 s, u5 }! Z+ i: U
always @(posedge clk)
5 C& Y  c# T# C0 c7 m8 Z3 \  `; H        if (state!=0) 0 e' O0 o, S& R  m! M" n/ \7 h
                gap_count<=0;
6 x: A  p) N: [3 D        else if(Baud8Tick & ~gap_count[4])
& E: t% O- K% X, X  B                gap_count <= gap_count + 1;
. a. F- N- v5 g1 j# q  D. y9 Bassign RxD_idle = gap_count[4];9 m/ j7 F1 X8 S/ l6 Y* F! X
reg RxD_endofpacket;
4 q+ m4 {9 Y$ Calways @(posedge clk) " @: g( }% }; u. f/ ~
RxD_endofpacket <= Baud8Tick & (gap_count==15);% h) W2 Z5 ]+ p2 H5 }
) R  t, {; Z+ {5 S5 [! Z4 G
endmodule& ?5 q* w1 b% a1 A/ i" f

& U2 s  a8 ?% _) `5 K+ e我想知道為什麼RxD_data_ready腳在資料錯誤時還會拉成high,麻煩會的高手教教我,謝謝!
5#
發表於 2010-11-18 16:43:46 | 只看該作者
RxD_data_ready 似乎只在count2==4就會拉high
1 G5 g6 u: S8 I9 z7 Q- {) E程式中並未看到資料錯誤時須將RxD_data_ready拉low
: i* K( n) e+ h/ R* b3 v8 B) A. L5 a
另外   6 C: @. M; ?* A  Y- @; ~
請說明你的"資料錯誤"是在什麼狀態的資料錯誤?
6#
發表於 2011-1-16 09:53:45 | 只看該作者
等待高手回复 不是自己的写的 懒的看咯
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

首頁|手機版|Chip123 科技應用創新平台 |新契機國際商機整合股份有限公司

GMT+8, 2024-5-15 11:51 PM , Processed in 0.104013 second(s), 17 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表