Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2010-10-20 14:30:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是我的程式:
" k. w/ J) p" t8 p. B0 P# Kmodule async_receiver_1(clk, RxD, RxD_data_ready, RxD_data_out, RxD_endofpacket, RxD_idle);# {: O. U% h! Q6 Q" c
input clk, RxD;& X+ g! }3 ]) M4 F5 c6 I
output RxD_data_ready;  // onc clock pulse when RxD_data is valid
8 a$ T; y" o* R' V4 doutput [7:0] RxD_data_out;
, C4 k$ m# v1 @" |% P7 G0 o" F5 p& T- R
parameter ClkFrequency = 5000000; // 5 MHz. H3 {7 b: J4 B; W2 S
parameter Baud = 115200;
" S" Z- q! e; z( b' y
, J+ v! _6 u1 ~7 j1 H) q+ m2 \// We also detect if a gap occurs in the received stream of characters: L- J. D% W: `; q7 h& m4 \% O
// That can be useful if multiple characters are sent in burst8 z: n( b  Q- A7 L% x
//  so that multiple characters can be treated as a "packet"; f1 t: p, S2 x5 A
output RxD_endofpacket;  // one clock pulse, when no more data is received (RxD_idle is going high)/ N2 Q( @; y- J% ?1 F( W
output RxD_idle;  // no data is being received. e/ Y5 v8 n: r# L. a

