Verilog跨时钟域处理之脉冲同步电路详解
创作时间:
作者:
@小白创作中心
Verilog跨时钟域处理之脉冲同步电路详解
引用
CSDN
1.
https://m.blog.csdn.net/galaxyerkw/article/details/127619676
在数字电路设计中,跨时钟域处理是一个常见的挑战。本文将详细介绍如何使用Verilog实现脉冲同步电路,该电路能够将一个时钟域的脉冲信号准确地转换到另一个时钟域。
跨时钟域处理的概念
在数字电路设计中,跨时钟域处理是一个常见的挑战。当两个时钟域需要进行数据传输时,必须确保数据在目标时钟域中能够正确地被采样和处理。本文将详细介绍如何使用Verilog实现脉冲同步电路,该电路能够将一个时钟域的脉冲信号准确地转换到另一个时钟域。
脉冲同步电路的概念和框架
从A时钟域提取一个单时钟周期宽度脉冲,然后在新的时钟域B建立另一个单时钟宽度的脉冲。A时钟域的频率是B时钟域的10倍;A时钟域脉冲之间的间隔很大,无需考虑脉冲间隔太小的问题。
电路的接口如下图所示。data_in是脉冲输入信号,data_out是新的脉冲信号;clk_fast是A时钟域时钟信号,clk_slow是B时钟域时钟信号;rst_n是异步复位信号。
脉冲同步电路 解析和代码
本电路设计三个过程:
1. 脉冲输入时,将“脉冲信号转化为电平信号”:当检测到data_in拉高(持续一周期的脉冲),pulse_sig记录。
//脉冲信号转电平信号,参照快时钟
//检测到一个clk的脉冲,在pulse_sig记录一个1。
reg pulse_sig;
always@(posedge clk_fast or negedge rst_n)
begin
if(!rst_n) pulse_sig <= 0;
else pulse_sig <= (data_in) ? ~pulse_sig : pulse_sig;
end
2. clk_fast向clk_slow切换时,clk_slow打两拍作为缓冲。
//慢时钟打两拍
reg pulse_sig_clap_1;
reg pulse_sig_clap_2;
always@(posedge clk_slow or negedge rst_n)
begin
if(!rst_n) begin
pulse_sig_clap_1 <= 0;
pulse_sig_clap_2 <= 0;
end
else begin
pulse_sig_clap_1 <= pulse_sig;
pulse_sig_clap_2 <= pulse_sig_clap_1;
end
end
3. 输出端还原一次脉冲,即将“电平信号转化为脉冲信号”。
//电平信号转脉冲信号,参照慢时钟
reg pulse_sig_convert; //准备转化为脉冲输出的电平信号
always@(posedge clk_slow or negedge rst_n)
begin
if(!rst_n) pulse_sig_convert <= 0;
else pulse_sig_convert <= pulse_sig_clap_2;
end
/*
如果接收到脉冲,pulse_sig、接下来打两拍的触发器、准备转化的触发器内的值分别为:
100 0->010 0->001 0(输出脉冲)->000 1(输出脉冲)
*/
assign dataout = ( (!pulse_sig_convert && pulse_sig_clap_2) || (pulse_sig_convert && !pulse_sig_clap_2)) ? 1 : 0;
完整代码:
module pulse_detect(
input clk_fast ,
input clk_slow ,
input rst_n ,
input data_in ,
output dataout
);
//脉冲信号转电平信号,参照快时钟
//检测到一个clk的脉冲,在pulse_sig记录一个1。
reg pulse_sig;
always@(posedge clk_fast or negedge rst_n)
begin
if(!rst_n) pulse_sig <= 0;
else pulse_sig <= (data_in) ? ~pulse_sig : pulse_sig;
end
//慢时钟打两拍
reg pulse_sig_clap_1;
reg pulse_sig_clap_2;
always@(posedge clk_slow or negedge rst_n)
begin
if(!rst_n) begin
pulse_sig_clap_1 <= 0;
pulse_sig_clap_2 <= 0;
end
else begin
pulse_sig_clap_1 <= pulse_sig;
pulse_sig_clap_2 <= pulse_sig_clap_1;
end
end
//电平信号转脉冲信号,参照慢时钟
reg pulse_sig_convert; //准备转化为脉冲输出的电平信号
always@(posedge clk_slow or negedge rst_n)
begin
if(!rst_n) pulse_sig_convert <= 0;
else pulse_sig_convert <= pulse_sig_clap_2;
end
/*
如果接收到脉冲,pulse_sig、接下来打两拍的触发器、准备转化的触发器内的值分别为:
100 0->010 0->001 0(输出脉冲)->000 1(输出脉冲)
*/
assign dataout = ( (!pulse_sig_convert && pulse_sig_clap_2) || (pulse_sig_convert && !pulse_sig_clap_2)) ? 1 : 0;
endmodule
热门推荐
12部高分自然纪录片推荐!带孩子领略大自然的无尽魅力
必看!十大反诈电影教你避坑
详尽指南:如何填写及查询收款银行联行号,确保交易无误
社交媒体视域下文创产品的设计思路与可见性塑造研究
MATLAB常用绘图函数的使用
Workbench如何批量导入数据库
中国古典四大美女——花木兰、西施、王昭君、貂蝉(古代中国四大美女的传世之美)
王者荣耀年度总决赛在北京工体创下新纪录
螺旋与勾玉千年之约:羁绊之力!鸣人与佐助的救赎之路
律师视角:网络直播打赏背后的法律与道德困境
塔里木油田沙漠钻井一年创造20多项纪录
健身小贴士:力量训练后,这样拉伸,避免酸痛,加速恢复!
上海,科技企业和咖啡馆“双向奔赴”
香港故事丨水下文物 探古知今——在香港感知丝路精神
驾校市场分析指南:从需求到政策的全方位解析
【小白的大数据进阶之路】2024小白入门大数据,进阶成大牛,需要学习哪些技术?
武汉地铁19号线南延规划及开建情况分析
C++初学者指南第一步---1. C++开发环境设置
板栗的功效:解锁健康宝藏,探秘小小果实中的营养奇迹!
杭州未来科技城:以“新”促兴 向“质”而行
职场新人必看:如何高效解决职场问题?
走进画学:跨越审美障碍,拥抱艺术之美
小寒节气养生指南:四方面入手,养脾肾固本元
实习经历对个人职业发展有哪些具体的帮助
退赃是法定从轻的情节吗
在美国离婚了,财产怎么分?
美国离婚财产怎么分割?美国离婚财产分割需要多久?
扑克科学:探索博弈论与数学
为什么绿氢是一种可持续的燃料来源
无线网络优化:提升速度与覆盖的秘诀