跨时钟域信号处理
2015-11-15 17:03
295 查看
1、什么是跨时钟域?
如图所示:缺点:数据传输不可靠
2、如何实现信号传输稳定?
1)为什么要同步时钟?设计最基本的思想就是同步。如下图:
如果来自异步的时钟信号(一个来自CPU,一个来自FPGA内部)同时对FPGA中的寄存器进行写入和读取操作,那么就会出现亚稳定状态。
FPGA外部:控制总线(片选、写信号)、地址总线、数据总线
FPGA内部:CPU接口控制(地址锁存寄存器、数据锁存寄存器)
2)如何同步异步的时钟?
I、先是使用脉冲检测法把脉冲信号与系统时钟信号clk同步
II、然后使用脉冲检测法得到一个系统时钟宽度的使能脉冲作为数据锁存信号,也就将CPU的控制信号和系统时钟信号clk同步了
相信我依然没有把过程描述清楚,还是举个例子吧,如下:
wire wr_state=mcu_cs_n||mcu_wr_n; //组合逻辑用来检测信号变化 always@(posedge clk or negedge rst_n) if(!rst_n) begin mcu_addr_r<=4'h0; //地址寄存器 mcu_db_r<=8'h00; //数据寄存器 end else if(!wr_state) //这里是每一个clk都在检测信号此时的变化 begin mcu_addr_r<=mcu_addr; //寄存地址 mcu_db_r<=mcu_db; //寄存数据 end always@(posedge clk or negedge rst_n) if(!rst_n) begin wr1<=1'b1; wr2<=1'b1; end else begin wr1<=wr_state; //这是写数据 wr2<=wr1; end assign pos_wr=~wr2&&wr1; //这里可以检测到标志位的变化,如果我们直接检测变化,无非就是if(wr1)...但是这样不行的,因为if(这里数据类型必须是wire型的,也就是线型,我们怎么可能检测到reg寄存器型呢,这就是说明了为什么我们需要的“变量”很多。) endmodule
相关文章推荐
- 《C和指针》章节后编程练习解答参考——6.2
- 【LigerUI实战】Grid弹出编辑popup
- Powershell管理系列(二十五)PowerShell操作之获取AD账号及邮箱信息
- 数据库应用类型:OLTP与OLAP的比较
- [转]UIModalPresentationStyle和UIModalTransitionStyle
- Flex 布局
- HDU 5073 Coprime(容斥原理+组合数学)
- Hello Tuscany
- Day 8(11.15):随堂笔记
- TCP连接的建立(三次握手)和释放(四次挥手)
- POJ 2253 Frogger
- OC学习心得之面向类和对象
- 自己做的demo---关于java控制台输入跟类型转化跟处理异常的demo
- 派生类(多级)到基类转换的可访问性
- 如何替换Theme developer 模块手工查找命名需要覆写模块的名称?
- bochs上网及配置
- Android Studio的使用(八)--// TODO代码
- 软件功能测试——基础理论篇
- [C++] Vtable(虚函数表)
- 转换 Github-Favored Markdown 成 PDF