/ x9 ]- ]! L# a5 C' I: z# V, h" R// Baud generator (we use 8 times oversampling)
; F  l3 i% R7 N* d# P! C, Wparameter Baud8 = Baud*8;' W' a# t0 z  e, S5 ]
parameter Baud8GeneratorAccWidth = 16;! @" c( C. B: H+ R
parameter Baud8GeneratorInc = ((Baud8<<(Baud8GeneratorAccWidth-7))+(ClkFrequency>>8))/(ClkFrequency>>7);3 D* T6 d1 ^. r% f( Z
reg [Baud8GeneratorAccWidth:0] Baud8GeneratorAcc;  D' w' c$ V1 U: z2 m
always @(posedge clk) : x, ~# I; l0 H% T, O' m
        Baud8GeneratorAcc <= Baud8GeneratorAcc[Baud8GeneratorAccWidth-1:0] + Baud8GeneratorInc;
: V6 t2 ], y. `6 q  gwire Baud8Tick = Baud8GeneratorAcc[Baud8GeneratorAccWidth];
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2010-10-20 14:30:49 | 只看該作者
////////////////////////////
* ]* m& C) j; ?6 p+ G2 C8 g( X6 Q! ]reg [1:0] RxD_sync_inv;
$ a; l( @5 X" x- I! `; f( talways @(posedge clk) % G1 M3 b9 |' [8 [4 B
if(Baud8Tick)
) [6 m2 A6 `, X- Z2 y8 e        RxD_sync_inv <= {RxD_sync_inv[0], ~RxD};
4 A" N- k$ {; o8 @0 c// we invert RxD, so that the idle becomes "0", to prevent a phantom character to be received at startup7 m8 o7 i: m3 f
# l  O. D, F/ b7 ]$ [
reg [1:0] RxD_cnt_inv;# {- X% J) u  o6 A; X
reg RxD_bit_inv;
% Z" j& |8 n- j5 u4 @* u% ~" B/ v
$ G! C4 e9 z( E6 J; Ualways @(posedge clk)0 I1 X& M5 M+ J6 r
if(Baud8Tick)- q) ]6 J4 A' [* k- Z3 A
begin
' ], O/ r0 Z" E$ V  if( RxD_sync_inv[1] && RxD_cnt_inv!=2'b11) RxD_cnt_inv <= RxD_cnt_inv + 1;3 C$ S8 e' L/ \8 [& w% r6 F& Q
  else
7 Q* A% a8 ?0 X* I  if(~RxD_sync_inv[1] && RxD_cnt_inv!=2'b00) RxD_cnt_inv <= RxD_cnt_inv - 1;1 e9 [+ E: R* M( B- k
* ^' v3 ]; {+ Z6 Z6 t+ M8 v. s* [- v* f
  if(RxD_cnt_inv==2'b00) RxD_bit_inv <= 0;% v+ F8 ~9 r4 }6 w" _
  else
! }; Z8 i9 B( `" ?" p! o; K+ ~2 v4 v  if(RxD_cnt_inv==2'b11) RxD_bit_inv <= 1;6 G/ A' i" |% _* h, T
end0 j, a& q' Y( X# I/ u

% T( u; k' ~+ p  preg [3:0] state;
% d6 c, p& _# x3 @! E. wreg [3:0] bit_spacing;
9 X: A/ m2 k1 [+ i3 {
0 T! s9 z" e8 R& q' W  P// "next_bit" controls when the data sampling occurs
% G* `5 p* X$ y- x) f% {0 A# v6 A// depending on how noisy the RxD is, different values might work better
* E" L8 s, d2 ]$ ~$ [" z// with a clean connection, values from 8 to 11 work- ]' ^; W  [, a# V% y# G( H$ h0 R
wire next_bit = (bit_spacing==10);
( c5 C3 t& Q3 Z1 V! P: s; Z/ K, ^3 G/ i+ A* \
always @(posedge clk)
5 M& `9 e1 [% u9 C7 p+ [if(state==0)
: T& N: [! K& h) [. }  bit_spacing <= 0;2 d) A3 [7 g' B. P+ c
else
" H5 x: U7 ]2 U! Bif(Baud8Tick)) o- z4 b5 e0 p0 |5 |
  bit_spacing <= {bit_spacing[2:0] + 1} | {bit_spacing[3], 3'b000};
3#
 樓主| 發表於 2010-10-20 14:31:09 | 只看該作者
always @(posedge clk)
, i( V7 K; S6 fif(Baud8Tick)
$ ?+ a/ Y) ~5 F! d+ g, Wcase(state)
1 p: N0 c8 s; t9 X$ S6 d  4'b0000: if(RxD_bit_inv) state <= 4'b1000;  // start bit found?( E: v2 @# ^; d; Z4 ]+ Z1 b, R  \
  4'b1000: if(next_bit) state <= 4'b1001;  // bit 0) t2 u- U/ l1 d2 h
  4'b1001: if(next_bit) state <= 4'b1010;  // bit 17 [" S4 l& C, z2 X' z, G% V
  4'b1010: if(next_bit) state <= 4'b1011;  // bit 2/ ~5 V, {0 d$ T3 I* _
  4'b1011: if(next_bit) state <= 4'b1100;  // bit 3) b7 F/ \$ y( C+ v! k" B
  4'b1100: if(next_bit) state <= 4'b1101;  // bit 4
1 y) ?* t/ ^7 x4 W2 j# F' W& M  4'b1101: if(next_bit) state <= 4'b1110;  // bit 5' r. b- S0 p( _7 m1 V) \
  4'b1110: if(next_bit) state <= 4'b1111;  // bit 6* g% W- C5 G; x( v2 i
  4'b1111: if(next_bit) state <= 4'b0001;  // bit 7" Z5 q; o2 w" q; j! D) d9 ~+ A
  4'b0001: if(next_bit) state <= 4'b0000;  // stop bit9 F, m1 B* p1 w9 \9 D
  default: state <= 4'b0000;+ P+ @, `5 k0 l5 t6 H
endcase
4#
 樓主| 發表於 2010-10-20 14:31:16 | 只看該作者
reg [7:0] RxD_data;3 ?; n! Z& `/ @
reg [7:0] RxD_data_out;
. ]( U  V0 C) p! L' J3 Valways @(posedge clk) begin+ ^8 k) l2 V& Q
if(Baud8Tick && next_bit && state[3]) begin
6 p! S& R, }* ?8 e7 e( b$ g   RxD_data <= {~RxD_bit_inv, RxD_data[7:1]};' \4 Y/ Q, O. D# R' R6 \3 r" l# r
end
/ ^, C0 U/ p: e9 v) g. e: G/ T if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin
/ @6 u8 t# ?2 J- a6 s: u/ ?) p RxD_data_out <= RxD_data;; S: u+ X# t# m, E7 R2 v3 \1 U9 i
end
+ t# n( }% y- E  dend
9 l8 Z8 d0 ~% F6 B; ]+ b' i1 t
9 U: C8 `7 V+ T0 ?5 @) B( a2 w. o* u  U3 E  |, A, [% g& M
reg RxD_data_ready, RxD_data_error;6 E- x6 T9 S4 Q1 L
reg RxD_data_ready_in;
" K2 N5 f1 q$ s2 c1 nreg[0:2] count;1 v8 Y5 q6 S' R1 |/ ?! {* D
reg[0:2] count2;
4 \. R: w& X; ?! _reg count1;
, L3 p* |# ~& V4 Talways @(posedge clk)
- I& t5 [5 l6 |3 Ubegin
% S. c9 ?' q6 n$ W- I  B1 X1 W0 z$ U" N8 ]+ u6 ~5 P
  if (Baud8Tick && next_bit && state==4'b0001 && ~RxD_bit_inv) begin# w& }% P% B/ X: n8 D- Z8 P  V
   RxD_data_ready_in <= 1'b1;- q( m0 U- j! C# Y1 C
        count1 <= 1'b1;, Q2 H* |! i- m, t7 f, S! `
        count <= 3'b000;
; @7 p5 B1 }7 Y        count2 <= 3'b000;
# X8 O6 h6 F& L7 v  end                     0 p! q" |' C" H5 R- b& P
  else if(count==4 && count1==1 )begin
& z1 H$ q4 o7 A4 w; e           RxD_data_ready <= 1'b0;2 d8 D) S$ h& S: y" W! q
           count <= 3'b000;
% K6 e( W! e3 O                count2 <= 3'b000;
. c4 K& w3 V3 l( Q7 V                count1 <= 1'b0;6 H( a) u9 n, p4 Z) l
          end, ~" Q, P3 j- F6 @. D- F' j& V" f2 y
          else if(count2==4 && count1==1 ) begin
! L0 u  A3 p% P6 z          count <= count+1 ;
" P! B6 r9 |/ P2 Z4 j          RxD_data_ready <=  RxD_data_ready_in ;
+ X$ e6 ?8 \3 K$ @+ S5 B          end
" L" Y( _" I# K          else begin
8 b  Z& t  e" b: w" ]7 D! g) @          count2 <= count2+1 ;) w& @  f0 a& b# ?/ i
          RxD_data_ready <=  1'b0;8 f, _4 R$ k, p. R3 I8 m) a% ?: w
          end
2 ]6 s6 ^8 n$ U; n! @  RxD_data_error <= (Baud8Tick && next_bit && state==4'b0001 &&  RxD_bit_inv);  // error if the stop bit is not received; k, E  l  f; S5 }- W

) l5 D- f. p: o, B& @9 g$ N" _! Tend
/ `2 ^+ G8 j+ |; ^$ G0 x" E! j& W) K! u
4 X, J0 V# c4 X) [; |
- N% }# c1 l4 X5 n% R, f; e
reg [4:0] gap_count;. A% w9 v* d: \) E/ j7 V
always @(posedge clk) 4 q. g- E% D2 k9 r
        if (state!=0) * d8 h" k& b( B1 S
                gap_count<=0;
* B& Y. b( q  V7 f0 |2 h9 E3 @        else if(Baud8Tick & ~gap_count[4]) 6 r" c* |( }: Q6 o* G
                gap_count <= gap_count + 1;3 ?4 f/ |1 p: p% M* s" c
assign RxD_idle = gap_count[4];* J8 y7 V# ~2 j% z$ N6 V+ }
reg RxD_endofpacket; : R, b. R0 |$ B) f% h% [
always @(posedge clk)
) t5 T3 Z3 E+ k# h5 ^; |: Y* _' qRxD_endofpacket <= Baud8Tick & (gap_count==15);
: r( p  L3 E- v7 `3 S. M2 E# B0 T6 |2 l2 Y. A
endmodule  x# Q$ |" J, s2 Q
& W9 g8 K; Z: F* U* G0 \+ \/ b
我想知道為什麼RxD_data_ready腳在資料錯誤時還會拉成high,麻煩會的高手教教我,謝謝!
5#
發表於 2010-11-18 16:43:46 | 只看該作者
RxD_data_ready 似乎只在count2==4就會拉high8 {& R% [* o- |: E9 T
程式中並未看到資料錯誤時須將RxD_data_ready拉low' ^- n, E. J$ Z/ l7 h" y

8 D# G( Y- j2 n( Y3 f另外   
# H" ?/ `4 N! H9 U請說明你的"資料錯誤"是在什麼狀態的資料錯誤?
6#
發表於 2011-1-16 09:53:45 | 只看該作者
等待高手回复 不是自己的写的 懒的看咯
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2025-2-24 08:32 AM , Processed in 0.166009 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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