Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 7928|回復: 5
打印 上一主題 下一主題

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2010-10-20 14:30:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是我的程式:
8 l) N# F# i% @module async_receiver_1(clk, RxD, RxD_data_ready, RxD_data_out, RxD_endofpacket, RxD_idle);  C+ I7 I, Z' T' k& S2 q
input clk, RxD;
8 M* ?- b0 G0 g! }0 F4 Aoutput RxD_data_ready;  // onc clock pulse when RxD_data is valid+ a+ {5 ^; d" f/ k6 _" [* F
output [7:0] RxD_data_out;' Y: Z! K' t! o* U7 A

& C& m7 @6 U' ^. I$ J3 sparameter ClkFrequency = 5000000; // 5 MHz
# @3 m( q! u5 N" i1 C/ _( }parameter Baud = 115200;3 h9 b" E* F- M- M, r

3 G1 J7 x, ?1 d1 j4 Z// We also detect if a gap occurs in the received stream of characters
9 o6 c' R5 M$ K8 e// That can be useful if multiple characters are sent in burst
4 H) W- b% l$ b/ x/ ]9 E* O//  so that multiple characters can be treated as a "packet"
/ M1 w& @7 y7 S7 z2 Aoutput RxD_endofpacket;  // one clock pulse, when no more data is received (RxD_idle is going high)$ _+ D& P+ ]/ R6 {( z
output RxD_idle;  // no data is being received0 Q/ }0 F: C# A) P
6 G7 x2 Z# Z/ i7 N" o
// Baud generator (we use 8 times oversampling)3 n8 Q. ]! ]  H# p
parameter Baud8 = Baud*8;
* L( V# H7 x0 f% Bparameter Baud8GeneratorAccWidth = 16;
: k: @2 Y# o% c3 ^) W: g( a4 {parameter Baud8GeneratorInc = ((Baud8<<(Baud8GeneratorAccWidth-7))+(ClkFrequency>>8))/(ClkFrequency>>7);
; s' v  h9 T2 `: P4 freg [Baud8GeneratorAccWidth:0] Baud8GeneratorAcc;
6 f, M4 l5 t* ?/ O9 U7 Nalways @(posedge clk) . U' {: V! S: q
        Baud8GeneratorAcc <= Baud8GeneratorAcc[Baud8GeneratorAccWidth-1:0] + Baud8GeneratorInc;' n) T# E3 v# i) e; _, P
wire Baud8Tick = Baud8GeneratorAcc[Baud8GeneratorAccWidth];
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
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};
3#
 樓主| 發表於 2010-10-20 14:31:09 | 只看該作者
always @(posedge clk)
3 ~8 t: H3 U% i; M( m$ A  U* |if(Baud8Tick), _% i3 |3 b/ F0 L* ~* j/ |' m! }
case(state)
* a6 N1 f6 S0 j8 h6 Y* [  I7 T3 N( g  4'b0000: if(RxD_bit_inv) state <= 4'b1000;  // start bit found?# w2 L0 \& H6 x( q
  4'b1000: if(next_bit) state <= 4'b1001;  // bit 0
- h4 |+ @" ^6 e! [- B. ^  4'b1001: if(next_bit) state <= 4'b1010;  // bit 1
4 D' }5 h8 Z" r7 a3 _$ t  4'b1010: if(next_bit) state <= 4'b1011;  // bit 2
2 {/ Y: y9 Y. x" j2 M7 E  4'b1011: if(next_bit) state <= 4'b1100;  // bit 3
5 f8 X; S% U" Q3 I- c  4'b1100: if(next_bit) state <= 4'b1101;  // bit 4; n) `4 \* v( b3 `# U% X! V
  4'b1101: if(next_bit) state <= 4'b1110;  // bit 5
- }' h1 J% _- }  4'b1110: if(next_bit) state <= 4'b1111;  // bit 6
+ |4 z0 E6 u- N6 q  4'b1111: if(next_bit) state <= 4'b0001;  // bit 7
4 u' H8 ^* g9 p! t: r% h/ O  4'b0001: if(next_bit) state <= 4'b0000;  // stop bit7 g+ Y' W0 J; i* }! @; o* p
  default: state <= 4'b0000;
1 ?' l% w% z# Y" d- N& J2 s, h1 W1 Y( hendcase
4#
 樓主| 發表於 2010-10-20 14:31:16 | 只看該作者
reg [7:0] RxD_data;) o6 [- ]# r! ]5 n' Y' }$ c, b" ^# {
reg [7:0] RxD_data_out;
0 V' z  C' Q+ U3 \& }# @always @(posedge clk) begin/ M/ B9 S  i! f/ y' a
if(Baud8Tick && next_bit && state[3]) begin
+ t8 _, _1 R( j, {  U* s2 a2 C: F   RxD_data <= {~RxD_bit_inv, RxD_data[7:1]};6 ^0 z  Y1 t! h- W8 e/ @9 ^0 I( X
end
. ^/ K% H/ O$ f5 g  |  ` if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin3 ~+ g* @6 l/ ~
RxD_data_out <= RxD_data;  y: ?1 n: \; q+ l
end
6 z. O. H0 ?; ?. u! v/ y5 }end
. {& h* D( o8 W" }4 o. e) @6 U" r) P$ A
' [& d. K' S4 O3 }$ W6 O
reg RxD_data_ready, RxD_data_error;
0 ^2 ^6 `: {/ o* Mreg RxD_data_ready_in;
; A) n- x! ^+ \reg[0:2] count;) u' `+ ?4 w3 X
reg[0:2] count2;
  q7 N' l( Z7 P) O' H: r3 Sreg count1;
$ u% X$ L4 ~+ S" \3 d- Ealways @(posedge clk). Y) U8 P& S" h
begin) k: Q1 j1 \+ n" S4 T3 [

% u$ }# C' B5 R) T) D6 \, f  if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin& w/ o: h5 S  F
   RxD_data_ready_in <= 1'b1;) w8 K) i- b" x1 A) {, c# c/ A
        count1 <= 1'b1;
