HITDAQ/FPGA_firmware/q_sys/synthesis/submodules/altera_onchip_flash.v
2024-10-11 14:49:54 +02:00

332 lines
11 KiB
Verilog

// (C) 2001-2019 Intel Corporation. All rights reserved.
// Your use of Intel Corporation's design tools, logic functions and other
// software and tools, and its AMPP partner logic functions, and any output
// files from any of the foregoing (including device programming or simulation
// files), and any associated documentation or information are expressly subject
// to the terms and conditions of the Intel Program License Subscription
// Agreement, Intel FPGA IP License Agreement, or other applicable
// license agreement, including, without limitation, that your use is for the
// sole purpose of programming logic devices manufactured by Intel and sold by
// Intel or its authorized distributors. Please refer to the applicable
// agreement for further details.
////////////////////////////////////////////////////////////////////
//
// ALTERA_ONCHIP_FLASH
//
// Copyright (C) 1991-2013 Altera Corporation
// Your use of Altera Corporation's design tools, logic functions
// and other software and tools, and its AMPP partner logic
// functions, and any output files from any of the foregoing
// (including device programming or simulation files), and any
// associated documentation or information are expressly subject
// to the terms and conditions of the Altera Program License
// Subscription Agreement, Altera MegaCore Function License
// Agreement, or other applicable license agreement, including,
// without limitation, that your use is for the sole purpose of
// programming logic devices manufactured by Altera and sold by
// Altera or its authorized distributors. Please refer to the
// applicable agreement for further details.
//
////////////////////////////////////////////////////////////////////
// synthesis VERILOG_INPUT_VERSION VERILOG_2001
`timescale 1 ps / 1 ps
module altera_onchip_flash (
// To/From System
clock,
reset_n,
// To/From Avalon_MM data slave interface
avmm_data_read,
avmm_data_write,
avmm_data_addr,
avmm_data_writedata,
avmm_data_burstcount,
avmm_data_waitrequest,
avmm_data_readdatavalid,
avmm_data_readdata,
// To/From Avalon_MM csr slave interface
avmm_csr_read,
avmm_csr_write,
avmm_csr_addr,
avmm_csr_writedata,
avmm_csr_readdata
);
parameter DEVICE_FAMILY = "MAX 10";
parameter PART_NAME = "Unknown";
parameter IS_DUAL_BOOT = "False";
parameter IS_ERAM_SKIP = "False";
parameter IS_COMPRESSED_IMAGE = "False";
parameter INIT_FILENAME = "";
// simulation only start
parameter DEVICE_ID = "08";
parameter INIT_FILENAME_SIM = "";
// simulation only end
parameter PARALLEL_MODE = 0;
parameter READ_AND_WRITE_MODE = 0;
parameter WRAPPING_BURST_MODE = 0;
parameter AVMM_CSR_DATA_WIDTH = 32;
parameter AVMM_DATA_DATA_WIDTH = 32;
parameter AVMM_DATA_ADDR_WIDTH = 20;
parameter AVMM_DATA_BURSTCOUNT_WIDTH = 13;
parameter FLASH_DATA_WIDTH = 32;
parameter FLASH_ADDR_WIDTH = 23;
parameter FLASH_SEQ_READ_DATA_COUNT = 2; //number of 32-bit data per sequential read. only need in parallel mode.
parameter FLASH_READ_CYCLE_MAX_INDEX = 3; //period to for each sequential read. only need in parallel mode.
parameter FLASH_ADDR_ALIGNMENT_BITS = 1; //number of last addr bits for alignment. only need in parallel mode.
parameter FLASH_RESET_CYCLE_MAX_INDEX = 28; //period that required by flash before back to idle for erase and program operation
parameter FLASH_BUSY_TIMEOUT_CYCLE_MAX_INDEX = 112; //flash busy timeout period (960ns)
parameter FLASH_ERASE_TIMEOUT_CYCLE_MAX_INDEX = 40603248; //erase timeout period (350ms)
parameter FLASH_WRITE_TIMEOUT_CYCLE_MAX_INDEX = 35382; //write timeout period (305us)
parameter MIN_VALID_ADDR = 1;
parameter MAX_VALID_ADDR = 1;
parameter MIN_UFM_VALID_ADDR = 1;
parameter MAX_UFM_VALID_ADDR = 1;
parameter SECTOR1_START_ADDR = 1;
parameter SECTOR1_END_ADDR = 1;
parameter SECTOR2_START_ADDR = 1;
parameter SECTOR2_END_ADDR = 1;
parameter SECTOR3_START_ADDR = 1;
parameter SECTOR3_END_ADDR = 1;
parameter SECTOR4_START_ADDR = 1;
parameter SECTOR4_END_ADDR = 1;
parameter SECTOR5_START_ADDR = 1;
parameter SECTOR5_END_ADDR = 1;
parameter SECTOR_READ_PROTECTION_MODE = 5'b11111;
parameter SECTOR1_MAP = 1;
parameter SECTOR2_MAP = 1;
parameter SECTOR3_MAP = 1;
parameter SECTOR4_MAP = 1;
parameter SECTOR5_MAP = 1;
parameter ADDR_RANGE1_END_ADDR = 1;
parameter ADDR_RANGE2_END_ADDR = 1;
parameter ADDR_RANGE1_OFFSET = 1;
parameter ADDR_RANGE2_OFFSET = 1;
parameter ADDR_RANGE3_OFFSET = 1;
// To/From System
input clock;
input reset_n;
// To/From Avalon_MM data slave interface
input avmm_data_read;
input avmm_data_write;
input [AVMM_DATA_ADDR_WIDTH-1:0] avmm_data_addr;
input [AVMM_DATA_DATA_WIDTH-1:0] avmm_data_writedata;
input [AVMM_DATA_BURSTCOUNT_WIDTH-1:0] avmm_data_burstcount;
output avmm_data_waitrequest;
output avmm_data_readdatavalid;
output [AVMM_DATA_DATA_WIDTH-1:0] avmm_data_readdata;
// To/From Avalon_MM csr slave interface
input avmm_csr_read;
input avmm_csr_write;
input avmm_csr_addr;
input [AVMM_CSR_DATA_WIDTH-1:0] avmm_csr_writedata;
output [AVMM_CSR_DATA_WIDTH-1:0] avmm_csr_readdata;
wire [AVMM_DATA_DATA_WIDTH-1:0] avmm_data_readdata_wire;
wire [AVMM_CSR_DATA_WIDTH-1:0] avmm_csr_readdata_wire;
wire [31:0] csr_control_wire;
wire [9:0] csr_status_wire;
wire [FLASH_ADDR_WIDTH-1:0] flash_ardin_wire;
wire [FLASH_DATA_WIDTH-1:0] flash_drdout_wire;
wire flash_busy;
wire flash_se_pass;
wire flash_sp_pass;
wire flash_osc;
wire flash_xe_ye;
wire flash_se;
wire flash_arclk;
wire flash_arshft;
wire flash_drclk;
wire flash_drshft;
wire flash_drdin;
wire flash_nprogram;
wire flash_nerase;
wire flash_par_en;
wire flash_xe_ye_wire;
wire flash_se_wire;
assign avmm_data_readdata = avmm_data_readdata_wire;
generate
if (READ_AND_WRITE_MODE == 0) begin
assign avmm_csr_readdata = 32'hffffffff;
assign csr_control_wire = 32'h3fffffff;
end
else begin
assign avmm_csr_readdata = avmm_csr_readdata_wire;
end
endgenerate
generate
if (DEVICE_ID == "02" || DEVICE_ID == "01") begin
assign flash_par_en = 1'b1;
assign flash_xe_ye = 1'b1;
assign flash_se = 1'b1;
end
else begin
assign flash_par_en = PARALLEL_MODE[0];
assign flash_xe_ye = flash_xe_ye_wire;
assign flash_se = flash_se_wire;
end
endgenerate
generate
if (READ_AND_WRITE_MODE) begin
// -------------------------------------------------------------------
// Instantiate a Avalon_MM csr slave controller
// -------------------------------------------------------------------
altera_onchip_flash_avmm_csr_controller avmm_csr_controller (
// To/From System
.clock(clock),
.reset_n(reset_n),
// To/From Avalon_MM csr slave interface
.avmm_read(avmm_csr_read),
.avmm_write(avmm_csr_write),
.avmm_addr(avmm_csr_addr),
.avmm_writedata(avmm_csr_writedata),
.avmm_readdata(avmm_csr_readdata_wire),
// To/From Avalon_MM data slave interface
.csr_control(csr_control_wire),
.csr_status(csr_status_wire)
);
end
endgenerate
// -------------------------------------------------------------------
// Instantiate a Avalon_MM data slave controller
// -------------------------------------------------------------------
altera_onchip_flash_avmm_data_controller # (
.READ_AND_WRITE_MODE (READ_AND_WRITE_MODE),
.WRAPPING_BURST_MODE (WRAPPING_BURST_MODE),
.AVMM_DATA_ADDR_WIDTH (AVMM_DATA_ADDR_WIDTH),
.AVMM_DATA_BURSTCOUNT_WIDTH (AVMM_DATA_BURSTCOUNT_WIDTH),
.FLASH_SEQ_READ_DATA_COUNT (FLASH_SEQ_READ_DATA_COUNT),
.FLASH_READ_CYCLE_MAX_INDEX (FLASH_READ_CYCLE_MAX_INDEX),
.FLASH_ADDR_ALIGNMENT_BITS (FLASH_ADDR_ALIGNMENT_BITS),
.FLASH_RESET_CYCLE_MAX_INDEX (FLASH_RESET_CYCLE_MAX_INDEX),
.FLASH_BUSY_TIMEOUT_CYCLE_MAX_INDEX (FLASH_BUSY_TIMEOUT_CYCLE_MAX_INDEX),
.FLASH_ERASE_TIMEOUT_CYCLE_MAX_INDEX (FLASH_ERASE_TIMEOUT_CYCLE_MAX_INDEX),
.FLASH_WRITE_TIMEOUT_CYCLE_MAX_INDEX (FLASH_WRITE_TIMEOUT_CYCLE_MAX_INDEX),
.MIN_VALID_ADDR (MIN_VALID_ADDR),
.MAX_VALID_ADDR (MAX_VALID_ADDR),
.SECTOR1_START_ADDR (SECTOR1_START_ADDR),
.SECTOR1_END_ADDR (SECTOR1_END_ADDR),
.SECTOR2_START_ADDR (SECTOR2_START_ADDR),
.SECTOR2_END_ADDR (SECTOR2_END_ADDR),
.SECTOR3_START_ADDR (SECTOR3_START_ADDR),
.SECTOR3_END_ADDR (SECTOR3_END_ADDR),
.SECTOR4_START_ADDR (SECTOR4_START_ADDR),
.SECTOR4_END_ADDR (SECTOR4_END_ADDR),
.SECTOR5_START_ADDR (SECTOR5_START_ADDR),
.SECTOR5_END_ADDR (SECTOR5_END_ADDR),
.SECTOR_READ_PROTECTION_MODE (SECTOR_READ_PROTECTION_MODE),
.SECTOR1_MAP (SECTOR1_MAP),
.SECTOR2_MAP (SECTOR2_MAP),
.SECTOR3_MAP (SECTOR3_MAP),
.SECTOR4_MAP (SECTOR4_MAP),
.SECTOR5_MAP (SECTOR5_MAP),
.ADDR_RANGE1_END_ADDR (ADDR_RANGE1_END_ADDR),
.ADDR_RANGE2_END_ADDR (ADDR_RANGE2_END_ADDR),
.ADDR_RANGE1_OFFSET (ADDR_RANGE1_OFFSET),
.ADDR_RANGE2_OFFSET (ADDR_RANGE2_OFFSET),
.ADDR_RANGE3_OFFSET (ADDR_RANGE3_OFFSET)
) avmm_data_controller (
// To/From System
.clock(clock),
.reset_n(reset_n),
// To/From Flash IP interface
.flash_busy(flash_busy),
.flash_se_pass(flash_se_pass),
.flash_sp_pass(flash_sp_pass),
.flash_osc(flash_osc),
.flash_drdout(flash_drdout_wire),
.flash_xe_ye(flash_xe_ye_wire),
.flash_se(flash_se_wire),
.flash_arclk(flash_arclk),
.flash_arshft(flash_arshft),
.flash_drclk(flash_drclk),
.flash_drshft(flash_drshft),
.flash_drdin(flash_drdin),
.flash_nprogram(flash_nprogram),
.flash_nerase(flash_nerase),
.flash_ardin(flash_ardin_wire),
// To/From Avalon_MM data slave interface
.avmm_read(avmm_data_read),
.avmm_write(avmm_data_write),
.avmm_addr(avmm_data_addr),
.avmm_writedata(avmm_data_writedata),
.avmm_burstcount(avmm_data_burstcount),
.avmm_waitrequest(avmm_data_waitrequest),
.avmm_readdatavalid(avmm_data_readdatavalid),
.avmm_readdata(avmm_data_readdata_wire),
// To/From Avalon_MM csr slave interface
.csr_control(csr_control_wire),
.csr_status(csr_status_wire)
);
// -------------------------------------------------------------------
// Instantiate wysiwyg for onchip flash block
// -------------------------------------------------------------------
altera_onchip_flash_block # (
.DEVICE_FAMILY (DEVICE_FAMILY),
.PART_NAME (PART_NAME),
.IS_DUAL_BOOT (IS_DUAL_BOOT),
.IS_ERAM_SKIP (IS_ERAM_SKIP),
.IS_COMPRESSED_IMAGE (IS_COMPRESSED_IMAGE),
.INIT_FILENAME (INIT_FILENAME),
.MIN_VALID_ADDR (MIN_VALID_ADDR),
.MAX_VALID_ADDR (MAX_VALID_ADDR),
.MIN_UFM_VALID_ADDR (MIN_UFM_VALID_ADDR),
.MAX_UFM_VALID_ADDR (MAX_UFM_VALID_ADDR),
.ADDR_RANGE1_END_ADDR (ADDR_RANGE1_END_ADDR),
.ADDR_RANGE2_END_ADDR (ADDR_RANGE2_END_ADDR),
.ADDR_RANGE1_OFFSET (ADDR_RANGE1_OFFSET),
.ADDR_RANGE2_OFFSET (ADDR_RANGE2_OFFSET),
.ADDR_RANGE3_OFFSET (ADDR_RANGE3_OFFSET),
// simulation only start
.DEVICE_ID (DEVICE_ID),
.INIT_FILENAME_SIM (INIT_FILENAME_SIM)
// simulation only end
) altera_onchip_flash_block (
.xe_ye(flash_xe_ye),
.se(flash_se),
.arclk(flash_arclk),
.arshft(flash_arshft),
.ardin(flash_ardin_wire),
.drclk(flash_drclk),
.drshft(flash_drshft),
.drdin(flash_drdin),
.nprogram(flash_nprogram),
.nerase(flash_nerase),
.nosc_ena(1'b0),
.par_en(flash_par_en),
.drdout(flash_drdout_wire),
.busy(flash_busy),
.se_pass(flash_se_pass),
.sp_pass(flash_sp_pass),
.osc(flash_osc)
);
endmodule //altera_onchip_flash
//VALID FILE