Lattice ICE40LP8K开发
一、开发工具:
ICEcube2,界面非常原始,只有PLL IP核添加功能,其他IP核貌似只能使用primitive替换。
不支持时序分析、在线仿真等功能。
二、原语使用
-
全局布线资源
在 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
-
高速内部晶振原语
与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)
// );
-
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)
);
-
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) // 写入数据
);
-
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] )
);
-
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中进行仿真了。