【发布时间】:2014-09-05 14:25:37
【问题描述】:
我在http://www.vlsi-world.com/content/view/64/47/1/1/找到了这个时钟多路复用器设计
作者声称它是安全的,但我认为如果时钟信号到各个或门(or_three,or_four)的路由延迟大于路由延迟+时钟输出,它仍然可能存在故障当 q3/q4 的输出变低时,延迟 q3/q4 到或门。为了避免这些毛刺,q3/q4 的输出必须在时钟的上升沿变为高电平,在时钟的下降沿变为低电平。我在这个评估中是否正确?
另请注意,我链接的页面上的示意图与 verilog 不完全匹配(verilog 中未使用 q3 的 qbar 输出),并且用于生成模拟的测试台转置了 clk_a 和 clk_b。
`timescale 1ns/100ps
module clk_switch (
// Outputs
out_clk,
// Inputs
clk_a, clk_b, select
);
input clk_a;
input clk_b;
input select;
output out_clk;
wire out_clk;
reg q1,q2,q3,q4;
wire or_one, or_two,or_three,or_four;
always @ (posedge clk_a)
begin
if (clk_a == 1'b1)
begin
q1 <= q4;
q3 <= or_one;
end
end
always @ (posedge clk_b)
begin
if (clk_b == 1'b1)
begin
q2 <= q3;
q4 <= or_two;
end
end
assign or_one = (!q1) | (!select);
assign or_two = (!q2) | (select);
assign or_three = (q3) | (clk_a);
assign or_four = (q4) | (clk_b);
assign out_clk = or_three & or_four;
endmodule
我用 VHDL 编写了一个快速翻译,因此更熟悉该语言的聪明人将能够检查它,并且没有人会对这里的 VHDL 标签提出问题。
entity clk_switch is
port(
out_clk : out std_logic;
clk_a : in std_logic;
clk_b : in std_logic;
sel : in std_logic;
);
end clk_switch;
architecture rtl of clk_switch is
signal q1 : std_logic;
signal q2 : std_logic;
signal q3 : std_logic;
signal q4 : std_logic;
signal or_one : std_logic;
signal or_two : std_logic;
signal or_three : std_logic;
signal or_four : std_logic;
begin
process(clk_a)
begin
if (clk_a'event and clk_a='1') then
q1 <= q4;
q3 <= or_one;
end if;
end process;
process(clk_b)
begin
if (clk_b'event and clk_b='1') then
q2 <= q3;
q4 <= or_two;
end if;
end process;
or_one <= not q1 or not sel;
or_two <= not q2 or sel;
or_three <= q3 or clk_a;
or_four <= q4 or clk_b;
out_clk <= or_three and or_four;
end rtl;
【问题讨论】:
-
这部分对我来说很奇怪
always @ (posedge clk_a) if (clk_a == 1'b1),因为 posedge 只会在clk_a==1'b1时触发,所以这似乎是一个多余的语句,我认为它不会可靠地改变综合的输出(不同的工具可以处理它不同,即添加多路复用器/忽略它)。 -
从
select到or_two和q4的亚稳态路径需要在clk_b的高波特率期间进行q4 亚稳态恢复。对于not select到or_one和q2也是如此,这两种情况都适用于select上的任意开关。这是时钟速度限制,可能的触发器速度的一半减去or_one或or_two门和布线延迟,以允许亚稳态恢复。克服速度限制需要更长的无时钟周期(更多触发器,重新计时select)。 -
是的,我注意到了亚稳态问题,但是假设 select 满足活动时钟的设置/保持(它实际上改变了 or_one/or_two 值的那个)会导致故障吗?我想是的,但我不是 100% 确定。
-
门控'关闭' thru
or_three或or_four在相应时钟为高电平时发生,新时钟在高电平时启用。or_three和or_fourDe Morgan 等效与门。out_clkDe Morgan OR 门产品。在亚稳态恢复施加的触发器速度限制内,它应该是无故障的。每个时钟依赖于另一个时钟在启用之前被禁用。