Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2010-10-20 14:30:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是我的程式:
' y3 \7 ]/ b3 [2 f7 L' Cmodule async_receiver_1(clk, RxD, RxD_data_ready, RxD_data_out, RxD_endofpacket, RxD_idle);
9 S) d8 R" i9 c+ t+ u: vinput clk, RxD;7 O" y* b5 h+ n2 y" `
output RxD_data_ready;  // onc clock pulse when RxD_data is valid! q; T( f  n# y, K" k
output [7:0] RxD_data_out;# C2 s. T8 F$ E+ d2 r9 g% f

( z; j% f/ ^# _8 c  nparameter ClkFrequency = 5000000; // 5 MHz: J% V* S0 ]1 h8 o
parameter Baud = 115200;
$ |/ R, Y8 F& t, j3 v  q7 g3 g/ _2 n5 l8 J
// We also detect if a gap occurs in the received stream of characters
* \2 k; g; w! v2 w1 d// That can be useful if multiple characters are sent in burst2 T* m8 I/ v8 H8 m- h5 a* a
//  so that multiple characters can be treated as a "packet". X$ c. w8 D4 B3 o3 F
output RxD_endofpacket;  // one clock pulse, when no more data is received (RxD_idle is going high)- r+ B+ Q, R' Y. x: Y$ K
output RxD_idle;  // no data is being received
% I* ~) U6 ~- h5 b& o; I0 l8 P: ^
// Baud generator (we use 8 times oversampling)
! e$ t- A+ r; v6 X0 L8 {, iparameter Baud8 = Baud*8;8 W: p" a4 B' \( A
parameter Baud8GeneratorAccWidth = 16;6 D1 O. X. ]1 [* L
parameter Baud8GeneratorInc = ((Baud8<<(Baud8GeneratorAccWidth-7))+(ClkFrequency>>8))/(ClkFrequency>>7);9 T4 `6 X/ s( M  L1 V* I
reg [Baud8GeneratorAccWidth:0] Baud8GeneratorAcc;& h/ S2 f( X- d) o8 Q" n( f
always @(posedge clk)
# d: g* _  }6 Q( Q, Q        Baud8GeneratorAcc <= Baud8GeneratorAcc[Baud8GeneratorAccWidth-1:0] + Baud8GeneratorInc;
# O6 u& m$ `7 R' gwire Baud8Tick = Baud8GeneratorAcc[Baud8GeneratorAccWidth];
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2010-10-20 14:30:49 | 只看該作者
////////////////////////////# p  `9 h8 ?  L: W) A
reg [1:0] RxD_sync_inv;, Z. n) I% b- u( O8 N% p2 J6 e
always @(posedge clk)
+ t. V% J" \/ @) ?5 L# c; X, q3 F6 Zif(Baud8Tick)
) V+ A) ]2 U2 n# z        RxD_sync_inv <= {RxD_sync_inv[0], ~RxD};
9 I0 f* R* P, \  W// we invert RxD, so that the idle becomes "0", to prevent a phantom character to be received at startup
; \& X! e8 s. Y/ Y
. `: O5 c; i3 Q8 e/ g0 |' I+ Zreg [1:0] RxD_cnt_inv;
, L" F1 _* V7 oreg RxD_bit_inv;7 G4 x7 `: E* o8 M
0 k0 b* k6 x8 I$ ~. @+ x
always @(posedge clk)
* o# _( c# p( m9 K5 @4 H7 jif(Baud8Tick)+ T, J. A, h4 x
begin
) A2 g: f0 _' v# f9 V; n* _  if( RxD_sync_inv[1] && RxD_cnt_inv!=2'b11) RxD_cnt_inv <= RxD_cnt_inv + 1;! H9 I# R$ s% n$ }
  else ' V- Y, E. P% y0 M" K. Z
  if(~RxD_sync_inv[1] && RxD_cnt_inv!=2'b00) RxD_cnt_inv <= RxD_cnt_inv - 1;
" V4 J# g& v0 q9 [" J+ c8 _" S. |
  if(RxD_cnt_inv==2'b00) RxD_bit_inv <= 0;- C. s) ^+ k1 ^# l# B4 T7 {" r. Q: E
  else
* R1 E5 T9 m- X, r) J  if(RxD_cnt_inv==2'b11) RxD_bit_inv <= 1;$ a6 r/ Y" `) A4 C
end
7 n9 @5 q4 [! F0 `/ U! ]' b% v4 ]
  L* T& |8 c" \reg [3:0] state;
' Y# c: l; @) _8 s4 t/ ereg [3:0] bit_spacing;6 X. d  K7 P$ l  C! e
, h3 n" e6 b- Y5 @9 S
// "next_bit" controls when the data sampling occurs
" c# [5 N4 ]; A// depending on how noisy the RxD is, different values might work better
9 P: ?( w! f+ R5 k, }" ~% D// with a clean connection, values from 8 to 11 work
/ {3 @/ w+ Y- p# L0 \. K3 [5 ]4 Swire next_bit = (bit_spacing==10);+ Y% \! j% H9 X3 D4 n( N  l1 e

! [7 o0 @& o# |always @(posedge clk)
$ G$ G0 l! H% K2 f) B& pif(state==0)
4 O% I; C* q5 f: V1 p$ T  bit_spacing <= 0;( O6 X1 e2 X" m
else. ^6 U4 @0 X1 Q! G/ e/ f
if(Baud8Tick)
8 k" Z' N0 T7 ^/ m! z& i" ?! ?; h  bit_spacing <= {bit_spacing[2:0] + 1} | {bit_spacing[3], 3'b000};
3#
 樓主| 發表於 2010-10-20 14:31:09 | 只看該作者
always @(posedge clk)
9 G! c9 h$ Z1 e$ @' V1 Hif(Baud8Tick)6 ~5 i) x7 D7 w) a/ g: l
case(state)
" y1 D% W4 q0 P% V6 g0 ^- f  4'b0000: if(RxD_bit_inv) state <= 4'b1000;  // start bit found?% V6 u4 O; ^5 W: q- ?4 A
  4'b1000: if(next_bit) state <= 4'b1001;  // bit 0  N3 F: g$ v# i/ e
  4'b1001: if(next_bit) state <= 4'b1010;  // bit 14 |. N" n2 o; _# s& }
  4'b1010: if(next_bit) state <= 4'b1011;  // bit 2
3 }. R6 e# E2 h' [1 G. M+ b" G: N  4'b1011: if(next_bit) state <= 4'b1100;  // bit 3' ^& a* S* r" J- ~' i) R. p
  4'b1100: if(next_bit) state <= 4'b1101;  // bit 4
9 K+ x3 @" x  y$ L5 C  4'b1101: if(next_bit) state <= 4'b1110;  // bit 5
, q) b) X+ ^* V2 C7 P  4'b1110: if(next_bit) state <= 4'b1111;  // bit 6
5 j; s- o1 }) X! ^! x* g3 E. d  4'b1111: if(next_bit) state <= 4'b0001;  // bit 7
& t8 @5 m. e4 P0 R  4'b0001: if(next_bit) state <= 4'b0000;  // stop bit; |% E$ t1 Y4 Y7 A# `# O" Y0 H
  default: state <= 4'b0000;  ~1 l: `# [7 l! b
endcase
4#
 樓主| 發表於 2010-10-20 14:31:16 | 只看該作者
reg [7:0] RxD_data;
* J  l7 ^- |( d1 ?! `1 T$ p3 yreg [7:0] RxD_data_out;, [8 E( _; Q, c8 [
always @(posedge clk) begin! m3 [2 n: q+ M  m
if(Baud8Tick && next_bit && state[3]) begin
  C: z/ ~. ^! d, F) @7 ?   RxD_data <= {~RxD_bit_inv, RxD_data[7:1]};/ Y# Z  y& v' H, z! o+ G& `
end
7 M# R4 n7 J" R! Y5 u5 u: V if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin
0 A# |8 j1 s' H* m  c+ l% W& @ RxD_data_out <= RxD_data;3 }$ D0 p3 l! n
end
3 r' Q' o: c# T! ^3 `end$ p. |" z1 ?6 y) |0 R6 S3 d

+ |9 Y4 G, m1 K/ b$ p
0 i3 A& m+ b# Q' V3 T! _reg RxD_data_ready, RxD_data_error;
* Q! w" ~/ S4 V' k% wreg RxD_data_ready_in;! `! L5 [7 f1 z3 _0 v  S% x
reg[0:2] count;
0 \( B& M- u9 jreg[0:2] count2;
, i' s# F( M0 Areg count1;
: z$ |6 z* U. J! D$ h/ G# h7 Y/ lalways @(posedge clk). \2 X& B( f: q- `$ O
begin
1 W# Q; S: |# Y
: I( E+ N& m9 w0 j# w4 Q% X  if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin, N* a* c' O8 F7 Q) l& [/ T5 g
   RxD_data_ready_in <= 1'b1;& }6 m; f0 H' d4 a- ~, b% ^
        count1 <= 1'b1;7 D* d) x/ A1 X5 l+ M8 M& A# d& v
        count <= 3'b000;
5 h: R' A) i+ v% ~) @. s% _9 `0 r        count2 <= 3'b000;
$ L9 Y1 b) I8 n! m, \& @& Q- E  end                     % e% B9 ^; {2 B# q3 Z
  else if(count==4 && count1==1 )begin
$ n; |% t) H  I$ d           RxD_data_ready <= 1'b0;2 S% |8 @; [2 r, k9 x
           count <= 3'b000;! W7 m: ?' F& `6 {3 x, ^
                count2 <= 3'b000;8 ?% c7 r* z. t' K/ h5 c5 P
                count1 <= 1'b0;
# B+ y, k* }1 @9 S+ b" T          end& I# o& c7 w+ H
          else if(count2==4 && count1==1 ) begin
* `. y3 K  ?2 g& i; G          count <= count+1 ;2 t0 X+ Q8 y# J; T' I
          RxD_data_ready <=  RxD_data_ready_in ;& C- e$ j# z7 L- H
          end
% T1 s2 P6 V0 @1 G% ]          else begin
* Y; {0 z. B# v- V) G# @  Q          count2 <= count2+1 ;; a. L* i+ H: C+ N2 F
          RxD_data_ready <=  1'b0;
2 I- y3 C  h' e4 e3 E6 I          end
' M6 U! X- ]3 j8 N6 a) o2 L  RxD_data_error <= (Baud8Tick && next_bit && state==4'b0001 &&  RxD_bit_inv);  // error if the stop bit is not received" x6 A: {8 f4 [# N) a
8 \. P2 _# p% I/ ?/ Y/ t  f
end: t, C# t/ |* ?
- v% ^# x1 s6 W- H$ _

+ O8 b' m, x* g# Y" k. o6 w+ j: ^5 K/ d
reg [4:0] gap_count;% i* @' H% ]0 F2 ?) x
always @(posedge clk)
, n/ ]/ K9 _! v% K0 E1 w# w8 e- Y        if (state!=0)
6 n- i7 p3 q" i. I$ D                gap_count<=0;
' L. H* T0 a  T6 m/ o. u% r; L        else if(Baud8Tick & ~gap_count[4]) 7 o9 E7 }6 `* b" I8 T  C. \! {
                gap_count <= gap_count + 1;
  ~, H( `1 f& Wassign RxD_idle = gap_count[4];2 H: W+ M8 C4 M. I3 R' l
reg RxD_endofpacket;
( c5 h, y' T+ |! L$ Nalways @(posedge clk)
# d* A4 b$ \# A/ RRxD_endofpacket <= Baud8Tick & (gap_count==15);
0 }6 z' j2 ?! E5 d% l! x) e) h! D* M
endmodule
7 w: b/ Z( u# ^
# ?$ X0 ]( ^  e( O; @我想知道為什麼RxD_data_ready腳在資料錯誤時還會拉成high,麻煩會的高手教教我,謝謝!
5#
發表於 2010-11-18 16:43:46 | 只看該作者
RxD_data_ready 似乎只在count2==4就會拉high
* a* t3 K1 x7 g程式中並未看到資料錯誤時須將RxD_data_ready拉low7 R% r0 `' K# V+ d3 e
) O8 g2 t. L* z/ l
另外   ( Q* v! |/ H4 o6 }( I& l$ I
請說明你的"資料錯誤"是在什麼狀態的資料錯誤?
6#
發表於 2011-1-16 09:53:45 | 只看該作者
等待高手回复 不是自己的写的 懒的看咯
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-3 12:59 AM , Processed in 0.117015 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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