Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2010-10-20 14:30:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是我的程式:. E' O) j4 }+ G2 S1 f
module async_receiver_1(clk, RxD, RxD_data_ready, RxD_data_out, RxD_endofpacket, RxD_idle);
- \  W$ i" k$ A* T7 Y6 u  iinput clk, RxD;  t5 u. j; n( L; w& c5 ?: n
output RxD_data_ready;  // onc clock pulse when RxD_data is valid* j0 c0 V& B2 n5 a! m/ h1 D
output [7:0] RxD_data_out;
5 d# q7 f1 ^; C' M' |1 Y/ S5 ~- B/ Y% D1 Q
parameter ClkFrequency = 5000000; // 5 MHz/ E& J, n" }* @
parameter Baud = 115200;
3 l+ z, X. T) v, `9 X' E9 j* j" U" _% }) z' Z3 X3 B- V- j
// We also detect if a gap occurs in the received stream of characters
  W5 K! E) L5 V) J" d4 Q' k// That can be useful if multiple characters are sent in burst
4 C/ v8 ?& s7 g# H* L! E" `//  so that multiple characters can be treated as a "packet"
4 g+ J2 ?: {7 Uoutput RxD_endofpacket;  // one clock pulse, when no more data is received (RxD_idle is going high)4 G! M  n1 V' B( N( f
output RxD_idle;  // no data is being received; @' w& n  q+ A' D
  d$ M+ b( X) I8 n7 m! D& J
// Baud generator (we use 8 times oversampling)
% ^7 e% c: X) o. M/ m8 }( kparameter Baud8 = Baud*8;! L/ e7 X) P* Z: p2 M6 \+ b' ]
parameter Baud8GeneratorAccWidth = 16;" a* j/ `$ m! I; q. L' v+ t
parameter Baud8GeneratorInc = ((Baud8<<(Baud8GeneratorAccWidth-7))+(ClkFrequency>>8))/(ClkFrequency>>7);1 u' C3 s0 v# F3 o3 g
reg [Baud8GeneratorAccWidth:0] Baud8GeneratorAcc;, T. \/ z, r7 p! H
always @(posedge clk) ) \8 u( C0 f) p: h
        Baud8GeneratorAcc <= Baud8GeneratorAcc[Baud8GeneratorAccWidth-1:0] + Baud8GeneratorInc;* [  \7 _6 Z; B; E% }
