我正在尝试实现一个控制器,该控制器具有发送与输入时钟相同的时钟信号的功能。但是,如果需要,控制器也可以停止输出信号。我正在Xilinx ISE上实现它。
我的想法是:在输入时钟的负沿,输出时钟信号设置为0。在输入时钟的后边缘,如果我想发送时钟,我会将输出时钟设置为1,但如果我想停止输出时钟,我会将输出时钟设置为0,这样其他设备(都是后边缘触发的)就不会检测到后边缘。
这是我的设计:
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连接到多个驱动器。有没有办法解决这个问题?
发布于 2020-08-06 21:17:13
你有两个不同的always块,它们驱动相同的信号clk_out。这就是合成告诉你的。可合成rtl中的所有信号必须仅从单个块驱动。
看起来您正在尝试创建某种类型的门控时钟。你可以使用一个简单的逻辑来检测时钟的负沿,而不是麻烦地检测时钟的负沿,这很可能也是不可综合的:
always @*
clk_out = enable & clk_in;您只需弄清楚如何生成enable。
顺便说一句,千万不要在生成时钟信号时使用NBAs (<=),否则最终会出现时钟/数据竞争情况。
https://stackoverflow.com/questions/63274426
复制相似问题