【问题标题】:iCEstick + yosys - using the Global Set/Reset (GSR)iCEstick + yosys - 使用全局设置/重置 (GSR)
【发布时间】:2016-06-25 16:54:00
【问题描述】:

这可能更像是一个 iCEstick 问题而不是一个 yosys 问题,但由于我使用的是 Icestorm 工具链,所以在这里问。

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

CDONE 被设备拉高后,所有内部寄存器都被重置为某个初始值。现在,我找到了大量关于每种类型的触发器或硬 IP 如何接收复位信号并对其内部状态进行操作的 lattice 文档,但我仍然不太明白我如何指定这些状态是什么(或甚至只知道它们是什么,以便我可以使用它们)。

例如,如果我想在通电后将 LED 拉高 1 秒(并且仅在通电后)我想在此复位信号(无论它是什么)禁用后启动一个计数器。

ice40 family data sheet 和 Lattice 网站上一探究竟,我找到了this document about using the Global Set/Reset signal。我确认此GSR 已在系列数据表中提及,在“时钟/控制分配网络”下的第 2-3 页中引用。全局复位信号似乎可由全局缓冲区GBUF[0-7] 之一使用,并且可以通过全局/高扇出分布网络路由(最多 4 个)到所有 LUT。

这似乎正是我所追求的,但我找不到任何其他关于如何在我的设计中使用它的信息。使用 GSR 的文档指出,您可以像这样实例化本机 GSR 组件:

GSR GSR_INST (.GSR (<global reset sig>));

但我不知道这是否只是为了模拟。我是完全走错了方向还是只是错过了什么?我对 FPGA 和硬件非常缺乏经验,所以我的整个方法完全有可能存在缺陷。

【问题讨论】:

    标签: fpga yosys


    【解决方案1】:

    我不确定 GSR 文件是否真的是关于 iCE40 的。 Lattice iCEcube 工具有趣地接受了 GSR 单元的实例,但它似乎只是将它们视为恒定的零驱动器。在 iCE40 sim 库中也没有 GSR 单元类型的仿真模型,在 Lattice 提供的 iCE40 技术库文档中也没有描述。

    此外,我用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 系列兼容?)

    那么如何产生第一个信号呢?例如,以下是一个简单的复位生成器,它在前 15 个周期置位(拉低)resetn

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

    (IceStorm 流程确实支持寄存器的任意初始化值,而 the lattice tools ignore the initialization value and simply initialize all FFs to zero。因此,如果您希望您的设计在工具之间可移植,建议仅将 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];
    

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

    【讨论】:

    • 太好了,现在清楚多了。我同意,GSR 搜索比 iCE 发现了更多关于 EPC3/5 系列的信息……检查 yosys 的网络列表对我来说更清楚,所以谢谢!我主要想要某种形式的双重检查初始寄存器值是正确的方法。谢谢阿金
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多