找回密码
 注册
关于网站域名变更的通知
查看: 259|回复: 1
打印 上一主题 下一主题

FPGA跨时域的同步设计思想

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-5-10 11:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
FPGA跨时域的同步设计思想
/ L- T4 O/ O0 J( g

& g5 `$ W8 T5 J4 _, {6 k% X这是特权同学在《深入浅出玩转FPGA》里面的“基于FPGA的跨时钟域信号处理”一章里面的一个例子,以此来强调同步设计思想。该程序因为脉冲信号和由CPU控制总线产生的选通信号是来至两个异步时钟域的信号,它们作为内部时钟信号时,如果同一时刻出现一个时钟在写寄存器counter,另一个时钟在读寄存器counter,那么很明显存在发生冲突的可能。
: v3 Y. f* b& [- K% V$ N        module fp(7 o! Z8 ^) F" O) J% J
                                clk,
; ^& @+ ~6 n$ m% T" {7 ]0 R1 [                                rst,
& R0 I9 p( B" Q9 E) y$ T& e                                pulse,                //脉冲信号,高电平有效
$ M% H# N( W( Q+ o2 v' {                                cs_n,        //低电平有效, w& Z0 t9 Z2 `( H
                                rd_n,                //读使能信号,低电平有效
" H, ?( J2 V7 K3 d5 a                                addr_bus,            //地址总线
$ i# @3 O% |% l9 f, _* U                                data_bus            //数据总线        
4 d) |) v2 E! F1 [8 A: o( B                    );3 @. R5 `1 }; }& l2 C3 l
        input clk;$ k4 d3 r5 f8 R  D  \; m5 K5 C0 O
        input rst;9 v& a: ?0 C* |+ p9 e9 z; H# o
        input plush;
: W& Y+ c/ f0 v9 X( v5 d        input cs_n;
4 e* S5 M* F. C; O, Q        input rd_n;
; n9 Y1 ~! Y. Z, Y        input [3:0] addr_bus;
; U! \; N9 R: \5 C! C3 }4 Z        
6 V4 o/ `) i& D- u& D        output [15:0] data_bus;6 G* L0 B4 s* F- ~4 c
        
! {8 T" T3 y/ v, A5 q: G        reg [15:0] counter;' g! L* K4 P+ I; Q9 [: w
        reg [15:0] data_bus;
' d! R- o% B+ [% c; r8 l2 n# G        
6 |! h1 k4 e# t* @. O% j2 F& Y        always @(posedge plush or negedge rst). U2 a" r8 p- l4 j
                if(!rst) 7 F: T4 G* W6 p! B) e+ P4 s
                                counter <= 16'b0;7 n& ?; d# R7 l1 q. X
                else if(plush) - _" {% M4 M' `7 G
                                counter <= counter + 1'b1;1 `  P7 o2 Y; a; B0 Q  s4 n2 N: q
        
+ M1 V3 \  k- g' D  Y2 ?        wire DSP_cs = cs_en || rd_en;         - N; t7 A/ W  W3 w/ s
        always @(dsp_cs or addr_bus)
