第八章 对立统一——异步时钟同步化
一、什么是对立统一
什么是CEO,就是首席执行官,是在一个企业中负责日常经营管理的最高级管理人员,又称作行政总裁,或最高执行长或大班。
那么,在FPGA系统,需不需要一个最高级别的执行官,来管理所有进程呢?为了系统的有序性,不至于凌乱、崩溃,答案必然是肯定的。
谁都知道,FPGA内部时序逻辑的工作,是通过时钟的配合来完成任务的。那么当系统中有异步时钟的时候,怎么办?每一个系统必须有一个最高级别的时钟,执行力最强;同时它担任着管理异步时钟的任务,其它异步时钟想让手下执行任务,必须告诉执行官,然后执行官去分配任务。所以,一切行动,都必须通过首席执行官的允许,才能进行;不然,没门。首席执行官具有最高支配权。它们之间的关系如下图所示:
因此,对于工程中出现的异步时钟,与最高时钟是对立关系,但这个CEO的地位决定了只有他说了算,不然就会“叛乱”,因此要把那些异步时钟统一管理,这就是所谓的“对立统一”。
二、异步时钟同步化
1. 异步时钟种类
异步时钟有很种类,如下是几种项目中常常出现的情况
(1)系统异步复位信号
(2)由其它处理器输入的时钟
(3)内部组合逻辑产生的时钟
当然也并非所有异步时钟都要同步化,必须高速ADC,DAC芯片往往有个时钟输入端,这时保证该芯片与该部分逻辑电路同步,可以专门供给一个晶振,来达到更好的效果;同时也不是最高时钟以外的时钟都要同步化,由PLL产生的不同的时钟,本身就是同步的,可以不处理。
当然在可靠性要求不高的时候,异步复位这些信号也可以不处理,只是,养成良好的习惯,永远不会错。
2. 异步时钟解决方案
对于时钟的同步,采用的方法都差不多。Bingo在特权的《深入浅出玩转FPGA》中得到启发,相应的简单的描述一下几种关于异步复位信号的同步化。
(1)异步复位信号的同步化
此部分其实很简单,应用了上述边沿检测的部分思维,用最高时钟打慢几拍,便实现了与最高时钟的同步。此处不再用Block来累赘的描述,verilog设计代码如下所示:
/*****************************************************
* Module Name : synchronism_design.v
* Engineer : Crazy Bingo
* Target Device : EP2C8Q208C8
* Tool versions : Quartus II 11.0
* Create Date : 2011-6-25
* Revision : v1.0
* Description :
*****************************************************/
module synchronism_design
(
input clk,
input rst_n,
output sys_rst_n
);
//------------------------------------------
//rst_n synchronism, is controlled by the input clk
reg rst_nr1, rst_nr2;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
rst_nr1 <= 1'b0;
rst_nr2 <= 1'b0;
end
else
begin
rst_nr1 <= 1'b1;
rst_nr2 <= rst_nr1;
end
end
assign sys_rst_n = rst_nr2; //active low
endmodule
Quartus II RTL图如下:
(2)PLL协作时异步复位信号同步化
相对于上述异步复位信号同步化方法的扩展,分析存在PLL环情况下的对信号的处理。如下verilog代码所示,先用晶振输入时钟对异步复位信号进行同步化,最后通过与PLL输出信号locked与前面产生的同步复位信号与操作,得到最后的系统复位信号。
具体Verilog代码如下所示:
/*****************************************************
* Module Name : synchronism_pll_design.v
* Engineer : Crazy Bingo
* Target Device : EP2C8Q208C8
* Tool versions : Quartus II 11.0
* Create Date : 2011-6-25
* Revision : v1.0
* Description :
*****************************************************/
module synchronism_pll_design
(
input clk, //50MHz
input rst_n, //global reset
output sys_rst_n, //system reset
output clk_c0 //50MHz
);
//----------------------------------------------
//rst_n synchronism, is controlled by the input clk
wire pll_rst;
reg rst_nr1,rst_nr2;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
rst_nr1 <= 1'b0;
rst_nr2 <= 1'b0;
end
else
begin
rst_nr1 <= 1'b1;
rst_nr2 <= rst_nr1;
end
end
assign pll_rst = ~rst_nr2; //active High
//----------------------------------------------
//sys_rst_n synchronism, is control by the highest output clk
wire locked;
wire sysrst_nr0 = rst_nr2 & locked;
reg sysrst_nr1, sysrst_nr2;
always @(posedge clk_c0 or negedge sysrst_nr0)
begin
if(!sysrst_nr0)
begin
sysrst_nr1 <= 1'b0;
sysrst_nr2 <= 1'b0;
end
else
begin
sysrst_nr1 <= 1'b1;
sysrst_nr2 <= sysrst_nr1;
end
end
assign sys_rst_n = sysrst_nr2; //active Low
//----------------------------------------------
//Component instantiation
pll pll
(
.areset (pll_rst),
.inclk0 (clk),
.c0 (clk_c0),
.locked (locked)
);
endmodule
Quartus II RTL图如下所示:
(3)外输入异步信号同步化
当外面输入异步时钟或者异步信号的时钟,一律转换为使能时钟。此方法与前一张接关于边沿检测的讲述一样,此处不做累赘讲解。
(4)系统同步信号最优化设计方案
当FPGA刚上电的短暂时间内,所有逻辑块上电,多多少少需要一定的时间(尽管非常短暂)。在一般时序要求不高的项目中,似乎可以忽略不计。但对于是需要求非常严格的操作,这几十ns或者ms上电时,FPGA内部是相当不稳定的。因此,在同步异步信号的同时,先将整个系统工作延时一定时间,将会在一定程度上得到更稳定的运行结果。同时,处理后FPGA内部真正开始工作实在系统上电稳定后进行的,因此相应逻辑时序等,更稳定准确。
以下是Bingo在实际项目中遇到的问题的解决方案。经过对系统进行100ms延时的处理后,本来容易出错的系统,在没出现过异常。
具体verilog代码如下所示:
/***************************************************
* Module Name : synchronism_pll_delay_design.v
* Engineer : Crazy Bingo
* Target Device : EP2C8Q208C8
* Tool versions : Quartus II 11.0
* Create Date : 2011-6-25
* Revision : v1.0
* Description :
****************************************************/
module synchronism_pll_delay_design
(
input clk, //50MHz
input rst_n, //global reset
output sys_rst_n, //system reset
output clk_c0 //50MHz
);
//----------------------------------------------
//rst_n synchronism, is controlled by the input clk
reg rst_nr1,rst_nr2;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
rst_nr1 <= 1'b0;
rst_nr2 <= 1'b0;
end
else
begin
rst_nr1 <= 1'b1;
rst_nr2 <= rst_nr1;
end
end
//----------------------------------
//component instantiation for system_delay
wire delay_ok;
system_delay system_delay_inst
(
.clk (clk),
.delay_ok (delay_ok)
);
wire pll_rst = ~rst_nr2 & ~delay_ok; //active High
//----------------------------------------------
//Component instantiation
pll pll
(
.areset (pll_rst),
.inclk0 (clk),
.c0 (clk_c0),
.locked (locked)
);
//----------------------------------------------
//sys_rst_n synchronism, is control by the highest output clk
wire locked;
wire sysrst_nr0 = rst_nr2 & locked & delay_ok;
reg sysrst_nr1, sysrst_nr2;
always @(posedge clk_c0 or negedge sysrst_nr0)
begin
if(!sysrst_nr0)
begin
sysrst_nr1 <= 1'b0;
sysrst_nr2 <= 1'b0;
end
else
begin
sysrst_nr1 <= 1'b1;
sysrst_nr2 <= sysrst_nr1;
end
end
assign sys_rst_n = sysrst_nr2; //active Low
endmodule
//################################################//
//################################################//
module system_delay
(
input clk, //50MHz
output delay_ok
);
//------------------------------------------
// Delay 100ms for steady state
reg [22:0] cnt;
always@(posedge clk)
begin
if(cnt < 23'd50_00000) //100ms
cnt <= cnt + 1'b1;
else
cnt <= cnt;
end
//------------------------------------------
//sys_rst_n synchronism
assign delay_ok = (cnt == 23'd50_00000)? 1'b1 : 1'b0;
endmodule
Quartus II RTL图如下所示:
第八章 对立统一——异步时钟同步化相关推荐
- FPGA异步时钟设计中的同步策略
1 引言 基于FPGA的数字系统设计中大都推荐采用同步时序的设计,也就是单时钟系统.但是实际的工程中,纯粹单时钟系统设计的情况很少,特别是设计模块与外围芯片的通信中,跨时钟域的情况经常不可避免. ...
- @async 没有异步_扒一扒VueCLI3.0中Axios异步请求同步化
前台经常会遇到请求同步和异步的问题,今天咱们来聊一聊vue中同步请求和异步请求那些事儿. 说到接口的请求同步和异步问题,最早接触Ajax中就存在,Ajax传递的参数有一个async,默认情况下是fal ...
- [vue] 如果将axios异步请求同步化处理?
[vue] 如果将axios异步请求同步化处理? // 统一处理axios请求async getHistoryData (data) {try {let res = await axios.get(' ...
- (10)Vivado 异步时钟约束
(10)Vivado 异步时钟约束 1 文章目录 1)文章目录 2)时序约束引言 3)FPGA时序约束课程介绍 4)Vivado 异步时钟约束 5)技术交流 6)参考资料 2 时序约束引言 1)什么是 ...
- FPGA跨时钟域异步时钟设计的几种同步策略
1 引言 基于FPGA的数字系统设计中大都推荐采用同步时序的设计,也就是单时钟系统.但是实际的工程中,纯粹单时钟系统设计的情况很少,特别是设计模块与外围芯片的通信中,跨时钟域的情况经常不可避免.如果对 ...
- python携程怎么做数据同步_利用python yielding创建协程将异步编程同步化
转自:http://www.jackyshen.com/2015/05/21/async-operations-in-form-of-sync-programming-with-python-yiel ...
- 相位同步、频率同步、同相位时钟、同源时钟、同时钟域时钟和异步时钟区别。
相位同步.频率同步.同相位时钟.同源时钟.同时钟域时钟和异步时钟区别. 相位同步.频率同步 相位同步 频率同步 时间同步和频率同步区别: 参考链接 同相位时钟.同源时钟.同时钟域时钟和异步时钟 同相位 ...
- 异步时钟处理之结绳法2
CDC异步时钟处理之结绳法2 结绳法2 不需要握手信号的结绳法电路结构如下 no ACK verilog code 仿真结果 升级版结绳法结构 RTL级电路(schematic) ACK verilo ...
- 异步时钟处理之结绳法1
异步时钟域处理之结绳法1 异步时钟域 结绳法 结绳法时序图 verilog code 仿真结果 testbench 异步时钟域 在实际的设计中经常碰到跨时钟域的信号,异步时钟分为两种情况 1两个不同频 ...
最新文章
- 类加载器-启动类加载器
- 操作系统原理之I/O设备管理(第六章上半部分)
- 【CodeForces - 334B】Eight Point Sets(水题模拟,有坑)
- sql随机抽取数据50条_MySQL中随机抽样
- Maven学习总结(12)——eclipse中构建多模块maven项目
- Angular 学习笔记 Material
- Servlet文件下载
- 363.矩形区域不超过K的最大数值和
- python动态规划dp
- 预见2022 | 吴晓波年终秀 附PPT
- SSL认证之相关证书的生成
- 【商城秒杀项目】-- 项目总结
- z-buffer算法
- 【矩阵篇】九宫图/n宫图生成——Merzirac法生成奇阶幻方 Python实现
- 图片的透明半透明显示!
- 回帖送大奖 『和AI在一起』
- 模块:导入和使用标准模块,第三方模块
- Nachos系统简介
- ListViewItem实现listview中条目的显示控制
- java公路车等级_CANNONATA康纳塔 JAVA发布2016款终极赛车