Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2010-10-20 14:30:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是我的程式:
! P% u( d2 s" q/ ?module async_receiver_1(clk, RxD, RxD_data_ready, RxD_data_out, RxD_endofpacket, RxD_idle);0 A8 e# N& Z  u  D% Q
input clk, RxD;
! H+ E) V7 R6 ^/ l1 `output RxD_data_ready;  // onc clock pulse when RxD_data is valid* }0 G" `. e$ d, |0 B: g) {
output [7:0] RxD_data_out;
5 l; C& N$ S5 ?% i& k5 P* O' H$ `6 t: x; |
parameter ClkFrequency = 5000000; // 5 MHz
1 C* n0 t  a# U, }% P) D# o$ kparameter Baud = 115200;" T) }. E9 m( r2 t6 N/ S
; C0 y+ ~# h5 o0 `  @. B+ {# Y/ w7 U
// We also detect if a gap occurs in the received stream of characters
0 x# ^: {, M4 X7 H1 p// That can be useful if multiple characters are sent in burst* ~+ i9 O: L2 s1 F7 V
//  so that multiple characters can be treated as a "packet", C/ r8 k+ G: k
output RxD_endofpacket;  // one clock pulse, when no more data is received (RxD_idle is going high)
0 N9 }  Y' K; P5 g1 Houtput RxD_idle;  // no data is being received5 O% g3 a0 t' D! ?/ Q
# d/ E. ]* o; u7 A
// Baud generator (we use 8 times oversampling)
5 L; `% X4 e: B. Iparameter Baud8 = Baud*8;6 }7 F0 `) v7 ?$ Q: G8 l
parameter Baud8GeneratorAccWidth = 16;) t8 Y1 s' {5 U
parameter Baud8GeneratorInc = ((Baud8<<(Baud8GeneratorAccWidth-7))+(ClkFrequency>>8))/(ClkFrequency>>7);: @, e  @' W  k4 f3 L
reg [Baud8GeneratorAccWidth:0] Baud8GeneratorAcc;. i5 m# t7 V1 Q4 u" {* e
always @(posedge clk) $ S& g1 u2 Z4 q# x  n
        Baud8GeneratorAcc <= Baud8GeneratorAcc[Baud8GeneratorAccWidth-1:0] + Baud8GeneratorInc;