5 h5 c) J) C% N* D/ y                if(dsp_cs)
: h  ^  u. y( b. E                        data_bus <= 16'hzzzz;
, b( q' |4 t  H% N' H, u! U! y; T1 K9 @                else begin3 J5 {! \: j' |' \" g4 Q7 c" E
                                case (addr_bus)
6 \( ]4 I& l( \- c$ b                                                4'h0: data_bus <= counter;
5 W& K- N  Z% v$ m0 R3 M% g+ N                                            ...
! B! m- s; W& f5 i! j                                endcase
! v4 Y* v* S4 B+ ?: [        end( l2 Z5 b  U) x
        endmodule
" r) ?5 @& ?: f. P  s, {) w' o6 Z        
2 N+ {6 R+ P7 ~        该例同步设计方法:先使用脉冲同步法把脉冲信号与系统时钟信号clk同步,然后使用脉冲同步法得到一个系统时钟宽度的使能信号作为数据锁存信号,同时也将CPU的控制信号与系统时钟信号同步。本人根据这个思想写了如下程序。我的疑问是同一个时刻clk出现写counter和读counter,怎么不会发生数据冲突。
2 T  u' p5 s- C: r' {* g0 Xmodule fp(3 g; S/ _7 Y) ]7 ], j
                        clk," t3 C1 s5 R) j' v  z* [8 j
                        rst,
& r$ m: }+ ^, @                        pulse,                //脉冲信号,高电平有效+ ?1 ^, k. V" Y
                        cs_n,       //低电平有效$ y8 s; [- J# ]- c6 q9 t, X
                        rd_n,                //读使能信号,低电平有效" \' [( d0 d5 f6 q# j6 R
                        addr_bus,        //地址总线3 Q. r# e. Z4 ]+ ~' V$ Z- X$ h7 \2 X
                        data_bus        //数据总线        
6 I4 x& `' f% O7 X1 }$ C! r2 ^: j+ ?. Y                   );
3 r$ a% h( s2 |input clk;
7 D. Q( X4 [! j2 @- vinput rst;
' m5 D' h3 ^  _: C2 l( hinput plush;
# J0 s+ W5 t- r6 Winput cs_n;
7 E9 E( n% l$ S2 ?input rd_n;! t2 b! `/ ~2 p) m: Q- H9 I9 n+ l
input [3:0] addr_bus;
6 S  x/ Q' _; y+ R& ^- b& {" `
, v8 b+ b9 |" r1 foutput [15:0] data_bus;
! }# l$ B1 z. I2 j* A9 h6 R+ ?) E* Z6 E$ C  Z8 z: ]1 r+ \
reg [15:0] counter;
0 A( p6 Z% ~' v& t7 jreg [15:0] data_bus;' B- F: b3 N3 c: t. N$ A8 E" G

# Z( u) C: n! ]/ [reg preg1,preg2;1 G+ ~' G! g" ]2 [: H: J
always @(posedge clk or negedge rst)7 a+ m+ ^3 {, e; |9 G- q
        if(!rst) begin, c. X4 u. U2 U0 o4 g# R8 F. s) K
                        preg1 <= 1'b1;1 l7 T& @$ w0 V' K  V0 h+ Y) B  t
                        preg2 <= 1'b1;
7 E9 v7 R6 F4 @9 i% g        end
3 U8 V1 C+ t. `, d4 _        else begin; e0 q$ S5 N+ N! b" ^0 Q6 o; y3 s
                        preg1 <= plush;
- {9 g# ]/ `& {1 j) r/ H                        preg2 <= preg1;
- P: M) ^4 V% f$ Y2 ^        end# @4 |- Y9 R4 G: S4 c5 v; o
wire pos_en;
; y9 G; w0 w8 {2 i6 d7 P3 P3 Dassign pos_en = preg1 & (~preg2);      //检测脉冲信号,一个时钟周期有效的高电平      ) u7 h! }6 [- e6 E- B

' v! g0 ?- x) T0 u! W  zalways @(posedge clk or negedge rst)
6 M( G6 J9 W/ W7 G; R, d        if(!rst)
* N0 S2 ^8 y) J) e3 x$ Q( J                        counter <= 16'b0;
/ `2 e/ B+ P" k0 m/ n% k        else if(pos_en)
' r- l6 {% N( b4 W                        counter <= counter + 1'b1;* A9 ?8 r& j" C' d( [

3 w9 i+ c( Z. j& ^( W5 q3 e  u7 E6 A! H/ a
wire pos_en = cs_en || rd_en;         //片选信号和读信号同时为低时,对地址总线进行译码,把采样脉冲值送给数据总线. C, E7 G: M* \. D: W
reg dreg1,dreg2;
. E* f) \% i& f* ~# T; e6 G' [" \always @(posedge clk or negedge rst). o6 k' u" J. f* u; T! {
        if(!rst) begin, \; i3 y% h" Y. j+ G
                        dreg1 <= 1'b1;' ?6 K1 F0 L+ x( q( T
                        dreg2 <= 1'b1;; b, Z# W+ z$ }. I8 r# F* C7 }
        end
  F" T. P( ]2 T# V& A        else begin
9 Q( n. Z1 W$ O% k$ j. Q: N/ b                        dreg1 <= ce_en;- Z  K2 @; C* ]5 i% i3 U  Q
                        dreg2 <= preg1;
1 ], j( s6 U! @. Q        end
3 d! ]8 v: n: B4 |$ |7 dwire dsp_cs;0 o) ^7 O$ j+ i0 e" V
assign dsp_cs = dreg2 & (~dreg1);        //使能信号. T8 v& v& [9 @* F5 h
s- X- U( K/ U& U& F
always @(posedge clk or negedge rst)
+ |, R0 }! w. |# u. R        if(!rst) $ b+ d2 [. x" i/ H4 M
                data_bus <= 16'hzzzz;& w" o( w! G# G- L! I' Z- O  m& o
        else if(dsp_cs) begin
) ?0 f9 C1 z) l3 b8 V$ {                        case (addr_bus)1 \+ D+ J8 b% \- r3 S0 c
                                        4'h0: data_bus <= counter;/ {8 o7 x- v% W6 P# t' W
                                    ...) D- m0 j6 {6 q) R, s
                        endcase
6 S1 l/ n: p2 x4 cend4 O; \1 N1 A8 F+ a: ^2 ^
endmodule
5 ~7 Y7 _# s2 k3 V7 O
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-3 04:26 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表