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
热门推荐
2025全球最安全旅游国家榜单出炉 澳大利亚大幅跃升排名第二
国考公务员报名流程详解
二手房没有发票怎么提取公积金
兰州到贵州贵阳七日游:费用预算、路线规划及自驾游攻略
I类手术切口医院感染的预防与控制
层流洁净手术室与手术部位感染的预防:效果究竟如何?
马来西亚新山到新加坡多少距离合适吗为什么(马来西亚新山离槟城有多远)
清朝选皇后的标准与程序——身份、资历与太子正妃的转变
2025年算力行业分析:政策引领产业突破
吉他选购指南之——吉他琴体材质
如何在音乐课中进行识谱教学反思
如何用C语言实现继承
孕妇可以吃韭菜馅饺子吗?营养师给出专业建议
Kotlin环境搭建指南
怎么排除类风湿关节炎
如何正确调整气囊减震?这种调整对车辆舒适性有何影响?
左心衰的临床表现是
哈医大二院:MDT团队多学科规范诊治慢性意识障碍疾病
如何有效实施员工绩效管理,提升企业生产力?
ABB机器人IF指令使用详解:从基础语法到实际应用
晚上牙痛睡不着怎么办
防盗门价格全解析:从材质到功能,选购指南一文掌握
还记得60年前的三线建设吗?这次伟大的专业转移战略将再次出现
正态分布在数据分析中的应用
中药材巴戟天的繁殖方法
用Notion搭建人生操作系统
乌龟可以吃鱼饲料吗?专家解答喂养疑惑
磁盘存储简介
第六届城市文学学术年会:开拓城市新表达,推进城市文学研究范式更新
唐朝前期,经济为何能繁荣发展?统治者采取哪些政策措施?