iCEstick + yosys - 使用全局设置/重置(GSR)

时间:2016-06-25 16:54:01

标签: fpga yosys

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

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

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

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

ice40 family data sheet和莱迪思网站上,我找到了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和硬件缺乏经验,所以我的整个方法完全有可能存在缺陷。

1 个答案:

答案 0 :(得分:4)

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

此外,我使用格子工具构建了以下两个设计,并且除了&#34;注释字段中的时间戳&#34;生成的比特流文件,生成的比特流是相同的! (这个测试是用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信号。不幸的是&#34; iCE40 sysCLOCK PLL设计和使用指南&#34;没有说明生成的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原语)显式路由重置信号,但使用IceStorm流程,arachne-pnr将自动路由设置/重置信号(当如果全球网络可用,则在全球网络中使用的不仅仅是几个FF。