Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2010-10-20 14:30:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是我的程式:
. G  [2 x1 d% ^( ?module async_receiver_1(clk, RxD, RxD_data_ready, RxD_data_out, RxD_endofpacket, RxD_idle);* r- [5 f5 S, x, w# }# ^
input clk, RxD;* C8 I3 b! D, I% [4 M: L
output RxD_data_ready;  // onc clock pulse when RxD_data is valid
3 Z1 W9 ]  G) G5 U4 eoutput [7:0] RxD_data_out;
. Q: b. u7 G7 W7 f; f' G3 u
# R0 j' J3 f4 x; Y1 C: B# tparameter ClkFrequency = 5000000; // 5 MHz( b! r+ t# Q, E5 k, ~( P$ f
parameter Baud = 115200;( d( p* U' _6 n) x7 O5 ~

; V1 e' Y; Q0 p2 r2 X# o+ e// We also detect if a gap occurs in the received stream of characters8 Z  y6 V/ K# Q# W4 L) T
// That can be useful if multiple characters are sent in burst
8 }2 F% W4 T6 g0 B//  so that multiple characters can be treated as a "packet"
) E* m! A  t% Q) aoutput RxD_endofpacket;  // one clock pulse, when no more data is received (RxD_idle is going high)' L5 o# D& d# j& E) w6 U
output RxD_idle;  // no data is being received
# C$ }/ x+ R; A% Q. P: C0 k2 a8 l: e) f5 B
// Baud generator (we use 8 times oversampling)4 h3 g! {% i1 t  `" @$ P
parameter Baud8 = Baud*8;0 R8 G. U0 J* l9 j6 ]
parameter Baud8GeneratorAccWidth = 16;" W+ V8 w: V; s5 @/ Q
parameter Baud8GeneratorInc = ((Baud8<<(Baud8GeneratorAccWidth-7))+(ClkFrequency>>8))/(ClkFrequency>>7);
' n- c; ]5 v2 O: I5 A; Qreg [Baud8GeneratorAccWidth:0] Baud8GeneratorAcc;
* K0 O, n& q$ w8 V" {1 k; ]always @(posedge clk)
( g1 a. f0 k/ X! r6 m' e. J        Baud8GeneratorAcc <= Baud8GeneratorAcc[Baud8GeneratorAccWidth-1:0] + Baud8GeneratorInc;" F& D- U4 S1 q1 _9 Z8 k' U5 B
wire Baud8Tick = Baud8GeneratorAcc[Baud8GeneratorAccWidth];
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2010-10-20 14:30:49 | 只看該作者
////////////////////////////
3 M' r: _. T- M# o+ |& \# s) Sreg [1:0] RxD_sync_inv;
7 R6 ?' Z. N; D6 Z& Balways @(posedge clk)
* u1 H( Y/ ?. q8 J. j3 H, C2 \! }+ Vif(Baud8Tick)
3 u6 i1 U; m' @8 G" B        RxD_sync_inv <= {RxD_sync_inv[0], ~RxD};
! o( t2 V! U# a, F- p. [// we invert RxD, so that the idle becomes "0", to prevent a phantom character to be received at startup
$ s" d# C) s7 O* d% s4 t( _0 _, O+ ~: x" k+ `$ k
reg [1:0] RxD_cnt_inv;' |- a1 x3 p  S$ Y
reg RxD_bit_inv;
( {- R$ _5 p2 ~9 c7 Q# ]( b
. ]; [+ a0 i7 }' p. palways @(posedge clk)
1 A: n- c. z% m+ }/ M, Yif(Baud8Tick). B% w! ?( ]) s% I/ F
begin3 X8 r2 H* R: {- ^, h4 V9 L% B9 M) h4 L
  if( RxD_sync_inv[1] && RxD_cnt_inv!=2'b11) RxD_cnt_inv <= RxD_cnt_inv + 1;
; G% w2 E! g' l6 I  else - m9 t0 U9 j) m6 M4 r8 w; G
  if(~RxD_sync_inv[1] && RxD_cnt_inv!=2'b00) RxD_cnt_inv <= RxD_cnt_inv - 1;0 k4 r6 G4 N4 Z
3 E7 }2 y8 H; d- y8 z! ~( e
  if(RxD_cnt_inv==2'b00) RxD_bit_inv <= 0;
# V: n4 ^$ }1 N5 E8 K  else
" G* \9 D- y( d& B; }  if(RxD_cnt_inv==2'b11) RxD_bit_inv <= 1;
3 l1 q) p: s1 e3 i/ c( \1 rend
3 G% u/ Y$ b2 f, E2 [  P
: s9 j* T- O/ A4 ]! g; Breg [3:0] state;( [, X7 I5 J6 Q* w+ l- }
reg [3:0] bit_spacing;: k7 ]; u) ]% y6 r) u
# k- ^6 T" v8 |" `
// "next_bit" controls when the data sampling occurs
- A$ o8 H3 q4 G! P* r// depending on how noisy the RxD is, different values might work better5 k2 p; W& ]2 }0 w' v3 \/ Z
// with a clean connection, values from 8 to 11 work4 v$ A4 g  J8 s3 X% _3 e0 c
wire next_bit = (bit_spacing==10);
( p2 A. W/ a$ k9 r7 t- l* o4 s1 |, j: ]& b8 p2 v/ T9 m% C( m% D
always @(posedge clk)+ a. M. F# X7 B- c9 \0 o0 `& Q
if(state==0)' ]* W; m$ l0 R8 u1 h
  bit_spacing <= 0;
. C  B) u: p9 s/ \* Yelse8 L5 Q, I( W' z' b$ d" N8 J% f
if(Baud8Tick); G8 x& i7 x7 i+ D
  bit_spacing <= {bit_spacing[2:0] + 1} | {bit_spacing[3], 3'b000};
3#
 樓主| 發表於 2010-10-20 14:31:09 | 只看該作者
always @(posedge clk)
* ~5 [0 V, O( v1 B0 J4 ?) v; D6 Sif(Baud8Tick)# d1 z3 ~- l# ?6 Y
case(state)& R, W$ \0 ]) w/ I( W+ ?) N' R( E
  4'b0000: if(RxD_bit_inv) state <= 4'b1000;  // start bit found?
, z. M% ~2 @5 L+ ~  4'b1000: if(next_bit) state <= 4'b1001;  // bit 0
/ K0 g4 i* q2 A  U) h- f8 w5 E* Y  4'b1001: if(next_bit) state <= 4'b1010;  // bit 1
: g% p8 N# r, ]# j  4'b1010: if(next_bit) state <= 4'b1011;  // bit 2* x% Z. H! y; d% k. J
  4'b1011: if(next_bit) state <= 4'b1100;  // bit 3
3 M' {: {/ H9 X1 {/ S+ U  4'b1100: if(next_bit) state <= 4'b1101;  // bit 4" V  h6 n) {2 C$ l8 n' d7 {
  4'b1101: if(next_bit) state <= 4'b1110;  // bit 5
& B( k6 x) P& Y8 S# U0 u! A8 B6 ^. _  4'b1110: if(next_bit) state <= 4'b1111;  // bit 64 b6 L* j8 `" Z$ a
  4'b1111: if(next_bit) state <= 4'b0001;  // bit 7
: S0 A- d) h9 \  4'b0001: if(next_bit) state <= 4'b0000;  // stop bit+ G. y+ ?  q. n$ q
  default: state <= 4'b0000;
8 o! @2 L; H1 @8 b! P8 tendcase
4#
 樓主| 發表於 2010-10-20 14:31:16 | 只看該作者
reg [7:0] RxD_data;& V( z, H7 B6 f: T
reg [7:0] RxD_data_out;
) p0 T$ _# K7 [( y2 A) J$ A2 E) ]. kalways @(posedge clk) begin
+ q6 w! Z' K! i) M if(Baud8Tick && next_bit && state[3]) begin 4 D7 m7 i( ~# W4 q
   RxD_data <= {~RxD_bit_inv, RxD_data[7:1]};
$ Z( C' w$ T, E$ S8 B end
- A% @# R) |" X! z) ? if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin
! X! B2 {6 p2 j+ O1 W0 D6 H RxD_data_out <= RxD_data;
8 S8 t: O5 g& k; O end* y" A& r) C# T3 i) r' W3 O" b7 X
end: J0 r4 z# f+ M# {$ L# a
  ~) N1 V4 ]8 P; {) m/ U
! [# _. s* [) v; C# b  o  S2 k
reg RxD_data_ready, RxD_data_error;3 c1 _: i! r( ]) V' l, W
reg RxD_data_ready_in;
0 F7 @' {5 W, u% Y% N0 Creg[0:2] count;
  P6 ^" l. R. N8 V; g8 y0 w  d% dreg[0:2] count2;
- N; X, i8 J# F# P5 jreg count1;# Y2 q8 s3 p4 g3 v7 z
always @(posedge clk)8 Q& |4 d( V2 F& E
begin4 }# v3 W  C! e# k4 w/ v% `
8 v0 v& g/ Q, N$ G
  if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin
! q- t% H9 N: ]* V9 E! v   RxD_data_ready_in <= 1'b1;
4 T. f8 K; i8 f) h" N  R' p3 G: m# X        count1 <= 1'b1;" X; z. ?/ C. x
        count <= 3'b000;  y0 h0 K4 e( s) x" }+ _
        count2 <= 3'b000;4 I, @1 i8 s$ Q' l& v  c
  end                     4 u. ]3 s5 r3 |  o) W
  else if(count==4 && count1==1 )begin1 L" e2 y6 l$ U. N: B
           RxD_data_ready <= 1'b0;
