Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 7895|回復: 5

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

[複製鏈接]
發表於 2010-10-20 14:30:17 | 顯示全部樓層 |閱讀模式
這是我的程式:& ?) k/ s8 C$ v" I
module async_receiver_1(clk, RxD, RxD_data_ready, RxD_data_out, RxD_endofpacket, RxD_idle);1 P) F9 J* A' k9 M
input clk, RxD;
+ O/ Y! s1 E$ \9 C, e+ Ooutput RxD_data_ready;  // onc clock pulse when RxD_data is valid& T0 I3 \& V* F9 o- T
output [7:0] RxD_data_out;
5 P" A9 r* {0 s5 O+ c- e
7 s- M+ E/ j, kparameter ClkFrequency = 5000000; // 5 MHz& c& V3 f  D9 N- @, W
parameter Baud = 115200;6 u5 i6 o2 _' O+ x% {2 M

; m  D- r4 }% P0 a// We also detect if a gap occurs in the received stream of characters+ L/ k( W# s/ Y) h3 r; r
// That can be useful if multiple characters are sent in burst+ u, a/ K5 H: Z* m
//  so that multiple characters can be treated as a "packet"
+ M% R+ U2 X# Z- ~% u( v3 ^output RxD_endofpacket;  // one clock pulse, when no more data is received (RxD_idle is going high)  j8 r7 y9 t7 H9 _1 ~
output RxD_idle;  // no data is being received' X0 c4 }! x! z$ N' K% Q2 k, N
+ j) V' Y7 |" B$ @& W3 k  ?
// Baud generator (we use 8 times oversampling)
* f/ }# f" h( p0 Wparameter Baud8 = Baud*8;
4 N* s% Y+ ~+ M! [/ Lparameter Baud8GeneratorAccWidth = 16;
0 {- m% L' Q% c& S2 Jparameter Baud8GeneratorInc = ((Baud8<<(Baud8GeneratorAccWidth-7))+(ClkFrequency>>8))/(ClkFrequency>>7);
7 _1 z) I, V$ C! G1 t2 n7 x3 P% Lreg [Baud8GeneratorAccWidth:0] Baud8GeneratorAcc;
3 @) y. `0 p, M5 calways @(posedge clk) 6 l! Y* k3 p  }6 ]/ n2 [: u7 w
        Baud8GeneratorAcc <= Baud8GeneratorAcc[Baud8GeneratorAccWidth-1:0] + Baud8GeneratorInc;
: e( ?5 C# t- M: T" Wwire Baud8Tick = Baud8GeneratorAcc[Baud8GeneratorAccWidth];
 樓主| 發表於 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};
 樓主| 發表於 2010-10-20 14:31:09 | 顯示全部樓層
always @(posedge clk)
+ s( X! n6 {5 N3 J! aif(Baud8Tick)
2 I1 k1 [$ k3 P, s! n' scase(state)
" k8 K) S- m/ s- x2 \7 p  4'b0000: if(RxD_bit_inv) state <= 4'b1000;  // start bit found?! g7 b  b( w* t" K
  4'b1000: if(next_bit) state <= 4'b1001;  // bit 0; q6 l: K, X) C4 i
  4'b1001: if(next_bit) state <= 4'b1010;  // bit 11 c. S, l& D4 Q  B) W- g2 D7 U
  4'b1010: if(next_bit) state <= 4'b1011;  // bit 2
. L- ?: S1 G: g) T3 H% b  4'b1011: if(next_bit) state <= 4'b1100;  // bit 31 f3 O/ R3 ]& k" J0 j4 j
  4'b1100: if(next_bit) state <= 4'b1101;  // bit 44 ]) l9 G) s; G' {$ P' w
  4'b1101: if(next_bit) state <= 4'b1110;  // bit 5! ~* Z6 Q- o4 L2 ^
  4'b1110: if(next_bit) state <= 4'b1111;  // bit 6
6 r) S7 q4 R' P8 E# i; @8 B' ~; N  4'b1111: if(next_bit) state <= 4'b0001;  // bit 7
2 |8 _+ X* S; b, I( S$ L# ~: T  4'b0001: if(next_bit) state <= 4'b0000;  // stop bit. Z# O4 Z# A" [
  default: state <= 4'b0000;
* N* Z9 U, F) }8 z' p) }, O$ ?/ b1 Qendcase
 樓主| 發表於 2010-10-20 14:31:16 | 顯示全部樓層
reg [7:0] RxD_data;+ m. j7 F! q4 ?/ q; A. c6 P  ~
reg [7:0] RxD_data_out;' {: l5 ?9 G$ L4 T. |: C; z+ Z0 P
always @(posedge clk) begin. A# n, N# m/ c
if(Baud8Tick && next_bit && state[3]) begin - {7 f" L) s8 t' [
   RxD_data <= {~RxD_bit_inv, RxD_data[7:1]};" h8 E2 M. r/ W/ x: }: N
end$ C% t; V  H: E4 C+ i
if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin
! Y; m: d& e/ d" B- `4 X RxD_data_out <= RxD_data;8 N8 }3 ]" b; s$ h/ R5 |# g' ?
end
  E3 B2 e5 ]; {6 k  Pend9 Z6 A5 q; t8 t9 x3 R
( ~: `% J2 V5 F( u$ N+ d% }
$ r7 D. Z3 Z8 r
reg RxD_data_ready, RxD_data_error;( y; F( H2 w5 N6 q% b, u1 I
reg RxD_data_ready_in;
+ n; i+ o* Q8 ?( Xreg[0:2] count;
: l4 ?/ k( U# G' X9 Z& w5 o* Jreg[0:2] count2;
, d3 O1 W5 L' ?3 W! ?reg count1;
5 H5 ], U: A$ ]1 T' N) x7 Halways @(posedge clk)' b7 U; b7 b% W$ a8 s( o5 t3 l
begin, I$ r2 B( ~" C2 f8 a; p# D

; L- ?0 T0 Y- M/ P* d) N  if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin
/ a: d& U% X: r$ \/ Q/ A! V6 C   RxD_data_ready_in <= 1'b1;
+ S$ B4 N- k' ]( l/ o        count1 <= 1'b1;5 D% d$ \! U- b
        count <= 3'b000;
  ]- u9 Q' W4 C        count2 <= 3'b000;. C4 y# l2 F) C' H, B0 O
  end                     
$ c: f6 J5 I  i3 z2 G  else if(count==4 && count1==1 )begin
+ h. Q* q, G. x4 y2 J# n8 o           RxD_data_ready <= 1'b0;
8 _7 b) g, |. ]5 S% z% C8 u           count <= 3'b000;! e3 M+ H. g) M
                count2 <= 3'b000;
% I: b2 o9 ~  X4 s  R                count1 <= 1'b0;: I( z5 m9 n& T& `; R
          end
+ E- T1 C9 d7 U* I( M  S5 F- w          else if(count2==4 && count1==1 ) begin
; R- ~+ d! R  s( ]) I          count <= count+1 ;$ H  K% V  j: [- x& J
          RxD_data_ready <=  RxD_data_ready_in ;. N. m: K1 @" x- f# R
          end
8 ~$ I. [- H3 ]( y/ ~          else begin' g5 d8 \# Q3 i0 `3 x  P; t
          count2 <= count2+1 ;
. f, i/ _( a$ l' u          RxD_data_ready <=  1'b0;# H' F- I5 `- N' W6 C
          end9 H' n' h% }3 l( L
  RxD_data_error <= (Baud8Tick && next_bit && state==4'b0001 &&  RxD_bit_inv);  // error if the stop bit is not received# `" h0 J, b4 q- ?& i4 K, U
6 c8 Z9 e: ~! X8 l
end
/ A' W( k# P+ z4 g1 l! h& A7 j( o" Y$ A; x
- y/ T( t: I# n: ]* y
% w8 Z# u5 ?- \$ F4 z' N  J
reg [4:0] gap_count;: X* {/ y  N3 z3 U
always @(posedge clk) ( m$ L$ k* t- a; s8 x# ~8 t$ Q
        if (state!=0)
( B2 f1 t, E  F2 O                gap_count<=0;
9 P0 u5 b; `$ d" T% Q) n0 O        else if(Baud8Tick & ~gap_count[4]) ) p9 M+ ]1 i$ r' S8 I% Y. @
                gap_count <= gap_count + 1;
/ n( u: X9 t0 P. M4 [0 E9 Yassign RxD_idle = gap_count[4];3 N" p3 q  O0 J" l9 j5 \( ~% `5 a
reg RxD_endofpacket;
- D) |- z; B' g# A* Calways @(posedge clk) $ K2 t, E9 ?  D  ?6 U. ]
RxD_endofpacket <= Baud8Tick & (gap_count==15);
$ {. W$ K/ F. X" E! N2 e
  p6 i. Z  }: C( @- mendmodule' Y# X$ t' X+ U9 V

3 p1 p' ]. d7 \& l; v& l我想知道為什麼RxD_data_ready腳在資料錯誤時還會拉成high,麻煩會的高手教教我,謝謝!
發表於 2010-11-18 16:43:46 | 顯示全部樓層
RxD_data_ready 似乎只在count2==4就會拉high
9 [2 W: o+ _9 T: p# ?9 s5 u程式中並未看到資料錯誤時須將RxD_data_ready拉low  {1 `6 W1 b! a$ _* z, y
& O) H: M+ t3 g% H
另外   9 |) P  ]& p8 ~6 J3 u
請說明你的"資料錯誤"是在什麼狀態的資料錯誤?
發表於 2011-1-16 09:53:45 | 顯示全部樓層
等待高手回复 不是自己的写的 懒的看咯
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-4-19 05:32 AM , Processed in 0.112006 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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