|
樓主 |
發表於 2010-10-20 14:30:49
|
顯示全部樓層
////////////////////////////
/ ? ~" T% d( x; v: j, o H, Ireg [1:0] RxD_sync_inv;
. j$ t6 B7 _9 j H: j2 \always @(posedge clk) ^9 s* X: g1 b4 e0 u; y# u
if(Baud8Tick) * V/ v1 l+ O2 D: y& D* z! T
RxD_sync_inv <= {RxD_sync_inv[0], ~RxD};% J7 A( k5 t6 J+ h/ C9 \
// we invert RxD, so that the idle becomes "0", to prevent a phantom character to be received at startup
9 [' F/ h2 W2 P2 t/ z% v
9 [& T" c3 t* X/ m0 C& E% v2 Y$ dreg [1:0] RxD_cnt_inv;% Q }% E( Q( d* J
reg RxD_bit_inv;& s6 D4 \9 b1 ^! w' S7 [6 ~/ [
1 p2 }' U" f) b4 i6 Calways @(posedge clk)
8 {3 N0 e$ P+ }( X( d5 z+ y: i- Rif(Baud8Tick)3 `8 w2 |+ S* ~1 @' B
begin% L6 f/ l( c S7 S. ]) R8 ]
if( RxD_sync_inv[1] && RxD_cnt_inv!=2'b11) RxD_cnt_inv <= RxD_cnt_inv + 1;6 o2 F, u$ R. u$ X
else n+ j! V( X$ R7 b
if(~RxD_sync_inv[1] && RxD_cnt_inv!=2'b00) RxD_cnt_inv <= RxD_cnt_inv - 1; v3 f) p0 M7 k2 S/ l5 H
/ c, ], q0 u; }
if(RxD_cnt_inv==2'b00) RxD_bit_inv <= 0;
: v/ A {, x; Q) ~# m else0 \" n, V1 z( k3 p0 d- w
if(RxD_cnt_inv==2'b11) RxD_bit_inv <= 1;
$ \7 p' h$ b% _1 a& w" U1 iend. ]4 {" M1 w& k2 ]
3 u- L2 Y; U0 r
reg [3:0] state;$ o- M; t; [( S: w# V
reg [3:0] bit_spacing;
, B' _+ B9 M' M3 t& c+ [$ p/ w. K- v- @" `, a
// "next_bit" controls when the data sampling occurs- L0 P6 L/ e O" k$ B- u; D
// depending on how noisy the RxD is, different values might work better) p- _9 Z( H5 L7 j, ^% T: p7 I
// with a clean connection, values from 8 to 11 work; U5 h: \" T) s: k
wire next_bit = (bit_spacing==10);
$ v, [4 g8 \+ v, o0 |% P0 U
6 g: L' j6 ~# L5 u& palways @(posedge clk)8 W, j% R* U& |/ ~* B; w/ U
if(state==0)
}2 }# h' S) O) h3 F/ M, R' B* m bit_spacing <= 0;
2 w/ ^/ `3 z1 A; t/ y/ L1 s9 a# ^else6 ]+ V$ C9 ?+ Z+ h3 h7 |- S. Q
if(Baud8Tick)
& Z5 U8 W; y$ y! v0 r$ m bit_spacing <= {bit_spacing[2:0] + 1} | {bit_spacing[3], 3'b000}; |
|