1 D# ~0 s0 k+ k  k) q( U! d4 X           count <= 3'b000;3 D- Y* j. K6 W6 B' a7 O' S8 y
                count2 <= 3'b000;
7 c- J  V  s9 r0 v7 }7 @                count1 <= 1'b0;
7 H/ r, q* b& A. T/ }1 R0 H          end6 Q# u3 y: c3 I
          else if(count2==4 && count1==1 ) begin
4 ~! N: \$ l% R3 n) r7 N& p* d8 \          count <= count+1 ;& p- H2 k: T0 L* D
          RxD_data_ready <=  RxD_data_ready_in ;5 r6 ~1 L" Y; B  Q) [
          end5 ^( B6 r# N! W  e! b
          else begin  p2 ~: D9 v1 B0 e! V( P5 r8 |3 M
          count2 <= count2+1 ;
' }) B! B4 v% I$ G7 o" e* @7 i2 x          RxD_data_ready <=  1'b0;
2 Y! y5 A/ Q8 |4 o! U          end
1 Q/ W+ w) r8 ]7 m. _6 z6 R  l  RxD_data_error <= (Baud8Tick && next_bit && state==4'b0001 &&  RxD_bit_inv);  // error if the stop bit is not received
4 \6 X0 T. `0 \
0 _- A, @% L1 E6 r8 o1 E! i* X0 Aend5 U. L- |: P$ f# @8 Y. d

6 Y( U" c( [. U7 e& b. q8 f0 T4 J* Y# G$ G, G4 n6 b
7 |; A. E& D. W" z
reg [4:0] gap_count;; C3 G  n' F' F& y1 t' a
always @(posedge clk) : T) I8 l. H# b0 ~# u
        if (state!=0)
  q) D) C7 H  M, A                gap_count<=0;
8 f8 g. B+ `/ O+ R. {        else if(Baud8Tick & ~gap_count[4])   s1 C6 D1 L; S4 C1 a9 f1 {
                gap_count <= gap_count + 1;
, |  W% _; _, b" H/ j( T3 a) Q: Yassign RxD_idle = gap_count[4];
- @' V3 B% B5 F, I3 y+ B! J. Hreg RxD_endofpacket; 2 C: \$ ^; Z& Z7 f7 `
always @(posedge clk)
: k: P0 }7 l; i2 \% ?: K/ U/ vRxD_endofpacket <= Baud8Tick & (gap_count==15);1 \0 h& @0 Z! d  W
& Y! m, Q4 c# p1 k# W
endmodule& r) N4 W9 n9 {" k, j; @

3 ]6 C1 e# D8 s0 {  i8 C我想知道為什麼RxD_data_ready腳在資料錯誤時還會拉成high,麻煩會的高手教教我,謝謝!
5#
發表於 2010-11-18 16:43:46 | 只看該作者
RxD_data_ready 似乎只在count2==4就會拉high
( ?$ W4 R* t) ^& Y" |$ o% X( Y2 J程式中並未看到資料錯誤時須將RxD_data_ready拉low
5 r$ N3 r$ u; a$ m; ^) Y6 {
8 N1 @. h0 h& I& C另外   , W3 @& u1 n7 V- b5 V
請說明你的"資料錯誤"是在什麼狀態的資料錯誤?
6#
發表於 2011-1-16 09:53:45 | 只看該作者
等待高手回复 不是自己的写的 懒的看咯
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2025-2-24 02:14 PM , Processed in 0.162009 second(s), 17 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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