Lattice ICE40LP8K开发

一、开发工具:

ICEcube2,界面非常原始,只有PLL IP核添加功能,其他IP核貌似只能使用primitive替换。

不支持时序分析、在线仿真等功能。

二、原语使用

  1. 全局布线资源

在 iCE40 FPGA 设备中,有 8 个高驱动缓冲器,称为全局缓冲器(Global Buffers,GBUFx),它们连接到 8 条低偏斜(low-skew)的全局线。全局缓冲器和全局线的主要设计目的是用于时钟分布,但也适用于其他高扇出信号,如复位(set/reset)和使能(enable)信号。

使用:

module top (
    input wire clk_in,    // 输入时钟信号
    output wire clk_out   // 输出经过全局缓冲器的时钟
);

    wire clk_gbuf;

    // 实例化全局缓冲器,将输入时钟连接到 GBUF0
    SB_GB gbuf_inst (
        .USER_SIGNAL_TO_GLOBAL_BUFFER(clk_in),  // 用户时钟信号输入
        .GLOBAL_BUFFER_OUTPUT(clk_gbuf)        // 全局缓冲器输出信号
    );

    assign clk_out = clk_gbuf;

endmodule
  1. 高速内部晶振原语

与ICE40UP系列不一样!ICE40LP8K内部没有高速晶振,只能从外部输入

ICE40UP使用内部高速晶振primitives:

//************ intern HSOSC SETTING*************************
 //   Name           Values          Description
    //  CLKHF_DIV   "0'b00" (default)   0'b00 = 48 MHz
    //              "0'b01"             0'b01 = 24 MHz
    //              "0'b10"             0'b10 = 12 MHz
    //              "0'b11"             0'b11 = 6 MHz
//    HSOSC
//        #(
//            .CLKHF_DIV ("0b00")
//        ) OSCInst0 (
//            .CLKHFEN (1'b1),
//            .CLKHFPU (1'b1),
//            .CLKHF (CLKHF)
//        );
  1. IO原语SB_IO

CS64中使用IOB原语接受PAD信号传递到内部逻辑,ICE40LP系列该原语进行了改动和精简。使用SB_IO 替换

    // 双向 I/O 使用 SB_IO 替代 BB_B
SB_IO  #(
    .PIN_TYPE (6'b101001),
    .PULLUP (1'b1)
)U_IBUF_MISO (
    .PACKAGE_PIN(SPI_MISO),          // Bidirectional pin
    .OUTPUT_ENABLE(s_IOL_D_PADDT),  // Tri-state control
    .D_OUT_0(s_IOL_D_PADDO),         // Output data (synchronized output)
    .D_IN_0()                        // Input data (if needed)
);

  1. ram使用 SB_RAMXX

替换ICE40UP中的ram ip核,(一个开发工具,连ram ip核都不提供....)

SB_RAM256x16 Spike_Threshold_DOWN_ram_16_256 (
    .RDATA(Spike_THR_L),                  // 读取数据输出
    .RADDR(Spike_THR_DOWN_CHANNEL),       // 读取地址
    .RCLK(clk),                           // 读取时钟
    .RCLKE(1'b1),                         // 读取时钟使能
    .RE(Spike_THR_DOWN_RD_EN),            // 读取使能
    .WADDR(spike_thr_shift_count - 1),    // 写入地址
    .WCLK(clk),                           // 写入时钟
    .WCLKE(1'b1),                         // 写入时钟使能
    .WE(ram_wr_en_thr_down),              // 写入使能
    .MASK(16'b0),                         // 写入掩码(不使用掩码)
    .WDATA(wr_spike_thr_L)                // 写入数据
);
  1. FIFO

将Radiant中生成的FIFO IP核的.v文件拉过来,在ICEcube2中可以直接使用,仿真也通过。(神奇,且无语)

    FIFO_I18D1024 U_TX_BUF(
                      .clk_i            ( SYS_CLK                       ),
                      .rst_i            ( ~sys_nRst | r_FIFO_RST[7]     ),
                      .wr_en_i          ( r_TX_BUF_WEN                  ),
                      .rd_en_i          ( r_TX_BUF_REN                  ),
                      .wr_data_i        ( {2'b0, r_TX_BUF_WDAT[15:0]}   ),
                      .full_o           ( s_TX_BUF_FULL                 ),
                      .empty_o          ( s_TX_BUF_EMPTY                ),
                      .data_cnt_o       ( s_data_cnt                    ),
                      .rd_data_o        ( s_TX_BUF_RDAT[15:0]           )
                  );
  1. PLL

PLL IP核可以在ICEcube中调用,但是实际使用中PLL的PLACE有着限制,即不是所有IO口输入的系统时钟信号都可以(也是很无语)。

手头只有ICE5LP系列(不是ICE40LP系列!),用的内部高速晶振,后面接PLL报错...

E2694: PLL: U_system_clk_nrst_setting.PLL_SYSCLK_inst.PLL_SYSCLK_inst could not be placed E2693: PLL placement is infeasible for the design E2055: Error while doing placement of the design

后面查了下,使用限制如下:(没有提到内部产生的时钟的使用限制)

但是好在关于内部高速晶振的描述:

B_HFOSC primitive generates 48 MHz nominal clock frequency within +/- 10% variation, with user-programmable divider value of 1, 2, 4, and 8. The HFOSC can drive either the global clock network or fabric routes directly based on the clock network selection.

好像可以直接作为系统时钟使用,因此,把HFSOC后面接个SB_GB就作为系统时钟了。

SB_HFOSC OSCInst0 (
.CLKHFEN(1'b1),
.CLKHFPU(1'b1),
.CLKHF(CLKHF)
);
defparam OSCInst0.CLKHF_DIV = "0b00";

//SB_GB inst***********************************   
     SB_GB sys_clk_gbuf_inst (
        .USER_SIGNAL_TO_GLOBAL_BUFFER(CLKHF),  // clk input
        .GLOBAL_BUFFER_OUTPUT(o_sys_clk)        // GBUF OUT
    );

三、Modelsim仿真

需要在modelsim中添加相应的ICE40LP系统的仿真库,

操作如下:

Click “Add Existing Files” and add the following files:

counter_sbt.v, sb_ice_syn.v, sb_ice_lc.v, counter_tb.vhd for Verilog post-route timing simulation

The sb_ice_syn.v, sb_ice_lc.v verilog files can be found in $INST_DIR/verilog.

If your design contains PLL, add ABIPTBS8.v in $INST_DIR/verilog.

If the design contains Hardened IP primitives, add the encrypted simulation library

sb_ice_ipenc_modelsim.v available in $INST_DIR/Verilog

添加后就可以在Modelsim中进行仿真了。

posted @ 2024-10-31 11:37  羊的第七章  阅读(14)  评论(0编辑  收藏  举报