Verilog3-glitch_free_clock_switching(无毛刺时钟切换电路)
文章目录Verilog 实现 glitch free clock Switching(无毛刺时钟切换电路)1、有毛刺的时钟切换电路2、相关时钟源(同步时钟)的毛刺保护3、无关时钟源(异步时钟)的毛刺保护Verilog 实现 glitch free clock Switching(无毛刺时钟切换电路)要求:输入sel、clka 、clkb,sel 为1输出为 clka,sel为0 输出 clkb参考
·
文章目录
Verilog 实现 glitch free clock Switching(无毛刺时钟切换电路)
- 要求:输入sel、clka 、clkb,sel 为1输出为 clka,sel为0 输出 clkb
- 参考文章:http://www.asic-world.com/examples/verilog/syn_fifo.html
- https://blog.csdn.net/bleauchat/article/details/96180815
- 招牌Verilog设计类的题目
- 奇偶分频、状态机、序列检测器、波形产生、跨时钟域传输(CDC,Clock Domain Conversion )、门控时钟、同步FIFO、异步FIFO、格雷码与二进制码转换、异步复位同步释放、始终切换等。
1、有毛刺的时钟切换电路
- 原理图
-
Verilog描述
assign outclk = (clk1 & select) | (~select & clk0);
-
结果:存在毛刺信号
2、相关时钟源(同步时钟)的毛刺保护
- 防止源时钟相互倍数的时钟开关输出出现毛刺的解决方案 —— 在每个时钟源的选择路径中插入负边沿触发的D触发器
- 思路:在时钟的下降沿采样选择控制(SELECT),以及仅在首先使其他时钟无效后使能选择(SELECT)。
-
原理:
- SELECT为0时,CLK1对应通路无效,CLK0对应通路有效。在CLK0的下降沿采样SELECT(取反后)信号,与CLK0相与之后输出
- 同时触发器DFF0 反馈信号到 上半部分电路,使其输入一直处于低电位
- SELECT为1时,CLK0对应通路无效,CLK1对应通路有效。但由于反馈信号存在,需要在CLK0 下降沿到来后,QN输出高电平,CLK1对应通路才能采样到 SELECT信号输出高电平,与CLK1相与之后输出
-
结果:可以进行**相关时钟源(同步时钟)**的毛刺保护
-
注意:
- 在时钟的下降沿寄存选择信号(SELECT),可以保证下降沿到来之前输出端保持不变,这样就不会斩断当前时钟。
- 当SELECT信号突然发生变化,也必须等待到当前时钟的下降沿到来才能使当前时钟无效,避免了毛刺(glitch)
- 电路中有三个时序路径需要特别考虑:SELECT控制信号到两个负边沿触发器中的任何一个,DFF0输出到DFF1的输入,DFF1的输出到DFF0的输入。如果三条路径中的任何一条路径上的信号与目标触发器的捕获边缘同时发生变化,则该寄存器的输出很可能变为亚稳态,其可能会进入理想的0和1两者之间的状态。
module Glitch_free_clock_switching_syn(clk0,clk1,rst_n,select,out_clk);
input clk0,clk1;
input rst_n,select;
output outclk;
reg out0,out1;
always@(negedge clk1 or negedge rst_n)
begin
if(!rst_n) begin
out1 <= 0;
end
else begin
out1 <= ~out0 & select;
end
end
always@(negedge clk0 or negedge rst_n)
begin
if(!rst_n) begin
out0 <= 0;
end
else begin
out0 <= ~out1 & ~select;
end
end
assign outclk = (out1 & clk1) | (out0 & clk0)
3、无关时钟源(异步时钟)的毛刺保护
- 通过为每个时钟源添加一个额外级的正边沿触发触发器来提供针对亚稳态的保护。每个选择路径中的正边沿触发器以及现有的负边沿触发器防止潜在的亚稳态性,这可能是由异步SELECT信号或从一个时钟域到另一个时钟域的异步反馈过来的
- 第一级触发器帮助稳定数据,然后将数据传递到下一级
- 原理
- SELECT为0时,CLK0 部分电路有效,CLK1通路无效。在CLK0上升沿将 SELECT& out1 传到 out_r0,在CLK0下降沿 传到 out0,之后与 out0&CLK0 得到输出
- 当SELECT变为1时,要等到CLK0 的一个上升沿、下降沿到来之后,才能将反馈信号 ~out0 置为1,CLK1通路的 SELECT信号才能发生作用。类似于CLK0通路作用过程
- 当SELECT信号发生变化之后,要 经过一个上升沿、下降沿才能让另一条通路的开始工作。两级触发器防止跨时钟域的亚稳态和毛刺信号出现
module Glitch_free_clock_switching_asyn(clk0,clk1,rst_n,select,outclk);
input clk0,clk1; //asynchronous:异步
input rst_n,select;
output outclk;
reg out_r1,out1;
reg out_r0,out0;
always@(posedge clk1 or negedge rst_n)
begin
if(!rst_n)
out_r1 <= 0;
else
out_r1 <= select & ~out0;
end
always@(negedge clk1 or negedge rst_n)
begin
if(!rst_n)
out1 <= 0;
else
out1 <= out_r1;
end
always@(posedge clk0 or negedge rst_n)
begin
if(!rst_n)
out_r0 <= 0;
else
out_r0 <= ~select & ~out1;
end
always@(posedge clk0 or negedge rst_n)
begin
if(!rst_n)
out0 <= 0;
else
out0 <= out_r0;
end
assign outclk = (out0 & clk0) | (out1 & clk1);
endmodule
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献10条内容
所有评论(0)