|
2#
樓主 |
發表於 2010-10-20 14:30:49
|
只看該作者
////////////////////////////% E2 r; _6 A7 H1 F; R; k
reg [1:0] RxD_sync_inv;3 M; c/ K q( B* W, |
always @(posedge clk)
! I+ ^& C! p }" p3 ]. L7 V# L" X/ A, ^if(Baud8Tick)
# {$ u5 o3 ^; ~4 a: i+ m0 l' i9 ~ R; Y4 | RxD_sync_inv <= {RxD_sync_inv[0], ~RxD};5 e4 W& C; S& o
// we invert RxD, so that the idle becomes "0", to prevent a phantom character to be received at startup+ Y) t6 }3 ~( r) t
: H( ^. C- A3 u" Creg [1:0] RxD_cnt_inv;
: F c% t+ U" b+ J( T% Z1 qreg RxD_bit_inv;
( h5 {4 I" _( v6 d" S( |3 D) S
. a+ E3 E2 j1 h7 `7 F8 Y2 d6 S& Ialways @(posedge clk)
, e' I2 p- l! F. d) Y6 lif(Baud8Tick) O4 r2 L3 p8 a
begin8 E* e& G L& D- Q1 P/ Y7 j
if( RxD_sync_inv[1] && RxD_cnt_inv!=2'b11) RxD_cnt_inv <= RxD_cnt_inv + 1;& D# w9 L% F- w0 n
else $ r- o% x. c2 H* n5 r7 X
if(~RxD_sync_inv[1] && RxD_cnt_inv!=2'b00) RxD_cnt_inv <= RxD_cnt_inv - 1;
9 p( I- O8 u _9 i, {, w6 K! _$ O0 L+ Q, F9 `
if(RxD_cnt_inv==2'b00) RxD_bit_inv <= 0;
. U9 k; _! J" @( M; _- U else2 u6 ]5 j! M0 D9 K
if(RxD_cnt_inv==2'b11) RxD_bit_inv <= 1;' t" i+ @& p) {+ F
end
3 \8 p) O% Q7 G7 O" T [& h3 u: k5 l, m* C$ U# Z* |5 o; C
reg [3:0] state;
& \3 [6 w! T' F4 \4 `reg [3:0] bit_spacing;0 `7 d* U1 B( ^3 X' ?7 n6 w
) t6 D5 o9 e% [3 L; v0 j) G
// "next_bit" controls when the data sampling occurs
# w) q A/ B. i+ g9 a// depending on how noisy the RxD is, different values might work better% i# G1 @/ y7 b8 l
// with a clean connection, values from 8 to 11 work
$ A. w% }+ A! \, w) [+ D5 awire next_bit = (bit_spacing==10);% |! Q1 W4 X6 F: @0 p
/ b7 V/ J m, ~0 O B* a3 Palways @(posedge clk)
3 K1 ]% W% z/ C3 J9 r+ r4 G# O: Jif(state==0)! Z) q2 c& }, Y! Y! w7 p& Y, u
bit_spacing <= 0;
% B% b; T) a7 ]4 H% Belse l$ H8 ?9 x, L" d, e
if(Baud8Tick)
4 i/ M# ]) k9 n* z3 r bit_spacing <= {bit_spacing[2:0] + 1} | {bit_spacing[3], 3'b000}; |
|