我对我的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 使能信号高达时钟周期的许多倍所以我不确定发生了什么。另外根据演示板手册,其他设备共享这个信号,所以我必须在不使用时将其设置为高阻抗。如果有人能指出我正确的方向,或解释它对我来说,我会非常满满的。谢谢
答案 0 :(得分:2)
我对SPI的理解是来自主设备的SCK信号从不是三态的。不使用时可以低或高,但不应该是三态。事实上,主机不应对其任何SPI输出信号进行三态:SCK,CS_N,MOSI(SDO)。
根据评论更新:
这是application note using the Spartan 3E starter board。在第4页上,它说:“SPI总线信号(SDI,SDO和SCK)由电路板上的其他器件共享。在与放大器或A / D转换器通信时禁用其他器件至关重要。”
答案 1 :(得分:1)
SPI总线通常不应处于三态,只要您的设备始终是主设备即可。
通常,您通过芯片选择引脚选择要与之通信的外设,并取消选择总线上的其他所有内容。取消选择的从属外设然后将其输出三态(MISO),因此它们不会干扰与所选外设的通信 - 这可能是你读过的吗?
另外,您是在设计中内部使用生成的时钟,还是直接将其路由到引脚?我不太熟悉Verilog(VHDL用户自己),但是门控时钟通常是因为你正在对信号进行组合操作(在你的情况下是三态缓冲器),然后用它作为时钟输入稍后翻转翻转。
答案 2 :(得分:0)
警告的来源
警告:PhysDesignRules:372 - 门控时钟。时钟网en_SCK_not0001是 由组合引脚提供。这不是好的设计实践。使用 CE引脚控制数据加载到触发器中。
位于您的说明中:
assign SCK = (en_SCK) ? SCK_gen : 1'bz;
现代FPGA中的内部三态通常由多路复用器实现,多路复用器通过查看控制输入的不同组合来决定在公共总线中呈现哪些数据。
因此,你的分配句子推断了一个多路复用器,即一个组合逻辑,这个多路复用器的输出转到另一个内部模块的clok引脚(换句话说,它在{的灵敏度列表中使用{1}}阻止
多从SPI方案(一个SPI主设备和多个SPI从设备)共享SPI,MOSI和MISO信号,因此无需将它们置于三态(除非我们讨论的是多主机方案,在这种情况下,您宁愿实现两个时钟信号,每个信号的方向相反)。