FPGA(Verilog)时钟无缝切换设计与验证

这篇具有很好参考价值的文章主要介绍了FPGA(Verilog)时钟无缝切换设计与验证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


时钟切换基本模型,本文围绕“ 基本组合电路切换、解决前毛刺切换、解决后毛刺切换”三方面完成时钟无缝切换。

FPGA(Verilog)时钟无缝切换设计与验证

一、组合逻辑 时钟切换

组合逻辑切换,本质就是二选一多路器

如下图,CLK_SEL 0与1分别控制时钟CLK_A CLK_B输出。
组合逻辑输出只跟当前输入状态有关,CLK_SEL异步不可控导致输出毛刺或不可控亚稳态。

FPGA(Verilog)时钟无缝切换设计与验证

二、时序逻辑 时钟切换

时序逻辑能够去除亚稳态以及毛刺,那么,我们把CLK_SEL同步到对应时钟时域,看能否解决问题。

1.代码部分

module glitch_free(
	CLK_A,
	CLK_B,
	RST_n,
	CLK_SEL,
	CLK_OUT
    );
	input CLK_A;
	input CLK_B;
	input RST_n;
	input CLK_SEL;
	
	output CLK_OUT;
	//sync clk_sel to clka and clkb
	reg sync_sel_a;
	reg sync_sel_b;
always @(posedge CLK_A or negedge RST_n)
	if(!RST_n)
		sync_sel_a<=1'b1;
	else
		sync_sel_a<=CLK_SEL;

//sync clk_sel to clka and clkb

always @(posedge CLK_B or negedge RST_n)
	if(!RST_n)
		sync_sel_b<=1'b0;
	else
		sync_sel_b<=~CLK_SEL;

assign CLK_OUT=(CLK_A&&sync_sel_a)||(CLK_B&&sync_sel_b);
endmodule

2.分析 综合 打开RTL视图
vivado TCL命令框分步输入如下命令,并回车,得到如下图。
1.reset_run synth_1
2.launch_runs synth_1 -jobs 4
3.synth_design -rtl -name rtl_1

FPGA(Verilog)时钟无缝切换设计与验证
3.仿真(tb代码见第五部分)
如下图所示,显然,此方法不能满足设计要求。这是为什么呢?

(仔细看,这里很多网络教程都讲的不是清楚)

原因:
尽快clk_sel信号发生跳变,但是有如下两点需要注意。
1.clk_sel信号同步到clka,会有一拍延迟。即sync_sel_a 信号延迟一拍
2.clk_sel信号同步到clkb,会有一拍延迟。即sync_sel_b 信号延迟一拍
因此 当进行切换时候可能存在上一个时钟状态sync_sel_x仍然有效或sync_sel_a和sync_sel_b同时有效(只有下一个时钟周期才能稳定输出符合设计的波形)。
assign CLK_OUT=(CLK_A&&sync_sel_a)||(CLK_B&&sync_sel_b);
解惑:
clk_sel同步到两个时钟域,都需要打一拍延迟。此拍虽然解决了组合逻辑引起的毛刺和亚稳态,但是打拍延迟却导致了新的毛刺。
FPGA(Verilog)时钟无缝切换设计与验证

三、反馈电路 时钟切换

解决双时钟选择信号同时有效,确保同一时刻只有一个时钟能够被选择输出。

1.代码部分

module glitch_free(
	CLK_A,
	CLK_B,
	RST_n,
	CLK_SEL,
	CLK_OUT
    );
	input CLK_A;
	input CLK_B;
	input RST_n;
	input CLK_SEL;
	
	output CLK_OUT;
	reg negedge_sel_a;
	reg sync_sel_a;
	reg negedge_sel_b;
	reg sync_sel_b;
	
//sync clk_sel to clka and clkb

always @(posedge CLK_A or negedge RST_n)
	if(!RST_n)
		sync_sel_a<=1'b1;
	else
		sync_sel_a<=CLK_SEL&&(~negedge_sel_b);

//sync clk_sel to clka and clkb

always @(posedge CLK_B or negedge RST_n)
	if(!RST_n)
		sync_sel_b<=1'b0;
	else
		sync_sel_b<=(~CLK_SEL&&(~negedge_sel_a));

//gen negedge control

always @(negedge CLK_A or negedge RST_n)
	if(!RST_n)
		negedge_sel_a<=1'b1;
	else
		negedge_sel_a<=sync_sel_a;

//gen negedge control

always @(negedge CLK_B or negedge RST_n)
	if(!RST_n)
		negedge_sel_b<=1'b0;
	else
		negedge_sel_b<=sync_sel_b;



assign CLK_OUT=(CLK_A&&negedge_sel_a)||(CLK_B&&negedge_sel_b); 

endmodule

2.分析 综合 打开RTL视图
vivado TCL命令框分步输入如下命令,并回车,得到如下图。
1.reset_run synth_1
2.launch_runs synth_1 -jobs 4
3.synth_design -rtl -name rtl_1
FPGA(Verilog)时钟无缝切换设计与验证
3.仿真(tb代码见第五部分)
如下图所示,显然,此方法能满足设计要求。这又是为什么呢?
FPGA(Verilog)时钟无缝切换设计与验证

(仔细看重点解释)

当前时钟在下降沿时候关闭,并且反馈到待切换时钟域,待切换时钟域在下降沿开启输出。就是我关了,告诉你之后,你才可以开。我不管,且不通知你开,你永远没机会开。

四、时钟切换 总结

同时钟域,可采用vivado 源语 BUFGMUX等切换。
本节针对时钟速率不高 异步 同步 时域切换。
同时,教会大家如何使用反馈信号。文章来源地址https://www.toymoban.com/news/detail-409811.html

