这可能是一个iCEstick问题,而不是yosys问题,但是由于我使用的是Icestorm工具链,所以在这里提出了问题。
我想指定设计的启动行为,互联网上的各个地方似乎都同意这种启动行为与通常命名的rst
信号有关。对于我来说,这种信号的来源并不明显,所以我深入研究了通电序列。当前的理解来自本文档中的图2 。
CDONE
器件将其拉高后,所有内部寄存器均已复位为某个初始值。现在,我已经找到了大量关于每种类型的触发器或硬IP如何接收复位信号并对其内部状态进行处理的点阵文档,但我仍然不太了解如何指定这些状态(或甚至只知道它们是什么,所以我可以使用它们)。
例如,如果我想在通电后(且仅在通电后)将LED高电平显示1秒钟,那么我想在此复位信号(无论它是什么)禁用后启动一个计数器。
在ice40系列数据表和Lattice站点上浏览时,我找到了有关使用Global Set / Reset信号的文档。我确认GSR
在系列数据表中对此进行了提及,该数据表在第2-3页的“时钟/控制分配网络”下引用。全局复位信号似乎可由全局缓冲器之一使用,GBUF[0-7]
并且可以通过全局/高扇出分配网络路由到所有LUT(最多4个)。
这似乎和我追求的完全一样,但是我找不到有关如何在设计中使用此信息的其他信息。有关使用GSR的文档指出,您可以像这样实例化本机GSR组件:
GSR GSR_INST (.GSR (<global reset sig>));
Run Code Online (Sandbox Code Playgroud)
但是我不能说这是否只是为了模拟。我在这里完全是朝错误的方向前进还是只是缺少一些东西?我对FPGA和硬件没有足够的经验,因此我的整个方法完全有缺陷。
我不确定该GSR文件是否实际上与iCE40有关。莱迪思iCEcube工具有趣地接受GSR单元的实例,但似乎只是将它们视为恒定的零驱动器。在iCE40 sim库中也没有针对GSR单元类型的仿真模型,在Lattice提供的iCE40技术库文档中也没有对此模型的描述。
此外,我已经使用晶格工具构建了以下两种设计,除了生成的比特流文件的“注释字段”中的时间戳之外,生成的比特流是相同的!(此测试是使用Lattice LSE作为综合工具而不是Synplify进行的。由于某种原因,我无法使Synplify在我的计算机上运行,并在一年多前放弃了这样做。)
这是我使用的第一个测试设计:
module top (
input clk,
output rst,
output reg val
);
always @(posedge clk, posedge rst)
if (rst)
val = 1;
else
val = 0;
GSR GSR_INST (.GSR (rst));
endmodule
Run Code Online (Sandbox Code Playgroud)
这是第二个测试设计:
module top (
input clk,
output rst,
output val
);
assign val = 0, rst = 0;
endmodule
Run Code Online (Sandbox Code Playgroud)
鉴于此结果,我认为可以肯定地说,晶格工具只是忽略了iCE40设计中的GSR单元。(也许是为了与其他FPGA系列兼容?)
那么,如何产生第一个信号呢?例如,以下是一个简单的重置生成器,resetn
它在前15个周期内置为有效(拉低):
input clk;
...
wire resetn;
reg [3:0] rststate = 0;
assign resetn = &rststate;
always @(posedge clk) rststate <= rststate + !resetn;
Run Code Online (Sandbox Code Playgroud)
(IceStorm流确实支持寄存器的任意初始化值,而晶格工具会忽略初始化值,只是将所有FF初始化为零。因此,如果您希望设计在工具之间可移植,建议仅将regs初始化为零。 )
如果使用的是PLL,则习惯上使用PLL LOCK
输出来驱动resetn
信号。不幸的是,“ iCE40 sysCLOCK PLL设计和使用指南”没有说明所生成的LOCK
信号是否已经与所生成的时钟同步,因此,将其与时钟同步以避免出现亚稳态问题是一个好主意:
wire clk, resetn, PLL_LOCKED;
reg [3:0] PLL_LOCKED_BUF;
...
SB_PLL40_PAD #( ... ) PLL_INST (
...
.PLLOUTGLOBAL(clk),
.LOCK(PLL_LOCKED)
);
always @(posedge clk)
PLL_LOCKED_BUF <= {PLL_LOCKED_BUF, PLL_LOCKED};
assign resetn = PLL_LOCKED_BUF[3];
Run Code Online (Sandbox Code Playgroud)
关于全局网络的使用:您可以通过全局网络(使用SB_GB
原语)显式地路由resetn信号,但是使用IceStorm流,arachne-pnr将自动路由一个设置/重置信号(当被多个FF使用时) )(如果有可用的全球网络)。