Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2010-10-20 14:30:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是我的程式:0 |8 R8 O5 {! ]
module async_receiver_1(clk, RxD, RxD_data_ready, RxD_data_out, RxD_endofpacket, RxD_idle);
" Z1 |7 M0 l1 h/ c3 ^" rinput clk, RxD;+ j( X1 i6 r4 I0 l  v3 g
output RxD_data_ready;  // onc clock pulse when RxD_data is valid$ u" ]# Q: w$ C& O6 Q4 a- t
output [7:0] RxD_data_out;: _) c" b7 D4 t4 F
5 [9 a; F. A) t( ^
parameter ClkFrequency = 5000000; // 5 MHz
9 {" K) |: H7 f% Qparameter Baud = 115200;
7 `$ ~8 d8 s" e) B# c* x, R' ^$ x$ R, \2 V4 G& {* |
// We also detect if a gap occurs in the received stream of characters
, m' g) \, n- K" k  \5 ~// That can be useful if multiple characters are sent in burst
( m  ?0 T6 w5 ]4 k+ E//  so that multiple characters can be treated as a "packet"' z, N( ?6 F7 ]. ~: r5 q' Y- h
output RxD_endofpacket;  // one clock pulse, when no more data is received (RxD_idle is going high)' z  }7 n+ e! W8 B/ J1 ~1 X
output RxD_idle;  // no data is being received7 _1 k1 s2 |* J4 a
3 J' `, S& E. K) T6 R9 i  b
// Baud generator (we use 8 times oversampling)
$ w% t7 G( I% Cparameter Baud8 = Baud*8;
, t! o6 I( s1 N4 m7 {parameter Baud8GeneratorAccWidth = 16;
2 e2 l2 j- f. Q* C6 C& p1 {6 K+ Qparameter Baud8GeneratorInc = ((Baud8<<(Baud8GeneratorAccWidth-7))+(ClkFrequency>>8))/(ClkFrequency>>7);
  y+ j; D5 A$ T# Z1 xreg [Baud8GeneratorAccWidth:0] Baud8GeneratorAcc;
( b7 I4 z/ K; z1 galways @(posedge clk)
2 {: h# r5 B1 r% i, i        Baud8GeneratorAcc <= Baud8GeneratorAcc[Baud8GeneratorAccWidth-1:0] + Baud8GeneratorInc;
7 o( ?4 ?6 H( k# A9 Hwire Baud8Tick = Baud8GeneratorAcc[Baud8GeneratorAccWidth];
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2010-10-20 14:30:49 | 只看該作者
////////////////////////////1 A3 U* ^& r* g
reg [1:0] RxD_sync_inv;
* L$ C! |4 n4 P/ N% T5 m. h# Walways @(posedge clk) * a% {2 Q+ P/ L& {3 p, y
if(Baud8Tick) ) A' S* `& K, H) I: E# |
        RxD_sync_inv <= {RxD_sync_inv[0], ~RxD};
$ x0 V6 i- r  P* `' b// we invert RxD, so that the idle becomes "0", to prevent a phantom character to be received at startup
* Y: v  v1 q% D: s. `; g8 K6 B; G9 L# p( w- ?
reg [1:0] RxD_cnt_inv;( u5 j$ |9 J, X* @  M, g4 D/ J
reg RxD_bit_inv;/ h- N: m) I; Q& j! I2 ~4 o4 @: X% W) T
0 B. z; y6 c+ i2 s
always @(posedge clk)
4 z+ N; U7 d" X! x8 t+ ^' Lif(Baud8Tick)9 Q) x* e2 M- Q
begin/ E# a" E) H; x2 C1 R
  if( RxD_sync_inv[1] && RxD_cnt_inv!=2'b11) RxD_cnt_inv <= RxD_cnt_inv + 1;
+ E3 A1 @* ^& p, @  else + R( Z. R1 t6 ]6 Z
  if(~RxD_sync_inv[1] && RxD_cnt_inv!=2'b00) RxD_cnt_inv <= RxD_cnt_inv - 1;8 I" X; P: ?4 G8 v9 K1 l

0 a1 L7 }" ~; `% i- G6 i  I7 }/ ~7 k  B  if(RxD_cnt_inv==2'b00) RxD_bit_inv <= 0;& q# c. u$ g, A6 Y
  else# L& y& _/ u, }4 y' X& e$ ~9 F* ]
  if(RxD_cnt_inv==2'b11) RxD_bit_inv <= 1;  ?% m! |9 J. o  w5 X, G
end
' }6 w* C& Q& p4 y/ P% V, G7 B" G' q3 @# `- `4 M' E% o' {6 I: d
reg [3:0] state;
( K: K6 D/ @3 n* Ereg [3:0] bit_spacing;' A2 D5 ]9 Z8 e+ c6 ^0 a
1 p2 r& F6 k: ^( _( m& M: q
// "next_bit" controls when the data sampling occurs
- V- [; j/ H2 K% F// depending on how noisy the RxD is, different values might work better
' D9 P& q2 u" n7 w// with a clean connection, values from 8 to 11 work0 C* |% u# U- |* ?+ c8 `  N
wire next_bit = (bit_spacing==10);
2 i, W8 E3 {8 ]% D: N- Z( Q  l  r( R2 Z
2 q% y( a& p+ J7 I! u) Yalways @(posedge clk)1 |( w4 g7 u3 B
if(state==0)
1 M, D( t7 j1 W% R! k  bit_spacing <= 0;* A1 P; l+ W" M
else7 x. y. n( F2 S3 g
if(Baud8Tick); S0 U6 s$ z) l- j* B( _; C
  bit_spacing <= {bit_spacing[2:0] + 1} | {bit_spacing[3], 3'b000};
3#
 樓主| 發表於 2010-10-20 14:31:09 | 只看該作者
always @(posedge clk)
; Z; F# b! x' p0 lif(Baud8Tick). N* C7 A3 E% V9 @# [
case(state)( F5 Y( t$ `8 j' C
  4'b0000: if(RxD_bit_inv) state <= 4'b1000;  // start bit found?  A/ H( d6 X$ k- O7 W5 s: ~' |* \
  4'b1000: if(next_bit) state <= 4'b1001;  // bit 0
+ t4 W5 r8 N% I' v  4'b1001: if(next_bit) state <= 4'b1010;  // bit 14 q' j) V* ~3 i6 W
  4'b1010: if(next_bit) state <= 4'b1011;  // bit 2
. Z/ D3 ]6 G2 R  4'b1011: if(next_bit) state <= 4'b1100;  // bit 3
. b: p3 u& ?' J  _/ R; o0 o  4'b1100: if(next_bit) state <= 4'b1101;  // bit 4& {  O4 v8 C: j$ C
  4'b1101: if(next_bit) state <= 4'b1110;  // bit 5; P* X( _. H; Z+ ^6 r: y- g
  4'b1110: if(next_bit) state <= 4'b1111;  // bit 64 ~/ l7 s  k" R: q
  4'b1111: if(next_bit) state <= 4'b0001;  // bit 75 f" O6 u/ o- y$ {: |
  4'b0001: if(next_bit) state <= 4'b0000;  // stop bit
" L0 d4 Z" S* f7 W  default: state <= 4'b0000;
9 v8 h. k: Y7 R8 Qendcase
4#
 樓主| 發表於 2010-10-20 14:31:16 | 只看該作者
reg [7:0] RxD_data;+ Q* T" G7 l( c" }$ ], p
reg [7:0] RxD_data_out;
' v. S( N6 F) ?* S( x. ealways @(posedge clk) begin" i7 D, H0 k  y. y
if(Baud8Tick && next_bit && state[3]) begin , q# ~+ D0 z/ `* Y
   RxD_data <= {~RxD_bit_inv, RxD_data[7:1]};6 c2 {8 Z8 h' Z$ ^3 v
end' d% ^$ e& r& z5 s/ s7 u- U' M
if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin
, W+ O$ i2 V8 z: u' ]! _) q  q RxD_data_out <= RxD_data;7 B0 Y* f% G6 R, d. P
end. x. X( \2 ~0 H, f' t9 u, ^
end
0 ?! n" _9 v# J
8 e  v' Y) i5 I+ \9 }1 M9 `% |7 Y+ L2 ?% }0 n8 P0 E) ~; q7 N' p! C
reg RxD_data_ready, RxD_data_error;4 A! L- W6 U* V; P2 [& E
reg RxD_data_ready_in;
7 O; G( M3 @. C2 Z( Q/ Hreg[0:2] count;, I% A6 W+ p* S3 `/ O6 c
reg[0:2] count2;
3 u! ]; p9 z. M& sreg count1;
0 q4 W3 ?2 _$ d# C1 |% Yalways @(posedge clk)
- P4 J8 R* G! n  Y* \. {* X/ ubegin
( w+ {5 J! A3 {4 R9 q4 _% ~% b, X. l7 D* M; Q
  if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin
3 _# A- ^; K0 G' u! ?) ]" G2 u   RxD_data_ready_in <= 1'b1;
9 X$ F0 B% E1 }4 z' f( K        count1 <= 1'b1;
7 Y- v3 A+ N2 Z3 D! I  k        count <= 3'b000;
3 j: i/ f- F# I7 f- n& t0 o+ E        count2 <= 3'b000;
2 Q- r7 Q" k  n3 G$ d# p  end                     
! O) K" G3 o$ Y  else if(count==4 && count1==1 )begin5 ^/ t# ~$ @. t
           RxD_data_ready <= 1'b0;" E& e  A* e# R' X7 t- x& D& d
           count <= 3'b000;5 L: P1 }0 c9 c# _
                count2 <= 3'b000;
' q1 C0 t! V9 Z5 d$ E0 F. t' A                count1 <= 1'b0;; D5 W! C0 c; v: U/ H  X2 }: ~1 [
          end
) `) j/ b6 ?4 H2 A4 F          else if(count2==4 && count1==1 ) begin4 L: a; X3 t# ~+ M+ V# ~
          count <= count+1 ;
  v( E1 k8 b; A/ M% [8 r          RxD_data_ready <=  RxD_data_ready_in ;
% f% c( }  @5 g6 c- V8 H  g          end
/ T/ J8 p- e1 H8 X) P          else begin
' v  n. Y- M1 ?# ]0 ?; }5 X% i          count2 <= count2+1 ;; W, ]5 ]5 C1 J! Q, s7 ?! \. ?: a* x; I1 H
          RxD_data_ready <=  1'b0;
( h/ c+ ]" V" A          end
9 @; d& J: e1 `. U) _9 E  RxD_data_error <= (Baud8Tick && next_bit && state==4'b0001 &&  RxD_bit_inv);  // error if the stop bit is not received
+ K$ p( c& y0 x- p; W( }+ d0 m5 N2 C* t: E  j8 V
end
- X4 a6 {' g  G( t/ A! F7 Y
5 o! p1 d+ K9 A' \
9 Z* v, k/ h+ H) E5 W' Q  m1 R6 }$ s; U/ V& B& T
reg [4:0] gap_count;
9 a) k4 b3 |0 i) l( g! k) ralways @(posedge clk)
4 \; \! D5 J' A/ x$ U  V. I        if (state!=0) # t( u2 C8 m- Q* X
                gap_count<=0; 3 _2 T2 Q" e) a; z
        else if(Baud8Tick & ~gap_count[4]) 4 X% x& a; [# Y; \1 t( M$ [8 ]
                gap_count <= gap_count + 1;( N% X- U! o. q. t
assign RxD_idle = gap_count[4];) U. s/ O" Z! N* @- P
reg RxD_endofpacket; 0 I* L" p8 X2 R. d: v- J
always @(posedge clk) 8 Q7 b. b' C+ @# c2 Q  }
RxD_endofpacket <= Baud8Tick & (gap_count==15);( U9 m: ?/ i" u+ m; c9 H

# l; W, u% P( a& g* e, Uendmodule; W* u( V  t' f- ^: d
+ G( `* |7 C- e% D! u3 |
我想知道為什麼RxD_data_ready腳在資料錯誤時還會拉成high,麻煩會的高手教教我,謝謝!
5#
發表於 2010-11-18 16:43:46 | 只看該作者
RxD_data_ready 似乎只在count2==4就會拉high( {" m7 G* [1 I# c
程式中並未看到資料錯誤時須將RxD_data_ready拉low
' S! B& t# B$ y
% e2 M. w& L; N  E另外   
; [: Y- u  K# @- P, M  k4 ^請說明你的"資料錯誤"是在什麼狀態的資料錯誤?
6#
發表於 2011-1-16 09:53:45 | 只看該作者
等待高手回复 不是自己的写的 懒的看咯
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2025-2-24 10:56 AM , Processed in 0.166010 second(s), 17 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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