Chip123 科技應用創新平台

標題: uart 的verilog程式的問題 [打印本頁]

作者: s850187    時間: 2010-10-20 02:30 PM
標題: uart 的verilog程式的問題
這是我的程式:. V! @/ N) J  I% B: r/ p- H
module async_receiver_1(clk, RxD, RxD_data_ready, RxD_data_out, RxD_endofpacket, RxD_idle);
4 c  f( F; k! y: einput clk, RxD;
8 {: ~- n& _( X& eoutput RxD_data_ready;  // onc clock pulse when RxD_data is valid
: y- v! [( [+ k  a7 r/ P2 moutput [7:0] RxD_data_out;! \5 A% `; V& t

9 X9 K3 g: }0 i4 ^; U) Oparameter ClkFrequency = 5000000; // 5 MHz' U9 d$ F3 t4 a
parameter Baud = 115200;. {2 |5 ~4 ]8 o

  w' X3 F' w% A// We also detect if a gap occurs in the received stream of characters
( I" ~3 K" p3 N, }# V7 t0 j// That can be useful if multiple characters are sent in burst" E: u) U5 G& ~+ K; C% C, Z
//  so that multiple characters can be treated as a "packet"
) J! p/ [/ R' k2 p6 R7 D, ^, ~output RxD_endofpacket;  // one clock pulse, when no more data is received (RxD_idle is going high)
8 J$ H0 Z5 W. r9 M8 ^output RxD_idle;  // no data is being received* S1 I+ _* p: d6 S
) G# d  A% ~% N8 k" M
// Baud generator (we use 8 times oversampling)
8 {$ [! ]" E1 C6 M# ]6 Q8 sparameter Baud8 = Baud*8;
+ f1 x4 P% {; J, G' j- C+ Zparameter Baud8GeneratorAccWidth = 16;
( {; m) S3 P9 U9 I# A0 oparameter Baud8GeneratorInc = ((Baud8<<(Baud8GeneratorAccWidth-7))+(ClkFrequency>>8))/(ClkFrequency>>7);! O9 |" `. W( E& Y* a' Q
reg [Baud8GeneratorAccWidth:0] Baud8GeneratorAcc;  U) L6 @6 e* A; k; T+ H% @/ k
always @(posedge clk) 6 r: s/ C5 f- X! t6 D5 W; S1 Z0 O
        Baud8GeneratorAcc <= Baud8GeneratorAcc[Baud8GeneratorAccWidth-1:0] + Baud8GeneratorInc;# R) D8 T. y$ e1 ]: @1 ]3 u
wire Baud8Tick = Baud8GeneratorAcc[Baud8GeneratorAccWidth];
作者: s850187    時間: 2010-10-20 02:30 PM
////////////////////////////
+ D) w, t3 n- f; F; z9 I6 V3 @% [reg [1:0] RxD_sync_inv;9 k: v' q( M! V
always @(posedge clk) $ [1 s/ V( j' y8 f  b2 s
if(Baud8Tick)
1 S" E3 z2 Q; P6 \        RxD_sync_inv <= {RxD_sync_inv[0], ~RxD};
6 b% [+ e. I3 i// we invert RxD, so that the idle becomes "0", to prevent a phantom character to be received at startup+ F' d- Y" [% |) i/ f3 [  {

. X3 ?. V1 \$ Z* c2 F- Qreg [1:0] RxD_cnt_inv;
. b( n+ P# D9 d1 s) O& K' Zreg RxD_bit_inv;
# }% o3 X( r/ _7 B+ |3 A) F0 _  H  m
3 X( f* p- k0 p% V3 K0 dalways @(posedge clk)
3 b+ f9 W, T0 v; Zif(Baud8Tick)
& s5 b. L, C. {- z* Q' wbegin7 s! C# L( T1 T! s& U6 w: {
  if( RxD_sync_inv[1] && RxD_cnt_inv!=2'b11) RxD_cnt_inv <= RxD_cnt_inv + 1;4 T) U, [+ s" m# J  ~3 V: ]
  else ! {2 a1 I* }( y! I- B
  if(~RxD_sync_inv[1] && RxD_cnt_inv!=2'b00) RxD_cnt_inv <= RxD_cnt_inv - 1;. k: j* e$ j+ {$ v+ Q' z" f

& I! r4 V0 z! Q9 g1 a4 Y% l! i1 Y  if(RxD_cnt_inv==2'b00) RxD_bit_inv <= 0;
" d9 i: J. T! j4 k) q+ G3 l! V1 L  else9 t; B2 A/ J- o2 B
  if(RxD_cnt_inv==2'b11) RxD_bit_inv <= 1;
! [) |9 e! O: O8 }) |0 c9 q& qend7 w4 P: W# y8 o- }0 w/ A2 a( G8 n
9 ^* I+ s- U3 A2 r, \3 P" o
reg [3:0] state;
3 ]  m1 @" \( f( Ireg [3:0] bit_spacing;8 A4 g' u( e6 d& d

  @; L  d& e) Q  q* b, G% H// "next_bit" controls when the data sampling occurs. b9 @7 q2 E: L2 P
// depending on how noisy the RxD is, different values might work better
0 z# t$ T$ R% }% t- R3 ]// with a clean connection, values from 8 to 11 work# b3 n; T; H8 x  h5 o+ Y9 m
wire next_bit = (bit_spacing==10);/ d$ q; t: O8 M( Y
$ e, D5 q2 i  n; `
always @(posedge clk)
' P1 X( D  w3 mif(state==0)  ]6 o* r$ t  N, ]
  bit_spacing <= 0;
- c2 y' x) B! u6 E9 W6 A; jelse
( P) t# i# d7 Q0 g; ~+ Vif(Baud8Tick)( D( g2 F: z1 [& Z& z
  bit_spacing <= {bit_spacing[2:0] + 1} | {bit_spacing[3], 3'b000};
作者: s850187    時間: 2010-10-20 02:31 PM
always @(posedge clk)# z1 n/ _) e! D! S
if(Baud8Tick)
4 q1 t; y: J, M, W: n: P2 B* }case(state). a, G+ O" @! p. Q+ }2 ?* f  @, C
  4'b0000: if(RxD_bit_inv) state <= 4'b1000;  // start bit found?
6 x% N7 ^! k7 }: h* d8 U7 u  4'b1000: if(next_bit) state <= 4'b1001;  // bit 0' f, H! t& E9 T* y, M. L7 ]# o
  4'b1001: if(next_bit) state <= 4'b1010;  // bit 1. w! Y1 o$ k1 g, O' L7 `  b1 ^
  4'b1010: if(next_bit) state <= 4'b1011;  // bit 2; ^) o- U' E4 Y' O
  4'b1011: if(next_bit) state <= 4'b1100;  // bit 3& O5 I1 ^+ i* E" K% A$ s& W
  4'b1100: if(next_bit) state <= 4'b1101;  // bit 4
$ e, j& M+ g( ?! J3 y/ z  4'b1101: if(next_bit) state <= 4'b1110;  // bit 5+ T% v/ d, p( h9 X7 y, r
  4'b1110: if(next_bit) state <= 4'b1111;  // bit 6
: P2 W% b# [9 G, Q, w  4'b1111: if(next_bit) state <= 4'b0001;  // bit 7
- L9 a% K* _$ g* T0 I+ s  4'b0001: if(next_bit) state <= 4'b0000;  // stop bit
% `2 ?& d6 d; w5 b  default: state <= 4'b0000;
% g7 O' s# ~3 j$ U. {: tendcase
作者: s850187    時間: 2010-10-20 02:31 PM
reg [7:0] RxD_data;
! R. Q% H! ~7 creg [7:0] RxD_data_out;
' a" `& L( A( T- z4 palways @(posedge clk) begin  {" z3 I6 i8 m; Z. d
if(Baud8Tick && next_bit && state[3]) begin
% {$ n" a( f1 K0 {. h; O9 O   RxD_data <= {~RxD_bit_inv, RxD_data[7:1]};* d8 F, c/ V# m$ Q1 U* b
end# _; s! a2 ?: O! D* D
if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin
  j0 H5 E/ [# X# R RxD_data_out <= RxD_data;
( b6 h7 B8 h$ p$ f( ?3 @* Q end
! m  P8 r; G+ y1 b, y  i& ~end
; A: n; F( ]; H" a" L9 z8 R# K4 z" G1 I1 _, F

+ `! c+ X( r( P0 S3 B& greg RxD_data_ready, RxD_data_error;
- n/ i) K7 l4 s! l9 ]reg RxD_data_ready_in;/ `9 E" J- f1 g- @, k
reg[0:2] count;$ l6 a8 t3 F" u6 F1 h7 h0 n, O
reg[0:2] count2;' `/ W# Z5 \: V: ~8 @
reg count1;
9 a* @! {5 J8 v7 g7 b  Q4 ?+ Talways @(posedge clk)! S* Z, j4 G6 {2 i
begin1 x0 q. H( m7 X8 {4 n7 [+ {
" S# P; |9 S& X
  if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin5 p8 I' Y. J+ H3 _) E( y
   RxD_data_ready_in <= 1'b1;( `) ^- M6 N9 ]1 R
        count1 <= 1'b1;
2 u; F3 C+ N( ?' t        count <= 3'b000;) G% w" @, p5 D" \' b
        count2 <= 3'b000;
# \& u- J; b4 E6 _$ {. L9 g8 ]% p  end                     5 M* c; c, o; n( N# @
  else if(count==4 && count1==1 )begin
) c# S! u( L, ?           RxD_data_ready <= 1'b0;
9 X1 \, G( V. F5 W7 F& x$ Z2 L           count <= 3'b000;
+ @: c" i5 i0 m4 |, e                count2 <= 3'b000;2 ]; Q! |0 M6 q1 x
                count1 <= 1'b0;% G& C! i& B  E" V* k+ M! n8 ?+ j
          end- x7 X8 M: H! G! i8 T
          else if(count2==4 && count1==1 ) begin
1 Y3 k0 o/ ]% M+ O) g5 B9 @2 I          count <= count+1 ;, w3 I0 J" M& e. W) o8 U" T
          RxD_data_ready <=  RxD_data_ready_in ;
' ?. F9 l) i2 Q/ |; q7 D# v" }          end
  S( I* _& `$ K9 Q. C4 L% Z0 ?1 p" h          else begin
5 E8 V2 M# S9 t  J7 Z1 i* @          count2 <= count2+1 ;
0 h1 J5 w" }# N* G$ R5 z          RxD_data_ready <=  1'b0;7 |0 ^) T$ f" u; M  e& p. n$ ?! M
          end- p( H  T. S& a* K0 @& q" n
  RxD_data_error <= (Baud8Tick && next_bit && state==4'b0001 &&  RxD_bit_inv);  // error if the stop bit is not received7 x" t" x6 g0 @& T' A/ e, k

' H, \' E  O) y2 k7 d. z( q+ ~% a! H! Zend
9 a! ~& l7 a; n8 S5 {( n0 j% m! Z. e0 ^5 S( c

, [; P6 z* n- A& h1 |& w
9 c7 J1 U) [' ^reg [4:0] gap_count;) H! A% Y" o' R/ c+ K
always @(posedge clk)
: ~" h' ?, J5 v1 o5 o        if (state!=0)
$ p) H2 O! L% D* u2 D7 i- Q5 }                gap_count<=0; 2 W, j- {0 B1 |* w/ n4 S
        else if(Baud8Tick & ~gap_count[4])
9 T" `3 r% U; X4 S                gap_count <= gap_count + 1;2 R3 t, v6 B" T$ d
assign RxD_idle = gap_count[4];$ ?9 n3 K% H+ m8 w) N0 O/ {/ p& }
reg RxD_endofpacket;
' B# R* |7 H8 A- G" t& Ralways @(posedge clk)
3 @& Y/ H! N) J* HRxD_endofpacket <= Baud8Tick & (gap_count==15);" c8 f/ ~. Z8 x2 ?1 g  d

/ ?7 g3 e( i: s) B  Vendmodule7 C7 l! x% w9 v' t3 j5 K! n$ F# D

" g$ C$ q# V  }. A' |! H$ L我想知道為什麼RxD_data_ready腳在資料錯誤時還會拉成high,麻煩會的高手教教我,謝謝!
作者: tuby0321    時間: 2010-11-18 04:43 PM
RxD_data_ready 似乎只在count2==4就會拉high/ w, b, a" H/ A# j7 o
程式中並未看到資料錯誤時須將RxD_data_ready拉low
" t6 ^  i* m0 e8 M  V& [7 ?- t: T/ Q- ]; q) D
另外   
3 o* h+ E  L. R6 R! D+ [- J請說明你的"資料錯誤"是在什麼狀態的資料錯誤?
作者: stephen1065    時間: 2011-1-16 09:53 AM
等待高手回复 不是自己的写的 懒的看咯




歡迎光臨 Chip123 科技應用創新平台 (http://chip123.com/) Powered by Discuz! X3.2