2 b# |- G3 \! D' Uwire Baud8Tick = Baud8GeneratorAcc[Baud8GeneratorAccWidth];
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2010-10-20 14:30:49 | 只看該作者
////////////////////////////' N+ v. c4 r, i; L* W3 a$ B
reg [1:0] RxD_sync_inv;
+ m4 {7 M3 u- j  p+ K; `6 A7 Falways @(posedge clk)
4 T" U  p8 T1 `7 K; }( dif(Baud8Tick) 7 _1 {* K$ R( o+ U/ e
        RxD_sync_inv <= {RxD_sync_inv[0], ~RxD};
: ^3 }4 b" \( ^+ w// we invert RxD, so that the idle becomes "0", to prevent a phantom character to be received at startup' }, v; H" O& Q8 l/ \* G9 Z* q
5 ]  S3 i0 c$ A  G9 O; N$ G
reg [1:0] RxD_cnt_inv;
# E! R. v+ H8 T& q; o0 mreg RxD_bit_inv;
) \( u6 j" ~2 y* I' Z* v0 Z
! E* \- L' w3 L5 R' e( Ualways @(posedge clk)1 g1 p! Y! Y+ G; }3 N
if(Baud8Tick)
1 c/ x( W5 g9 ebegin
+ X1 t1 L$ G$ I! d% C+ r6 V  if( RxD_sync_inv[1] && RxD_cnt_inv!=2'b11) RxD_cnt_inv <= RxD_cnt_inv + 1;
. U8 d, j" x" F) @  else " K4 t! f3 J$ s  x# J0 o
  if(~RxD_sync_inv[1] && RxD_cnt_inv!=2'b00) RxD_cnt_inv <= RxD_cnt_inv - 1;
- r1 b% O8 k  `3 Z( G- I
' ~8 E+ Q- p2 @# b  if(RxD_cnt_inv==2'b00) RxD_bit_inv <= 0;
  w1 E( F" o# M8 e  else8 f& C3 d4 M5 U2 n
  if(RxD_cnt_inv==2'b11) RxD_bit_inv <= 1;8 [1 }* Z% Q2 G' [3 j
end
: q; _# ~1 Z9 B3 x' Y. Z3 M
7 w1 o8 D0 L" I3 D; F) Sreg [3:0] state;
! h: [  D! h4 R6 P, P$ y/ b8 K& ereg [3:0] bit_spacing;1 ?& g( D; j$ F0 Z, F2 U
( _$ Z  O( y  B" C6 z
// "next_bit" controls when the data sampling occurs" v) O/ x' e$ B6 A/ l; q
// depending on how noisy the RxD is, different values might work better1 X0 ?* ~6 M, W1 F. {
// with a clean connection, values from 8 to 11 work
6 {6 E& _) I; P" q  Cwire next_bit = (bit_spacing==10);8 A9 Y( D; k5 Z0 {- W
" A( S: E5 ?; k' k7 t
always @(posedge clk)
! |( ^. ~- p2 wif(state==0)
7 t, e& F! ]: e- g: M; w* P  bit_spacing <= 0;
, n5 ?2 {5 `# r/ {+ M, j$ Gelse
9 M5 o' w3 r# O0 B0 {5 R& _; cif(Baud8Tick)
+ z2 |0 t3 d& b# u% L  bit_spacing <= {bit_spacing[2:0] + 1} | {bit_spacing[3], 3'b000};
3#
 樓主| 發表於 2010-10-20 14:31:09 | 只看該作者
always @(posedge clk)8 ]* |1 {' V* ^3 Q
if(Baud8Tick)" i( k0 T) S- j/ ^+ [
case(state)8 h- V9 R. \, H6 V$ j4 `1 l) @' k
  4'b0000: if(RxD_bit_inv) state <= 4'b1000;  // start bit found?
, ~, ?( B4 B( n; E  J4 ~  4'b1000: if(next_bit) state <= 4'b1001;  // bit 0; i, A0 \4 U' U/ ]/ O
  4'b1001: if(next_bit) state <= 4'b1010;  // bit 1; M% B3 a0 S* s& D/ B& e% a
  4'b1010: if(next_bit) state <= 4'b1011;  // bit 2
) t4 i) g( K/ S; I  4'b1011: if(next_bit) state <= 4'b1100;  // bit 3
- K: B( y9 b! X2 E  4'b1100: if(next_bit) state <= 4'b1101;  // bit 4
7 ?& V# Y, g0 S+ \( p! G+ b  4'b1101: if(next_bit) state <= 4'b1110;  // bit 51 p3 C& M2 {( a
  4'b1110: if(next_bit) state <= 4'b1111;  // bit 66 H  j5 A" E" `! U
  4'b1111: if(next_bit) state <= 4'b0001;  // bit 7+ _0 {6 A' b6 T: Q
  4'b0001: if(next_bit) state <= 4'b0000;  // stop bit
  i( A1 f) `1 F* A. q$ ~  default: state <= 4'b0000;: @  ~0 W) s" S
endcase
4#
 樓主| 發表於 2010-10-20 14:31:16 | 只看該作者
reg [7:0] RxD_data;
1 i, k6 P8 d- q8 K% p3 y6 greg [7:0] RxD_data_out;7 g9 j! c/ F" I! I: g
always @(posedge clk) begin$ X9 W! y4 w7 P! a- q
if(Baud8Tick && next_bit && state[3]) begin 1 ]+ l% g7 a/ p7 _$ m5 k4 V6 ^
   RxD_data <= {~RxD_bit_inv, RxD_data[7:1]};& h3 s/ Q& y0 W8 F: ^. q3 d, t
end9 C6 A! S( v9 \& D
if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin! y4 W3 _; X) S3 g& E
RxD_data_out <= RxD_data;
$ h$ E/ S- A9 m& S7 V end
# x5 u5 C* j5 ^. rend% q" Z* }# m/ x" i9 n* D# T+ c8 j* N
% l: R, F( H) [6 k0 s) O

4 Y# i1 ^8 I& L, p5 Ureg RxD_data_ready, RxD_data_error;
; q. K8 o9 C2 n2 A7 wreg RxD_data_ready_in;
" Q# n1 }& w" m- E4 ?reg[0:2] count;! U" }# P1 I+ l; ~
reg[0:2] count2;
+ x# N+ D/ D' b5 ], wreg count1;
- ?% p1 }$ C2 r6 H) balways @(posedge clk)9 t1 |; y+ f* @9 n
begin! s) P3 Z9 f0 O( U) d* S% Z, D
: ^) N5 p2 e! d9 A2 j( A
  if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin0 k! D; O: G* V4 `9 G3 v8 o
   RxD_data_ready_in <= 1'b1;0 ]0 @" Y& [2 z( Y9 J. G
        count1 <= 1'b1;
4 M5 H1 U- {2 e" f        count <= 3'b000;
7 w; o# k. |# g8 y0 K& j        count2 <= 3'b000;
" Q) W+ P# I5 b0 w  end                     9 P, H$ W; `: p  u
  else if(count==4 && count1==1 )begin
' N) _6 M* N! ?6 p+ C           RxD_data_ready <= 1'b0;) W- V; U5 K9 ]0 X0 _9 L: D& r
           count <= 3'b000;
6 m+ i) S1 L# c/ L% d6 @                count2 <= 3'b000;
/ Z+ r2 D: Y; h) ]. q( \' v                count1 <= 1'b0;
3 A: ]+ t0 E- i0 A          end
' k  y3 @* u0 o# Y' M" }          else if(count2==4 && count1==1 ) begin4 e: `' [( K" m1 F6 f
          count <= count+1 ;& N9 N4 K1 X7 \( R! C
          RxD_data_ready <=  RxD_data_ready_in ;
6 R% @# l% D& W2 I! P          end2 c4 `6 n  ^8 Z/ ]+ ]4 B
          else begin& N+ G' ]5 K6 r2 N2 ^, P) W0 L( r  A
          count2 <= count2+1 ;% \+ @  G; c/ \+ A6 }0 {2 q
          RxD_data_ready <=  1'b0;
  y7 x. v5 }: S          end
