【Verilog】跨时钟域处理(二)——脉冲同步电路

跨时钟域处理的概念

详见:【Verilog】跨时钟域处理(一)——多bit MUX同步


脉冲同步电路的概念和框架

在这里插入图片描述
从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
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
时钟处理格雷码是指在不同时钟之间进行格雷码的转换和处理Verilog语言提供了一些机制来实现这样的时钟处理。 首先,Verilog中可以使用时钟使能(clock enable)来控制时钟切换时的格雷码转换。通过将格雷码生成逻辑放置在与时钟同步时钟中,然后通过时钟使能来控制格雷码转换的触发。例如,当时钟使能信号为高电平时,才允许进行格雷码转换。这样可以确保在不同的时钟之间进行同步的格雷码处理。 其次,Verilog中也可以使用寄存器来存储并传递格雷码数据。在不同的时钟之间,可以使用寄存器来进行数据的缓存和同步。通过在时钟切换的边缘上,将新的格雷码数据写入到寄存器中,并在另一个时钟的相应边缘上,将寄存器中的格雷码数据读取出来。这样可以确保在时钟处理过程中,数据传递的正确性和可靠性。 最后,需要注意时钟处理的时延问题。由于不同时钟之间存在时钟延迟,因此需要合理的时序设计来保证时钟处理的正确性。可以使用合适的时钟切换信号和时钟边缘触发机制,来确保时序的正确性和时延的合理性。 总而言之,通过合理的时钟使能控制、寄存器存储和时序设计,可以实现时钟处理格雷码的Verilog设计。这样可以确保在不同的时钟之间进行格雷码转换和处理的正确性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值