iCEstick + yosys - 使用全局置位/复位(GSR)

7
这可能更多是与iCEstick有关的问题,而不是yosys的问题,但我在这里提问,因为我正在使用Icestorm工具链。

我想指定我的设计的启动行为,互联网上的许多地方似乎都认为这与通常命名为rst信号有关。对于这样的信号来自哪里并不明显,因此我深入研究了上电序列。目前的理解来自this document中的图2。

CDONE被设备拉高后,所有内部寄存器都被重置为某个初始值。现在,我已经找到了大量关于每种触发器或硬件IP如何接收复位信号并对其内部状态执行某些操作的Lattice文档,但我仍然不太明白如何指定这些状态(甚至只是知道它们以便我可以使用它们)。
例如,如果我想在上电后将LED高电平保持1秒钟(仅在上电后),我希望在此复位信号(无论它是什么)禁用后启动一个计数器。

我在浏览ice40系列数据手册和Lattice网站时,发现了这篇关于使用全局设置/复位信号的文档。我确认了这个GSR在系列数据手册中被提到,在“时钟/控制分配网络”下的第2-3页有引用。似乎一个全局复位信号可以被一个全局缓冲器GBUF[0-7]使用,并且可以通过全局/高扇出分配网络路由(最多4个)到所有的LUT。

这似乎正是我需要的,但我找不到其他关于如何在我的设计中使用它的信息。使用GSR文档指出,您可以像这样实例化本机GSR组件:
GSR GSR_INST (.GSR (<global reset sig>));

但我无法确定这是否仅用于模拟。我是完全走错方向了还是遗漏了什么?由于我对FPGA和硬件非常缺乏经验,因此我的整个方法可能存在缺陷。

1个回答

9
我不确定GSR文档是否与iCE40有关。Lattice iCEcube工具可以接受GSR单元实例,但似乎只将它们视为常数零驱动器。此外,在iCE40 sim库中没有GSR单元类型的仿真模型,在由Lattice提供的iCE40 tech库文档中也没有对其进行描述。
此外,我使用Lattice工具构建了以下两个设计,并且除了生成的比特流文件的“注释字段”中的时间戳之外,它们是相同的!(此测试使用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

这是第二个测试设计:
module top (
    input clk,
    output rst,
    output val
);
    assign val = 0, rst = 0;
endmodule

鉴于这些结果,我认为可以说,在iCE40设计中,晶格工具简单地忽略了GSR单元。(也许是为了与其他FPGA系列兼容?)那么如何生成rst信号呢?例如,以下是一个简单的复位发生器,它在前15个时钟周期中断言(拉低)resetn:
input clk;
...

wire resetn;
reg [3:0] rststate = 0;
assign resetn = &rststate;
always @(posedge clk) rststate <= rststate + !resetn;

(The IceStorm流程支持对寄存器进行任意初始化值,而Lattice工具忽略初始化值,只将所有FF初始化为零。因此,如果您希望设计在工具之间具有可移植性,则建议仅将reg初始化为零。)
(如果您正在使用PLL,则通常会使用PLL LOCK输出驱动resetn信号。不幸的是,"iCE40 sysCLOCK PLL Design and Usage Guide"没有说明生成的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];

关于全局网络的使用:您可以通过使用SB_GB原语显式地将resetn信号路由到全局网络上,但是在使用IceStorm流程时,如果存在全局网络,arachne-pnr会自动将设置/重置信号(当被超过几个FF使用时)路由到全局网络上。


2
非常好,现在清晰多了。我同意,GSR搜索结果显示EPC3/5系列比iCE更多...通过检查yosys的网络列表,我对此有了更深入的了解,所以谢谢你!我主要想要一些双重确认,即初始寄存器值是正确的方法。再次感谢。 - Myles Hathcock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接