1、什么是跨时钟域?
如图所示:
缺点:数据传输不可靠
2、如何实现信号传输稳定?
1)为什么要同步时钟?
设计最基本的思想就是同步。如下图:
如果来自异步的时钟信号(一个来自CPU,一个来自FPGA内部)同时对FPGA中的寄存器进行写入和读取操作,那么就会出现亚稳定状态。
FPGA外部:控制总线(片选、写信号)、地址总线、数据总线
FPGA内部:CPU接口控制(地址锁存寄存器、数据锁存寄存器)
2)如何同步异步的时钟?
I、先是使用脉冲检测法把脉冲信号与系统时钟信号clk同步
II、然后使用脉冲检测法得到一个系统时钟宽度的使能脉冲作为数据锁存信号,也就将CPU的控制信号和系统时钟信号clk同步了
相信我依然没有把过程描述清楚,还是举个例子吧,如下:
1 wire wr_state=mcu_cs_n||mcu_wr_n; //组合逻辑用来检测信号变化 2 3 always@(posedge clk or negedge rst_n) 4 if(!rst_n) 5 begin 6 mcu_addr_r<=4'h0; //地址寄存器 7 mcu_db_r<=8'h00; //数据寄存器 8 end 9 else if(!wr_state) //这里是每一个clk都在检测信号此时的变化 10 begin 11 mcu_addr_r<=mcu_addr; //寄存地址 12 mcu_db_r<=mcu_db; //寄存数据 13 end 14 15 always@(posedge clk or negedge rst_n) 16 if(!rst_n) 17 begin 18 wr1<=1'b1; 19 wr2<=1'b1; 20 end 21 else 22 begin 23 wr1<=wr_state; //这是写数据 24 wr2<=wr1; 25 end 26 27 assign pos_wr=~wr2&&wr1; //这里可以检测到标志位的变化,如果我们直接检测变化,无非就是if(wr1)...但是这样不行的,因为if(这里数据类型必须是wire型的,也就是线型,我们怎么可能检测到reg寄存器型呢,这就是说明了为什么我们需要的“变量”很多。) 28 endmodule