' ^7 S* c/ Y1 o# T( y  RxD_data_error <= (Baud8Tick && next_bit && state==4'b0001 &&  RxD_bit_inv);  // error if the stop bit is not received. Q# G2 r$ Z! T" h
& b3 q, y- m) [2 q
end
; {% U  f0 w5 @) M. ^) F6 `- ?8 O& a# y
. a, B, n& ]% o0 [! U5 Y: o) `8 E1 Q

. I1 }8 f( p* W# Oreg [4:0] gap_count;
# n% P% `) X5 ^- E# p4 Z+ palways @(posedge clk)
$ O0 T- u* h' Q9 F/ B1 ^        if (state!=0)
2 \  \( d( o9 }% E2 |# y$ s- b! c                gap_count<=0; + w* p2 X. @+ S5 W  y' y
        else if(Baud8Tick & ~gap_count[4]) & s5 V3 a4 t# _4 [/ q% M
                gap_count <= gap_count + 1;$ K9 v9 v' F! L5 ?( W
assign RxD_idle = gap_count[4];, P4 w( Q3 n1 i9 d& S" c8 @" x# P
reg RxD_endofpacket; 0 |, b- C( N6 j! Z$ `
always @(posedge clk)
+ O. E% n9 c7 a/ t9 U  gRxD_endofpacket <= Baud8Tick & (gap_count==15);; z3 u* o1 B7 _, B! O
: ]) S( Q3 ?  E+ l0 W2 \! u8 c# M
endmodule- _- L! Z' s3 c7 F! D
8 V7 U, N5 d: e# M- h0 ?4 m
我想知道為什麼RxD_data_ready腳在資料錯誤時還會拉成high,麻煩會的高手教教我,謝謝!
5#
發表於 2010-11-18 16:43:46 | 只看該作者
RxD_data_ready 似乎只在count2==4就會拉high
8 c6 Z# h0 K4 U/ W/ N% m4 M程式中並未看到資料錯誤時須將RxD_data_ready拉low0 b, T  D/ t* M
) y! w' ^% H' A
另外   " A+ k3 n  a1 V% B  V" f; l
請說明你的"資料錯誤"是在什麼狀態的資料錯誤?
6#
發表於 2011-1-16 09:53:45 | 只看該作者
等待高手回复 不是自己的写的 懒的看咯
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-9-27 09:32 PM , Processed in 0.165010 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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