题解 | 时钟切换(器件角度理解)
时钟切换
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输出的质量,因此和寄存输出相与,语义上也更为严格。