1

我有一个关于我的 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在时钟周期内多次启用信号高电平,所以我不确定发生了什么。同样根据演示板手册,其他设备共享此信号,因此我必须在不使用时将其设置为高阻抗。如果有人能指出我正确的方向,或者向我解释,我会非常满意。谢谢 在此处输入图像描述

4

3 回答 3

2

我对 SPI 的理解是来自主机的 SCK 信号永远不会是三态的。不使用时可以连接低电平或高电平,但不应处于三态。事实上,主机不应将其任何 SPI 输出信号设为三态:SCK、CS_N、MOSI (SDO)。

根据评论更新:

这是使用 Spartan 3E 入门板的应用说明。第 4 页上写着:“SPI 总线信号(SDI、SDO 和 SCK)由板上的其他设备共享。在与放大器或 A/D 转换器通信时,禁用其他设备至关重要。”

于 2012-03-21T16:42:08.427 回答
1

只要您的设备始终是主设备,SPI 总线通常不应该是三态的。

通常,您通过片选引脚选择要与之通信的外围设备,并取消选择总线上的所有其他内容。然后,被取消选择的从外设将三态它们的输出 (MISO),因此它们不会干扰与所选外设的通信 - 可能是你读过的吗?

此外,您是在设计内部使用生成的时钟,还是直接将其路由到引脚?我对 Verilog(VHDL 用户本人)不太熟悉,但门控时钟通常是因为您正在对信号(在您的情况下为三态缓冲器)进行组合操作,然后将其用作时钟输入稍后翻转。

于 2012-03-23T21:44:35.690 回答
0

你的警告的来源

警告:PhysDesignRules:372 - 门控时钟。时钟网络 en_SCK_not0001 由组合引脚提供。这不是好的设计实践。使用 CE 引脚控制将数据加载到触发器中。

位于您的描述中:

assign SCK = (en_SCK) ? SCK_gen : 1'bz;

现代 FPGA 中的内部三态通常由多路复用器实现,多路复用器通过查看控制输入的不同组合来决定在公共总线中呈现哪些数据。

所以,你的assign语句是在推断一个多路复用器,即一个组合逻辑,这个多路复用器的输出到另一个内部模块的时钟管脚(换句话说,它在一个always @(posedge ......)块的灵敏度列表中使用

多从 SPI 方案(一个 SPI 主机和多个 SPI 从机)共享 SPI、MOSI 和 MISO 信号,因此无需将它们三态(除非我们谈论的是多主机方案,在这种情况下您宁愿实现两个时钟信号,每个方向相反)。

于 2014-10-29T01:34:43.080 回答