Chip123 科技應用創新平台

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

作者: s850187    時間: 2010-10-20 02:30 PM
標題: uart 的verilog程式的問題
這是我的程式:' R8 j6 w! K& _$ N* t4 _+ I
module async_receiver_1(clk, RxD, RxD_data_ready, RxD_data_out, RxD_endofpacket, RxD_idle);1 b! S% `2 O6 q. U' |
input clk, RxD;
2 S! E/ K- ?5 w* I  _, V% Coutput RxD_data_ready;  // onc clock pulse when RxD_data is valid8 o+ \- h' X4 ^* d# k1 y
output [7:0] RxD_data_out;
/ H7 t( d/ Q4 s5 w  H2 u" m& l1 j1 [4 h. S' q5 p) I8 W
parameter ClkFrequency = 5000000; // 5 MHz
- l4 |7 |) e* {5 K8 c5 N% nparameter Baud = 115200;6 U$ D( y7 d) r. x7 Y
- E% @, A+ [6 V6 S9 B+ \0 q9 e
// We also detect if a gap occurs in the received stream of characters
1 s8 U/ v& T4 v/ E6 h// That can be useful if multiple characters are sent in burst
: _0 c% C5 Z2 L//  so that multiple characters can be treated as a "packet"$ q. v7 b, a% W1 ]) i1 u2 Y
output RxD_endofpacket;  // one clock pulse, when no more data is received (RxD_idle is going high)) R, D/ E4 V! @
output RxD_idle;  // no data is being received
5 @8 P. h" L* S: s
+ ]% T! ~! }: I# [$ ^2 l' [// Baud generator (we use 8 times oversampling)% A/ q! C# d6 G. C  q: U
parameter Baud8 = Baud*8;2 N' v+ U0 N, @
parameter Baud8GeneratorAccWidth = 16;3 V1 @. g! `) U& g
parameter Baud8GeneratorInc = ((Baud8<<(Baud8GeneratorAccWidth-7))+(ClkFrequency>>8))/(ClkFrequency>>7);
( c3 f# w+ k# g7 n) zreg [Baud8GeneratorAccWidth:0] Baud8GeneratorAcc;
* I$ w! _: i3 y! _% T$ z* Galways @(posedge clk) / o8 B5 L8 _0 F' n3 P
        Baud8GeneratorAcc <= Baud8GeneratorAcc[Baud8GeneratorAccWidth-1:0] + Baud8GeneratorInc;
4 y/ ~7 j  S: L6 X0 H2 R" c# Qwire Baud8Tick = Baud8GeneratorAcc[Baud8GeneratorAccWidth];
作者: s850187    時間: 2010-10-20 02:30 PM
////////////////////////////
/ f8 n3 R7 B* l8 Q) z/ Vreg [1:0] RxD_sync_inv;6 N) Z) c, @  t* S) ]
always @(posedge clk)
  c. B' Q7 ]0 oif(Baud8Tick) % _8 V# @  C$ L/ |. P
        RxD_sync_inv <= {RxD_sync_inv[0], ~RxD};+ f/ x5 O8 n  J( @$ ?1 o
// we invert RxD, so that the idle becomes "0", to prevent a phantom character to be received at startup
2 m' V1 q, t- M
' j/ Y6 F" n/ \: e  |reg [1:0] RxD_cnt_inv;
( Z% b, g4 m8 w0 zreg RxD_bit_inv;
8 f- H$ f. t  Q0 f( e3 z. Z" O+ J0 O; O8 @$ W
always @(posedge clk)" A) c6 }8 S0 b$ c2 m
if(Baud8Tick)1 d, W* b7 S& Y6 g+ e* M
begin
8 p1 i1 d! Q5 Q  P' s  if( RxD_sync_inv[1] && RxD_cnt_inv!=2'b11) RxD_cnt_inv <= RxD_cnt_inv + 1;
- s2 U. m* K: R( g5 ~! q  else + H7 L* n) L: B: u1 ^. K) o
  if(~RxD_sync_inv[1] && RxD_cnt_inv!=2'b00) RxD_cnt_inv <= RxD_cnt_inv - 1;
4 C4 T1 i$ c: [: p$ o
. Z$ @+ I7 g$ i. w" [) n  f4 ?  if(RxD_cnt_inv==2'b00) RxD_bit_inv <= 0;
) D6 ]1 y$ S; Y; w5 p  Z9 f  else  f5 w7 o, J9 F; F3 ~- R
  if(RxD_cnt_inv==2'b11) RxD_bit_inv <= 1;% o9 L) R- L% q  z5 a
end
. f, x3 r% _  }5 T. h1 h% X4 b- N$ Y: m0 h; g& V
reg [3:0] state;  M$ ?! P. T4 g- m- W& m( _3 r
reg [3:0] bit_spacing;
9 ?7 ]$ [! i2 Y+ @6 m0 ?5 }
  d" `4 }0 ~/ B// "next_bit" controls when the data sampling occurs7 f; z6 E8 |  z
// depending on how noisy the RxD is, different values might work better
' G" X$ `4 A* Y* h// with a clean connection, values from 8 to 11 work: a6 h7 r9 s0 e+ c2 s. a
wire next_bit = (bit_spacing==10);
7 v/ h4 d1 d- Z. o8 Y3 U9 `$ u! q
$ E0 ~  N5 C& v% J9 X. w% f* d$ dalways @(posedge clk)* {5 Q& {, u1 i& ^& F
if(state==0)
0 }2 M+ m3 w! a1 _1 T2 i0 U  bit_spacing <= 0;
" B1 N7 g- t; _2 @+ aelse( s4 _  N1 O) p1 J
if(Baud8Tick)( Y* M" X0 v) ?8 b! p! F
  bit_spacing <= {bit_spacing[2:0] + 1} | {bit_spacing[3], 3'b000};
作者: s850187    時間: 2010-10-20 02:31 PM
always @(posedge clk)% M! p0 p9 f2 U) `5 n
if(Baud8Tick)2 h, G7 X* g3 H6 w
case(state)
" C& N/ K" C5 b7 N8 Y  4'b0000: if(RxD_bit_inv) state <= 4'b1000;  // start bit found?2 l7 n4 f3 n  y6 }
  4'b1000: if(next_bit) state <= 4'b1001;  // bit 0. h& g1 |5 S  t% g; g6 b
  4'b1001: if(next_bit) state <= 4'b1010;  // bit 1
, b; l, s, K# ]! G% U$ h) T9 l" y  4'b1010: if(next_bit) state <= 4'b1011;  // bit 2* [7 Z7 i! Y3 p# r! I' Q3 M
  4'b1011: if(next_bit) state <= 4'b1100;  // bit 3, Z8 w+ I: F% J& s5 a, }& Q
  4'b1100: if(next_bit) state <= 4'b1101;  // bit 4
; o6 j  c5 Q, J! |9 Q9 L  4'b1101: if(next_bit) state <= 4'b1110;  // bit 5
2 |- l, B7 W, ?  4'b1110: if(next_bit) state <= 4'b1111;  // bit 6
* I/ |  ?% h, V. R  ]& N$ F  v  4'b1111: if(next_bit) state <= 4'b0001;  // bit 7& o- t/ O; G! h1 M" W+ b8 u# D9 L
  4'b0001: if(next_bit) state <= 4'b0000;  // stop bit