9 e4 K3 H0 n/ g) v. U        count <= 3'b000;
' z9 i0 S0 b& C& G        count2 <= 3'b000;
, r4 N! c4 k( w; C  end                     ! s9 l( G/ F. G! b  s/ ~( Y' _
  else if(count==4 && count1==1 )begin9 R& \4 O; [! h& b1 s5 k
           RxD_data_ready <= 1'b0;2 e. ^7 B$ z1 Y) |- m
           count <= 3'b000;
/ m6 M: o5 i( c. \  g% i/ ?                count2 <= 3'b000;1 K0 w% L. o! m: O! {" }+ |
                count1 <= 1'b0;6 [0 B% I$ X( @4 \6 V) ~/ U) o
          end
) i2 `; o4 o& t4 M4 U+ M          else if(count2==4 && count1==1 ) begin
) }- U( D( y. M4 M" \          count <= count+1 ;# R( n- B  y/ E4 O* |
          RxD_data_ready <=  RxD_data_ready_in ;+ y2 d5 O$ z: w: O! ~
          end8 s$ Y) {$ S, ]" i( _: b$ }
          else begin$ R; }$ o7 _2 {. a$ Z
          count2 <= count2+1 ;
6 n( X. J2 |/ S* ~1 f; ^8 q          RxD_data_ready <=  1'b0;5 d9 ?  L$ o$ Z, W
          end
9 ?/ K1 t" |* i4 B9 Q/ n- L  RxD_data_error <= (Baud8Tick && next_bit && state==4'b0001 &&  RxD_bit_inv);  // error if the stop bit is not received  _& \/ X" e7 C: l  q( f+ v' j
6 A2 }) Q& p7 a8 h, v% m9 e
end; E" v3 d$ ]( I9 a
& @5 e0 X5 g( ]5 }2 N5 X0 F/ S
# S0 w- E: j- W8 O
8 @" z) n. u/ F& f* w4 u+ L( l% t9 P7 i
reg [4:0] gap_count;; r* Y/ ]. R* c" x) E0 b( A
always @(posedge clk) * t) R% S5 F' k1 c) w2 k
        if (state!=0) ! L+ r; D% t: \' u
                gap_count<=0; 9 L5 K6 Y! o# S3 U
        else if(Baud8Tick & ~gap_count[4])
8 r, `0 H8 G: K; Q# L& L                gap_count <= gap_count + 1;
" r! a# A# P$ D$ t3 o$ I  Bassign RxD_idle = gap_count[4];/ V" }' C* G; h6 I: V
reg RxD_endofpacket;
; n6 e9 j" m$ t% ]. w" qalways @(posedge clk) 4 P: q! L9 C% Q. ^: v
RxD_endofpacket <= Baud8Tick & (gap_count==15);* R& O3 I: E: F, l. ~: c

- j8 e* E  ~6 J; _9 e8 |endmodule
. U& |% U$ k' m5 h
! n- O8 W" p8 ^3 ]我想知道為什麼RxD_data_ready腳在資料錯誤時還會拉成high,麻煩會的高手教教我,謝謝!
5#
發表於 2010-11-18 16:43:46 | 只看該作者
RxD_data_ready 似乎只在count2==4就會拉high) t' s; j/ D. s* e
程式中並未看到資料錯誤時須將RxD_data_ready拉low0 @' t1 T7 T$ {
- W. k$ x9 `- j
另外   
9 K% g, O6 [5 {, L請說明你的"資料錯誤"是在什麼狀態的資料錯誤?
6#
發表於 2011-1-16 09:53:45 | 只看該作者
等待高手回复 不是自己的写的 懒的看咯
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-8 11:31 AM , Processed in 0.131016 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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