五、仿真代码(例程通用)

module glitch_free_tb();

	reg clka;
	reg clkb;
	reg rst_n;
	reg sel;
	wire clk_out;

glitch_free glitch_reg(
	.CLK_A(clka),
	.CLK_B(clkb),
	.RST_n(rst_n),
	.CLK_SEL(sel),
	.CLK_OUT(clk_out)
    );

initial begin 
	clka=1;
	clkb=1;
	end

	wire clk;
	always #3000 clka=~clka;
	always #2800 clkb=~clkb;

initial begin 
	rst_n=0;
	#1001_00;
	rst_n=1;
	sel=1;
	#1001_00;
	sel=0;
	#1001_00;
	sel=1;
	#1001_00;
	sel=0;
	#1000_00;
	$stop;
end

	
endmodule

到了这里,关于FPGA(Verilog)时钟无缝切换设计与验证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于vivado(语言Verilog)的FPGA学习(5)——跨时钟处理

    慢时钟到快时钟一般都不需要处理,关键需要解决从快时钟到慢时钟的问题,因为可能会漏信号或者失真,比如: 第一种办法是开环解决方案,也就是人为设置目标信号脉宽大于1.5倍的周期。但是容易和设计要求冲突 所以第二个大方法是闭环解决方案,也就是从改善同步方

    2024年02月03日
    浏览(37)
  • Verilog语言fpga小脚丫数字时钟(整点报时,调时,显示秒钟等功能)

    学弟加油!                                                                       ———来自科大焯人 最近刚好学习了数电有关知识,就做了这个项目(闹钟过于繁琐就没有做了) 希望给还在学习的大伙一点参考,完整代码在最后 在这里先附上两串代码分别是d

    2024年02月07日
    浏览(37)
  • 【数字IC精品文章收录】近500篇文章|学习路线|基础知识|接口|总线|脚本语言|芯片求职|安全|EDA|工具|低功耗设计|Verilog|低功耗|STA|设计|验证|FPGA|架构|AMBA|书籍|

    1.1 索引目的 本篇索引旨在 收藏CSDN全站中有关数字IC领域高价值文章 ,在数字芯片领域中,就算将架构,设计,验证,DFT,后端诸多岗位加在一起的数量,都不及软件类一个细分方向的岗位数量多,反映在社区氛围或是开源资料的丰富度而言,数字IC领域相较于软件/互联网领

    2024年02月03日
    浏览(107)
  • FPGA实验报告 Verilog HDL:7人表决器 巴克码信号发生器 FPGA数字时钟

    写在前面:本文提供以下三个任务的思路讲解和代码实现, 如需参考引脚配置说明,可以点击下方链接跳转查看完整实验报告 ;本实验使用的是Altera公司的cycloneⅢ类型的芯片。 Verilog HDL实现:7人表决器 信号发生器 多功能数字时钟 实验目标:实现7人投票表决电路,支持人

    2024年02月05日
    浏览(37)
  • FPGA小脚丫开发板实现数字时钟,具备调时、整点报时、闹钟功能(含verilog代码)

    一、实现功能 1. 能正常完成时钟的时、分、秒走时; 2. 使用 LED 闪烁或者改变颜色等方式实现秒的指示,要求闪烁频率或者颜色切换频率为 1Hz ; 3. 使用两位七段数码管显示时和分,其切换方式为:默认显示“分钟”,按住 K4 键显示“小时”,按下 K3 显示秒针; 4. 关上开关

    2024年02月11日
    浏览(42)
  • 电子时钟设计(verilog实现)

    Quartus编程实现时钟,具有基本的时间显示功能(00:00:00~23:59:59),以及其他附加功能:调整时间,设置闹铃,或者其它与时钟相关的功能。Modelsim实现仿真。 设计代码: 仿真代码: 仿真结果: //时钟模块    从仿真图中看出,当使能端口en为低电平时,时钟暂停工作,当en为高

    2024年02月11日
    浏览(35)
  • Verilog设计数字时钟

    目录 一、设计要求 二、模块总和 三、模块设计 1.顶层模块 2.秒分频模块 3.秒计数模块 4.分钟分频模块 5.分钟计数模块 6.小时分频模块 7.小时计数模块 8.数据分配数码管模块 9.数码管显示模块 10.管脚约束代码 四、引脚分配 1.利用 NEXYS4 DDR 开发板设计一款数字时钟,能够正确

    2024年02月06日
    浏览(31)
  • Verilog 时钟分频设计

    将触发器的反向输出端接到触发器的输入,可以构成简单二分频电路。 在此基础上,将二分频电路进行级联可以构成四分频,八分频电路。电路如下图所示:   对于任意偶数分频,或者系数较大的偶数分频,可以使用计数器循环计数来实现分频。当计数周期达到N/2(N为分频

    2024年02月11日
    浏览(35)
  • 【FPGA教程案例98】数据处理1——基于FPGA的数据线性插值verilog实现,MATAB辅助验证

    FPGA教程目录 MATLAB教程目录 ---------------------------------------- 目录 1.软件版本 2.数据线性插值原理 3.数据线性插值的matlab仿真

    2023年04月09日
    浏览(29)
  • 时钟分频电路设计--verilog(2分频、3分频、4分频)

    module divider( input clk, input resetn, output reg clk_d2, output reg clk_d3_pos, output reg clk_d3_neg, output clk_d3, //reg型不能assign赋值? output reg clk_d4 ); reg [1:0]counter; reg [1:0]counter_3; always@(posedge clk or negedge resetn)begin //4分频计数器模块 if(~resetn) counter = 2’b0; else if(counter = 2’b11) counter = counter + 1’

    2024年02月06日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包