wire Baud8Tick = Baud8GeneratorAcc[Baud8GeneratorAccWidth];
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2010-10-20 14:30:49 | 只看該作者
////////////////////////////9 O2 r3 T6 [% E* ?# g
reg [1:0] RxD_sync_inv;
1 {7 U. g  C" Q, N& U" N6 o% walways @(posedge clk)
: {0 g& h+ f: [7 g* ^, g" v, pif(Baud8Tick)
) h/ ?" Z* d$ M, f7 t4 l, p        RxD_sync_inv <= {RxD_sync_inv[0], ~RxD};
8 S  \* z# u7 B! H$ n// we invert RxD, so that the idle becomes "0", to prevent a phantom character to be received at startup
( n( ^# l7 J8 W& O7 ^- S
8 ~+ H; Z# p+ L$ M# Rreg [1:0] RxD_cnt_inv;+ d8 w4 S" ~, l% T  a, q  {7 \
reg RxD_bit_inv;4 F1 ]4 v" D" U, w: @0 k: w

" F2 H, E, p7 m. s: E; jalways @(posedge clk)# m* R* H2 i% s6 Y0 m8 d% J1 [
if(Baud8Tick)
$ E; h1 K/ O# j+ k( pbegin3 l4 P! H; ?  ]
  if( RxD_sync_inv[1] && RxD_cnt_inv!=2'b11) RxD_cnt_inv <= RxD_cnt_inv + 1;
- |/ }8 C% F4 i  else
/ n9 F5 l% g3 z" |4 b7 m: q  if(~RxD_sync_inv[1] && RxD_cnt_inv!=2'b00) RxD_cnt_inv <= RxD_cnt_inv - 1;$ o7 E5 H. O) Z% [5 x% `
3 D7 \- ^% R6 r/ C
  if(RxD_cnt_inv==2'b00) RxD_bit_inv <= 0;
* S( j- P6 n2 H; N$ s* i5 m  z  else7 t  k1 C, O* l/ i5 G0 V
  if(RxD_cnt_inv==2'b11) RxD_bit_inv <= 1;
% m: R5 O- j. O- R. Oend  @' M5 {6 ]8 E( C9 X
- j1 s) \' C: S
reg [3:0] state;
/ I& @' E  g4 C# Yreg [3:0] bit_spacing;
! O' ~: f" }" e( P
, m5 n! V1 h: e+ S// "next_bit" controls when the data sampling occurs- l& ]# q8 Q2 m! j; v8 p, Z
// depending on how noisy the RxD is, different values might work better
- m2 F2 H5 @& H; N// with a clean connection, values from 8 to 11 work) ?$ A) d8 W: }" ]8 P: N4 D
wire next_bit = (bit_spacing==10);7 X" o4 j1 k, c: z% j7 ~

( c. x) S" }" S4 W3 Talways @(posedge clk)7 A  Y) E* A3 ]' n7 N5 R  Y/ |
if(state==0)
; x9 [: T& {7 B; o  o3 x  bit_spacing <= 0;
4 U. M9 x# L. {else
, I8 E+ ?. i4 P+ {if(Baud8Tick)& q2 O% Z8 w, d  W7 v
  bit_spacing <= {bit_spacing[2:0] + 1} | {bit_spacing[3], 3'b000};
3#
 樓主| 發表於 2010-10-20 14:31:09 | 只看該作者
always @(posedge clk)
1 P, Y9 A/ g. V4 x5 v% iif(Baud8Tick)
4 a# Y( r; B6 {4 r5 r: Lcase(state)
- o* T& I) a2 e9 \1 m6 ]  4'b0000: if(RxD_bit_inv) state <= 4'b1000;  // start bit found?  d8 o" S9 w6 D8 {9 e' z# A$ ?6 @* }
  4'b1000: if(next_bit) state <= 4'b1001;  // bit 0
: z# v1 N% c5 g8 j. N4 b  4'b1001: if(next_bit) state <= 4'b1010;  // bit 1
0 J  r2 m; f, F  4'b1010: if(next_bit) state <= 4'b1011;  // bit 2% N9 X9 }' j2 v2 m* u5 {2 q
  4'b1011: if(next_bit) state <= 4'b1100;  // bit 3
% x3 E/ o5 }" G  4'b1100: if(next_bit) state <= 4'b1101;  // bit 4
$ P! @+ y0 D4 h  4'b1101: if(next_bit) state <= 4'b1110;  // bit 51 K; p9 K7 I/ f* M8 x. N* N
  4'b1110: if(next_bit) state <= 4'b1111;  // bit 6, g' P: U4 I2 k1 h
  4'b1111: if(next_bit) state <= 4'b0001;  // bit 7
8 N$ O) |% k$ I5 F( n; j4 O* \  4'b0001: if(next_bit) state <= 4'b0000;  // stop bit
+ k! f' |: h: G+ f: X  M  default: state <= 4'b0000;
5 k7 w/ @% k4 @- j0 bendcase
4#
 樓主| 發表於 2010-10-20 14:31:16 | 只看該作者
reg [7:0] RxD_data;
& k& N9 j8 {0 Rreg [7:0] RxD_data_out;
6 ?4 V# C3 K3 b5 f) K* k8 Y3 Qalways @(posedge clk) begin
! {8 X5 p4 W+ O4 \ if(Baud8Tick && next_bit && state[3]) begin & b0 J4 J6 t" i/ h
   RxD_data <= {~RxD_bit_inv, RxD_data[7:1]};" R+ ?1 L, [# l! i9 D$ q0 E( I' n
end, a; T0 j9 z1 f4 M( z/ k
if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin
+ b( h4 x$ `7 K RxD_data_out <= RxD_data;9 M' f$ H, l3 W! l% G' w( f
end
6 D" b( B; V6 B( n5 C6 Kend
& H" q) A- ~# h: K* E+ X3 i& ~) P

, T) K0 j( R  J+ \: `- i9 wreg RxD_data_ready, RxD_data_error;
0 g2 I4 G8 l7 Areg RxD_data_ready_in;8 c3 j; e: X) {6 X: I+ C8 Y! f
reg[0:2] count;
0 K$ E% A, Z/ ^, e% ^9 g4 A# C* _reg[0:2] count2;' `: _' M' ~& i5 D
reg count1;
+ k# h0 r+ S) i" h% H$ o  Ualways @(posedge clk)( \6 ~' v4 A4 v" K0 y6 ?$ `6 G
begin; ^" M5 k6 Y5 K9 K/ h

; \! K( y# B6 p) C! ?  if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin
8 {& g9 Q1 t$ ]   RxD_data_ready_in <= 1'b1;) F7 _( j5 F/ g7 Y# ^( g! v
        count1 <= 1'b1;
1 |$ Y1 F; d( R( k" e6 d        count <= 3'b000;7 Q. |4 s( L- L8 k. V
        count2 <= 3'b000;
' P: m7 X  ~8 T  V% b' T1 {  end                     8 P3 G, h3 n# s: I' W; v
  else if(count==4 && count1==1 )begin" k0 Z. A; N7 C3 e. g, y
           RxD_data_ready <= 1'b0;) ~% h& ^9 J/ \- L6 E) y
           count <= 3'b000;" k; N* r  D' j: R
                count2 <= 3'b000;
6 m6 x3 d% N: L0 [( ]                count1 <= 1'b0;
7 ]# t7 i# l5 L: q$ o6 d! n          end
! Q% V9 D1 S! w* Q, o9 ?# A6 S4 C          else if(count2==4 && count1==1 ) begin! b: Q, r( S- i! F7 I
          count <= count+1 ;
- Z0 R6 @% Y* ^- |  w2 D  _4 o          RxD_data_ready <=  RxD_data_ready_in ;  w  M$ {: ?( B
          end0 Q) y. G% @8 U1 f. [
          else begin4 G  ~6 u7 p/ D9 ]9 i. ]9 @
          count2 <= count2+1 ;3 Y  U$ |' A) a
          RxD_data_ready <=  1'b0;8 j, L% Z' Z1 y2 n: R
          end
' I& R- z3 r6 J# f. k9 ]) V' @  RxD_data_error <= (Baud8Tick && next_bit && state==4'b0001 &&  RxD_bit_inv);  // error if the stop bit is not received4 f' }, x  |5 Q: f' U& s- v
( }2 m: f8 v, S0 o1 M: C0 ~1 N( v# q$ a
end, m6 `# }8 b2 l  S/ b
6 _) P) Y: @, [% n. e/ ^
/ q$ d6 u8 e- [4 v; l% F! q
7 i" ^' `, t: @& e
reg [4:0] gap_count;3 V% |7 y  K) O9 |; k4 f
always @(posedge clk)
2 J  }3 N" z6 V6 Z6 y        if (state!=0) ) ]0 j% b5 \7 z! k
                gap_count<=0;
! Z2 C; v& B# h; m" U$ O" l        else if(Baud8Tick & ~gap_count[4]) # q$ g& _9 W9 ~5 [9 L
                gap_count <= gap_count + 1;; W" j3 v* m" V( m
assign RxD_idle = gap_count[4];
+ y# R! J( y1 v' ~$ x) Freg RxD_endofpacket;
5 X5 V3 N" [% f1 S6 K1 Walways @(posedge clk)
4 u6 q( Q1 F/ v* hRxD_endofpacket <= Baud8Tick & (gap_count==15);
  O! u& Z; k, z9 y9 m  J8 W: k% D! }! G
endmodule2 V7 A, [9 j- x5 X4 s
( A! Q& \: |; y# e9 O7 n
我想知道為什麼RxD_data_ready腳在資料錯誤時還會拉成high,麻煩會的高手教教我,謝謝!
5#
發表於 2010-11-18 16:43:46 | 只看該作者
RxD_data_ready 似乎只在count2==4就會拉high1 f" K- f4 D+ V! H% y
程式中並未看到資料錯誤時須將RxD_data_ready拉low3 [3 S" v: ?. _5 G' T$ J$ k. m
3 f0 X) R& M& b% d: H
另外   
1 l& t  f* C+ j" k- }& f請說明你的"資料錯誤"是在什麼狀態的資料錯誤?
6#
發表於 2011-1-16 09:53:45 | 只看該作者
等待高手回复 不是自己的写的 懒的看咯
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-17 01:34 AM , Processed in 0.120015 second(s), 17 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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