Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2010-10-20 14:30:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是我的程式:
$ e/ e$ x7 w" L4 q3 J2 T1 xmodule async_receiver_1(clk, RxD, RxD_data_ready, RxD_data_out, RxD_endofpacket, RxD_idle);
/ A9 P+ X9 P/ X8 Vinput clk, RxD;2 w, D/ t7 ]! B
output RxD_data_ready;  // onc clock pulse when RxD_data is valid  O. n4 }7 B& O5 m( J2 p
output [7:0] RxD_data_out;
  }' z4 i& ~+ o# N0 q6 T* i. R. [) S2 \$ M7 y  [
parameter ClkFrequency = 5000000; // 5 MHz
$ y8 d# i- E& T0 W, ]7 Bparameter Baud = 115200;
, J& ~$ `0 N, x& M' D/ E- k; ?& i1 I6 j! l% Q" S0 J$ C# ^, v
// We also detect if a gap occurs in the received stream of characters
$ G+ W4 u! v4 |1 M// That can be useful if multiple characters are sent in burst
( q' y/ ?+ u3 u7 q* a9 d4 q3 m3 m//  so that multiple characters can be treated as a "packet") X* y# u' \/ w; F1 G1 [
output RxD_endofpacket;  // one clock pulse, when no more data is received (RxD_idle is going high)
  C/ t# T  t* S3 xoutput RxD_idle;  // no data is being received( O3 m6 G. }+ ^. h3 D

9 r0 _  y7 n' M; i8 `6 c// Baud generator (we use 8 times oversampling)
: C# S- m# b5 hparameter Baud8 = Baud*8;3 T  u# c3 \6 Z0 I5 U) S  l
parameter Baud8GeneratorAccWidth = 16;
4 u" n" W. r4 m* M/ L$ b; L, n- wparameter Baud8GeneratorInc = ((Baud8<<(Baud8GeneratorAccWidth-7))+(ClkFrequency>>8))/(ClkFrequency>>7);
6 t3 c9 y3 W3 z$ ]reg [Baud8GeneratorAccWidth:0] Baud8GeneratorAcc;
: j6 H# M2 L- L, V. valways @(posedge clk)
5 C3 b( [0 G9 r/ K        Baud8GeneratorAcc <= Baud8GeneratorAcc[Baud8GeneratorAccWidth-1:0] + Baud8GeneratorInc;9 p" @" ?! i  ?* L( K3 O* k
wire Baud8Tick = Baud8GeneratorAcc[Baud8GeneratorAccWidth];
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2010-10-20 14:30:49 | 只看該作者
////////////////////////////
! P$ w9 J4 h* x& `; y. areg [1:0] RxD_sync_inv;( r; ~; ^4 Q3 J$ L, c% [
always @(posedge clk) 3 r6 }' e# P' k! s
if(Baud8Tick)
  k  {: `4 Y% @  Q# i6 W4 K+ m        RxD_sync_inv <= {RxD_sync_inv[0], ~RxD};
- F) f/ v( ^$ Q0 O// we invert RxD, so that the idle becomes "0", to prevent a phantom character to be received at startup. M  }# o5 n% ~/ D5 ^  x$ `, S

! I; }& @3 x2 s9 G* F1 h6 hreg [1:0] RxD_cnt_inv;
: U  T. c! {& p8 Nreg RxD_bit_inv;
( n% o+ f" O/ A
" A% Z! C) r, H& s; ~0 Oalways @(posedge clk)+ A  }, d" K& }) @8 n- a
if(Baud8Tick)) ]3 |% Z0 X9 K% z. Y5 w: {3 W
begin
: {1 O4 F" O- M8 s. ]+ ?  if( RxD_sync_inv[1] && RxD_cnt_inv!=2'b11) RxD_cnt_inv <= RxD_cnt_inv + 1;. t+ W5 `, ~! W/ R  S
  else
2 u5 `+ E: K: ?4 k  if(~RxD_sync_inv[1] && RxD_cnt_inv!=2'b00) RxD_cnt_inv <= RxD_cnt_inv - 1;" v9 J1 w1 a" B% H/ M4 a5 Y* F5 l! z

2 X; u7 E4 Y3 k9 A1 M7 _5 J9 ]  if(RxD_cnt_inv==2'b00) RxD_bit_inv <= 0;
! D6 }. a5 k1 R1 z* a, d8 `  else
8 X6 ~. e- a, Z7 n7 h. T  if(RxD_cnt_inv==2'b11) RxD_bit_inv <= 1;
0 ?! o, f9 s( d, w* `6 b" R, }$ Send
/ R- u6 j' s5 x. h0 ~$ T/ f4 \# A  U* g6 S' M
reg [3:0] state;7 \6 c/ ~5 D" y  A% o
reg [3:0] bit_spacing;1 J; @- t1 K& _* D; O. h% L9 |

: W) {) T" b) p" ~// "next_bit" controls when the data sampling occurs
' B4 r: R% A2 P6 x$ T! ^// depending on how noisy the RxD is, different values might work better  Y- b/ Y4 V9 @0 ~0 k: F( {
// with a clean connection, values from 8 to 11 work0 D( F1 \; s: z$ W5 L1 G! X- w
wire next_bit = (bit_spacing==10);
8 ?- k- N, T/ b- S( j+ I, H( B6 ]) W1 B+ r0 W% E
always @(posedge clk)% S# U4 ~, R6 J" ^4 a% k
if(state==0)2 e' |7 f! Z6 v
  bit_spacing <= 0;: s4 t( r+ U( N9 S  T
else
5 D  v$ W, X7 _2 h! Kif(Baud8Tick)
! ]( P9 g$ @1 p; B$ o  bit_spacing <= {bit_spacing[2:0] + 1} | {bit_spacing[3], 3'b000};
3#
 樓主| 發表於 2010-10-20 14:31:09 | 只看該作者
always @(posedge clk)
, a2 g; i! L" a1 \if(Baud8Tick)
0 w  K7 t( `0 \8 s  Y- j9 Vcase(state)7 ?3 h! ~$ o8 K- A. o/ {5 u, H
  4'b0000: if(RxD_bit_inv) state <= 4'b1000;  // start bit found?
4 \( o( z/ R& k; P/ T3 L; a2 e  4'b1000: if(next_bit) state <= 4'b1001;  // bit 0
. t! N7 M/ y1 z/ z7 H  4'b1001: if(next_bit) state <= 4'b1010;  // bit 1
9 t6 t$ ]9 b+ @/ L  4'b1010: if(next_bit) state <= 4'b1011;  // bit 2" o# V0 }; a" i. h7 ?
  4'b1011: if(next_bit) state <= 4'b1100;  // bit 3; b. U1 r& f+ ]5 M! Z
  4'b1100: if(next_bit) state <= 4'b1101;  // bit 4
1 ~! O# K1 {  _5 o$ x4 Q. E1 r  4'b1101: if(next_bit) state <= 4'b1110;  // bit 5. w' R1 a1 ~3 P- U/ p; }$ C& z2 K
  4'b1110: if(next_bit) state <= 4'b1111;  // bit 6/ `7 D/ ^* B3 O' w
  4'b1111: if(next_bit) state <= 4'b0001;  // bit 70 h5 G3 f, f" a) F/ u4 w5 C- n/ x  C
  4'b0001: if(next_bit) state <= 4'b0000;  // stop bit
8 y6 B! v; h" E0 K# Y0 v  default: state <= 4'b0000;
5 u% p- D& a) }. {# v2 A* d3 xendcase
4#
 樓主| 發表於 2010-10-20 14:31:16 | 只看該作者
reg [7:0] RxD_data;
$ N  y( U# K: g( M- A) ~reg [7:0] RxD_data_out;
! `) `6 K, C: ^/ Z4 N# G( ^always @(posedge clk) begin
0 Z' P8 T+ h' }1 o9 F8 ? if(Baud8Tick && next_bit && state[3]) begin
2 O# F) R$ f0 C5 c' q7 q, n   RxD_data <= {~RxD_bit_inv, RxD_data[7:1]};
# T: P0 l; ^* J* r8 H9 [1 _ end1 X+ K* e# B3 h
if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin
. k& o( g: G4 l+ d RxD_data_out <= RxD_data;
+ t. G6 f% {# ^& L end
* o8 x$ _5 ?  A* [, G2 i. l" @1 b( cend" k. `# m& ~2 O8 a6 b# y

; J, l, a# ]6 M- h, u- i, s2 F  z% I4 P! s  H# `
reg RxD_data_ready, RxD_data_error;
% l/ _, z: h3 t( c' J8 x2 _6 r5 ereg RxD_data_ready_in;
: Q9 X  T8 _+ B  Preg[0:2] count;
$ w  [' T3 H4 ?3 x) rreg[0:2] count2;
9 B) _2 P) p) @$ z! O5 Hreg count1;
. W" |8 b) A0 `- u9 H/ Oalways @(posedge clk)8 m3 B4 k. j2 _' H
begin
4 i, r9 O1 P; t! [) T5 L) m% c0 o' ^" {" c4 n; w
  if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin$ w; Z  s; n5 }6 a. ~
   RxD_data_ready_in <= 1'b1;
3 ~5 z2 s2 {3 [7 ]" A        count1 <= 1'b1;" Y0 e( U9 z& E4 J
        count <= 3'b000;. d7 K* {  O  K
        count2 <= 3'b000;
8 M5 j8 [/ K* O2 C& x  end                     
) l9 x5 P- q$ p  else if(count==4 && count1==1 )begin- Y! I* `) Q( H) D1 l
           RxD_data_ready <= 1'b0;; V, o' U; c# Y$ D
           count <= 3'b000;
2 C3 `0 g6 v* P                count2 <= 3'b000;2 f% Q$ {0 @: N- L
                count1 <= 1'b0;* T2 Q1 _3 x% x- `/ y0 g
          end
/ K5 h' e8 F' H# r9 M          else if(count2==4 && count1==1 ) begin1 ^! H7 ?! `" [" j5 o
          count <= count+1 ;3 M, L- F  f0 D
          RxD_data_ready <=  RxD_data_ready_in ;6 U. {! o+ [3 o4 v' I7 ^
          end: K5 \- c- Y. I
          else begin4 H# g- L+ `/ K7 p
          count2 <= count2+1 ;3 [2 W6 h2 H* A, k! k- G
          RxD_data_ready <=  1'b0;+ c( m8 T; n- [* W6 g
          end
/ `8 g3 X1 y! x  RxD_data_error <= (Baud8Tick && next_bit && state==4'b0001 &&  RxD_bit_inv);  // error if the stop bit is not received
1 u# C* ]4 i* K8 ~8 J. T) Z5 v3 Y+ ?7 G( |' N
end$ M8 H% s( ]$ c5 @

$ f; d" B- e8 b* C1 A' `& {2 w' J' p3 A) ]

9 P5 ?/ d. j4 ?/ W9 Qreg [4:0] gap_count;
* j: n8 q: f) U7 o  calways @(posedge clk) $ R6 G; N4 ^. u1 t- [* H
        if (state!=0) - w! y+ T; o: Q  z  V2 n
                gap_count<=0;   Y* J6 s' W- g
        else if(Baud8Tick & ~gap_count[4]) ' A+ S8 k  Q/ L* q
                gap_count <= gap_count + 1;
8 C6 A, O+ a! wassign RxD_idle = gap_count[4];
# f/ J* F! E( r& A1 K/ vreg RxD_endofpacket; , E6 w! Y6 I, {7 Y; d5 {
always @(posedge clk) : J* _, R. p) u
RxD_endofpacket <= Baud8Tick & (gap_count==15);$ X3 s: z- V" N& q
& G# N: q6 N& Y: N* y
endmodule* L  e3 d$ X" a( w/ x( [
: \7 T3 J& \: Z! K4 @) ?* F
我想知道為什麼RxD_data_ready腳在資料錯誤時還會拉成high,麻煩會的高手教教我,謝謝!
5#
發表於 2010-11-18 16:43:46 | 只看該作者
RxD_data_ready 似乎只在count2==4就會拉high# k" a$ S! Z8 z) ?% _& I" m0 L: c8 p, ~
程式中並未看到資料錯誤時須將RxD_data_ready拉low
6 Y* v- y2 v, u3 q6 T' ]) D
3 W) E# N& A9 _+ g7 \) X- b另外   # `; F6 f" f1 J5 T  A; h7 Q
請說明你的"資料錯誤"是在什麼狀態的資料錯誤?
6#
發表於 2011-1-16 09:53:45 | 只看該作者
等待高手回复 不是自己的写的 懒的看咯
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

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

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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