如何在时钟的上升沿和下降沿设置信号?
How to set a signal at both posedge and negedge of a clock?
我正在尝试实现一个控制器,该控制器具有发送与其输入时钟相同的时钟信号的功能。但如果需要,控制器也可以停止输出信号。我正在 Xilinx ISE 上实现它。
我的想法是:在输入时钟的下降沿,输出时钟信号设置为0。在输入时钟的上升沿,如果我想发出时钟,我将输出时钟设置为1 , 但如果我想停止输出时钟,我会将输出时钟设置为 0,这样其他设备(所有 posedge 触发的)就不会检测到 posedge。
这是我的设计:
module controller(
input clk_in,
input reset,
output clk_out
//and other ports
);
always @(negedge clk_in)
clk_out<=0;
always @(posedge clk_in)
if(reset)
clk_out<=1;
else
begin
case(cases)
case1:
begin
//do something and halt the output clock
clk_out<=0;
end
case2:
begin
//do something and continue the output clock
clk_out<=1;
end
endcase
end
当我综合设计时出现错误,指出信号 clk_out 连接到多个驱动器。有什么办法可以解决吗?
您有两个不同的 always 块,它们驱动相同的信号 clk_out。这就是综合告诉你的。可综合 rtl 中的所有信号必须仅由单个块驱动。
您似乎正在尝试创建某种类型的门控时钟。您可以使用一个简单的逻辑来完成检测时钟边缘的麻烦,而这很可能也无法合成:
always @*
clk_out = enable & clk_in;
你只需要弄清楚如何生成enable
。
顺便说一句,切勿使用 NBA (<=) 生成时钟信号,否则您最终会遇到 clock/data 竞争条件。
我正在尝试实现一个控制器,该控制器具有发送与其输入时钟相同的时钟信号的功能。但如果需要,控制器也可以停止输出信号。我正在 Xilinx ISE 上实现它。
我的想法是:在输入时钟的下降沿,输出时钟信号设置为0。在输入时钟的上升沿,如果我想发出时钟,我将输出时钟设置为1 , 但如果我想停止输出时钟,我会将输出时钟设置为 0,这样其他设备(所有 posedge 触发的)就不会检测到 posedge。
这是我的设计:
module controller(
input clk_in,
input reset,
output clk_out
//and other ports
);
always @(negedge clk_in)
clk_out<=0;
always @(posedge clk_in)
if(reset)
clk_out<=1;
else
begin
case(cases)
case1:
begin
//do something and halt the output clock
clk_out<=0;
end
case2:
begin
//do something and continue the output clock
clk_out<=1;
end
endcase
end
当我综合设计时出现错误,指出信号 clk_out 连接到多个驱动器。有什么办法可以解决吗?
您有两个不同的 always 块,它们驱动相同的信号 clk_out。这就是综合告诉你的。可综合 rtl 中的所有信号必须仅由单个块驱动。
您似乎正在尝试创建某种类型的门控时钟。您可以使用一个简单的逻辑来完成检测时钟边缘的麻烦,而这很可能也无法合成:
always @*
clk_out = enable & clk_in;
你只需要弄清楚如何生成enable
。
顺便说一句,切勿使用 NBA (<=) 生成时钟信号,否则您最终会遇到 clock/data 竞争条件。