/ Q; o1 }. P$ Y+ W+ }3 N( h% I. S  default: state <= 4'b0000;% [: J* V) [0 y
endcase
作者: s850187    時間: 2010-10-20 02:31 PM
reg [7:0] RxD_data;
4 B6 D9 q" m" q5 N, @$ ~# Treg [7:0] RxD_data_out;$ x6 u2 B! {) T
always @(posedge clk) begin; ]& y8 G& i/ G  @# _9 r' }
if(Baud8Tick && next_bit && state[3]) begin 3 S5 l6 i- P. \9 R. M6 q
   RxD_data <= {~RxD_bit_inv, RxD_data[7:1]};' ~. w! Q1 S4 |+ f) n
end
' C* t7 j/ t0 B4 P if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin
& m( Q1 Y% `1 X8 r$ l& G4 ^; l! f RxD_data_out <= RxD_data;
4 H, \. E" o) \# w' O end/ ]  P1 f3 B% a) Z3 j( a
end% C* T+ U$ F! \; N. y9 e, u5 n1 ?

$ h, l6 W4 f! _; Q4 E7 l% ?; H5 ~+ X; w0 A) I! ^/ C' |
reg RxD_data_ready, RxD_data_error;' {1 H  k) F# N- x& b
reg RxD_data_ready_in;
: d1 _) {" ?' ]- oreg[0:2] count;  y* W9 F( n# @/ t/ ], H
reg[0:2] count2;: `1 L' b3 h9 Z: F5 t
reg count1;3 O+ `+ m* Q. L# w
always @(posedge clk); F+ r" o* X4 m! s% ]* J' l
begin; ~8 u; H- S5 W6 v: v/ G

/ s* Z: X' `4 ?" v* Z: S  if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin9 h/ Z7 o1 z/ p1 h9 u
   RxD_data_ready_in <= 1'b1;8 G* t! V7 T* B( W  h
        count1 <= 1'b1;
- @6 I4 @" x2 I# R        count <= 3'b000;7 ?6 r8 J2 k; p1 m
        count2 <= 3'b000;4 P# a0 n9 M& Y( Q9 b4 k8 h1 @2 b" t5 x
  end                     
/ F2 [) G7 {7 s0 _, X; U# i  else if(count==4 && count1==1 )begin
4 g" _/ s- \) U/ K  X           RxD_data_ready <= 1'b0;9 ~+ f9 E, F- }- F
           count <= 3'b000;: t  n/ s$ I. U! F1 r6 c4 H
                count2 <= 3'b000;
8 Q5 Z  c# j, C5 [9 F/ q0 {/ y                count1 <= 1'b0;5 y  x6 h8 ^+ a8 `) a- @
          end9 z( C( M/ n9 O* v) W$ K
          else if(count2==4 && count1==1 ) begin4 A, F$ W6 H* T, {
          count <= count+1 ;
7 |) q- r; i* l6 M7 e          RxD_data_ready <=  RxD_data_ready_in ;
2 X  a+ j2 o8 Y0 t+ g; E; q4 m          end
9 K; x: H# n/ P: s& L          else begin
& I! U, ]! |- K2 c          count2 <= count2+1 ;5 T6 V/ {' w4 Z8 Q
          RxD_data_ready <=  1'b0;
, g1 w# a- Q# W* y1 p          end7 a5 f% j& a% ~, n9 N: R( Q
  RxD_data_error <= (Baud8Tick && next_bit && state==4'b0001 &&  RxD_bit_inv);  // error if the stop bit is not received
/ A4 E9 Z2 @/ E3 b1 i8 K# c  K) T/ p2 A% u
end
# e% ^4 h/ k! C7 O: D9 t# D! `* K/ \7 M' R8 \
; s' w: I$ F: ]

2 g. x8 Q* w3 X0 L; O+ l( e) mreg [4:0] gap_count;
- _2 {1 C# p3 r1 c5 Y* {always @(posedge clk)
$ u7 b4 t5 G- |& H* C: }  L. x        if (state!=0) : \- b; E# g3 {1 z- d  _4 ~
                gap_count<=0; . V- B" m+ L8 w: y% h
        else if(Baud8Tick & ~gap_count[4]) ( n/ P0 ^' j8 F0 d0 F0 p
                gap_count <= gap_count + 1;( c# z6 n: o% c* r
assign RxD_idle = gap_count[4];
0 G) ?6 i, Q3 g: ]& ureg RxD_endofpacket;
/ {9 Z3 U1 s, e3 z2 X1 |always @(posedge clk) 0 u( k, g- Z% E9 p
RxD_endofpacket <= Baud8Tick & (gap_count==15);
# @, I  P" \2 D3 `; ~) O+ K6 D* R3 D; @2 _
endmodule+ d0 t' t! j# X

& L" Z1 n8 b2 y7 U  T我想知道為什麼RxD_data_ready腳在資料錯誤時還會拉成high,麻煩會的高手教教我,謝謝!
作者: tuby0321    時間: 2010-11-18 04:43 PM
RxD_data_ready 似乎只在count2==4就會拉high
  K- b" I* K- l: v程式中並未看到資料錯誤時須將RxD_data_ready拉low# O+ O' }. [4 S+ y
) W2 G+ Q" k% Q& i
另外   
; e' r; J+ o3 G' }& ^% u( U+ W請說明你的"資料錯誤"是在什麼狀態的資料錯誤?
作者: stephen1065    時間: 2011-1-16 09:53 AM
等待高手回复 不是自己的写的 懒的看咯




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