我有一个关于我的 FPGA 项目中发生的我不明白的事情的问题。我需要通过 SPI 总线控制两个设备(AGC 和 ADC)。由于 FPGA 将成为主设备,因此我通过划分系统时钟在代码中生成时钟信号SCK。然后我通过三态缓冲器将该信号路由到输出线。下面是我的相关代码。它没有显示,但控制三态缓冲区的信号en_SCK由 FSM 控制,当它在空闲状态下设置为低电平,然后在其余状态下设置为高电平。
output wire SDI
//for SCK_clock
reg SCK_gen, SCK_hold;
integer i;
reg en_SCK;
wire neg_edge_SCK;
//SCK_generator
always @(posedge clk)
begin
i <= i+1;
SCK_hold <= SCK_gen;
if(i == 10)
begin
SCK_gen <= ~SCK_gen;
i <= 0;
end
end
assign SCK = (en_SCK) ? SCK_gen : 1'bz;
当我实现设计时,我收到以下警告:
警告:PhysDesignRules:372 - 门控时钟。时钟网络 en_SCK_not0001 由组合引脚提供。这不是好的设计实践。使用 CE 引脚控制将数据加载到触发器中。
我还注意到我的时钟似乎非常扭曲。但是,如果我不在我的代码中使用三态设备并直接将时钟信号分配给输出线(如下面的代码所示),我会得到一个很好的干净时钟信号。
assign SCK = SCK_gen;
下面是没有三态缓冲器(左)和有三态缓冲器(右)的信号SCK的并排。我对 FPGA 和 Verilog 还很陌生,但我的理解是,使用这种分配代码风格意味着三态缓冲区,所以我很困惑为什么它似乎被解释为门控时钟源(XST 生成的示意图显示它是与门。我也对它如何扭曲时钟信号感到困惑。FSM 应该强制en_SCK在时钟周期内多次启用信号高电平,所以我不确定发生了什么。同样根据演示板手册,其他设备共享此信号,因此我必须在不使用时将其设置为高阻抗。如果有人能指出我正确的方向,或者向我解释,我会非常满意。谢谢