题解 | 时钟切换(器件角度理解)

时钟切换

https://www.nowcoder.com/practice/1de5e9bf749244cb8e5908626cc36d36

`timescale 1ns/1ns

module huawei6(
	input wire clk0  ,
	input wire clk1  ,
	input wire rst  ,
	input wire sel ,
	output reg clk_out
);
//*************code***********//
reg clk0_r,clk1_r;
always@(negedge clk0 or negedge rst) begin
	if(!rst) begin
		clk0_r<=0;
	end
	else begin
		clk0_r<=(~clk1_r)&(~sel);
	end
end
always@(negedge clk1 or negedge rst) begin
	if(!rst) begin
		clk1_r<=0;
	end
	else begin
		clk1_r<=(~clk0_r)&sel;
	end
end
always@(*) begin
	if(!rst) begin
		clk_out=0;
	end
	else begin
		clk_out=(clk0&clk0_r)|(clk1&clk1_r);
	end
end

//*************code***********//
endmodule

说一下自己从触发器的主从d锁存器组成的角度的看法吧:

考虑信号延迟发生在边沿之后,已知正沿触发dff主锁存器为低电平透明,从锁存器高电平透明;负沿触发dff主锁存器为高电平透明,从锁存器低电平透明。

假设时钟切换会产生高电平毛刺,这也是通常情况,那我们肯定是希望不要让这个毛刺影响到从锁存器的输出,因此很容易判断用的是负沿触发dff

然后考虑两条时钟路径的互斥性,那我们肯定是要保证毛刺概率更小,因此采用寄存互补输出端作为sel的辅助选通信号

最后我们要提高clk0和clk1输出的质量,因此和寄存输出相与,语义上也更为严格。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务