IgorR76 wrote:Т.е. стандартными средствами Quartus+Altera при инициализации FPGA само всё скопируется.
Если ROM изначально в циклоне и там и останется - то это само собой.
Задача стояла совершенно иная - использовать флешку именно как внешнюю память, т.е. скопировать оттуда свои произвольные данные во внешнюю параллельную RAM. Например, если биос тупо не влазит в набортную память циклона.
Есть готовая мегафункция - asmi_parallel, которую и используем.
Примерно так:
Code: Select all
module bios_asmi(
input wire ASMI_CLK,
output wire BIOS_DONE,
//интерфейс к RAM
output reg [19:0] RAM_A,
output reg [15:0] RAM_D,
output reg nWR);
wire [7:0] ASMI_DATA;
wire ASMI_BUSY, ASMI_DVALID;
//подождем, иначе флешка молчит, сука
reg [5:0] DELAY;
always @(posedge ASMI_CLK) DELAY <= &DELAY ? DELAY : DELAY + 6'h1;
//счетчик
reg [16:0] CNTR = 17'h0;
always @(posedge ASMI_CLK) CNTR <= ASMI_DVALID & ~BIOS_OK ? CNTR+17'h1 : CNTR;
wire PRELAST_BYTE = ~CNTR[16] & (&CNTR[15:0]); //FFFF
wire LAST_BYTE = CNTR[16];
//выдаем RDEN по отсутствию BUSY и счетчику меньше положенного
//RDEN висит все время чтения
reg RDEN = 1'b0;
always @(negedge ASMI_CLK) RDEN <= (PRELAST_BYTE | LAST_BYTE) ? 1'b0 : (~ASMI_BUSY & (&DELAY)) | RDEN;
//выдаем READ_CMD по фронту RDEN
reg RDEN_FRONT;
always @(negedge ASMI_CLK) RDEN_FRONT <= RDEN;
wire READ_CMD = RDEN & ~RDEN_FRONT;
//выдаем наружу признак окончания
reg BIOS_OK = 1'b0;
always @(posedge ASMI_CLK) BIOS_OK <= LAST_BYTE;
assign BIOS_DONE = BIOS_OK; //чтобы можно было ему 0 присвоить на старте
//снимаем данные
always @(posedge ASMI_CLK) begin
RAM_D[15:8] <= ASMI_DVALID & CNTR[0] ? ASMI_DATA : RAM_D[15:8];
RAM_D[7:0] <= ASMI_DVALID & ~CNTR[0] ? ASMI_DATA : RAM_D[7:0];
end
//адрес фиксируем при чтении 2 байта
always @(posedge ASMI_CLK) RAM_A <= ASMI_DVALID & CNTR[0] ? {1'b0,4'hF,CNTR[15:1]} : RAM_A;
//сигнал записи
always @(posedge ASMI_CLK) nWR <= ~(ASMI_DVALID & CNTR[0]);
//инстанс
parameter bios_read_addr = 24'h70000;
asmi_bios asmi(.clkin(ASMI_CLK), .read(READ_CMD), .rden(RDEN), .addr(bios_read_addr), .reset(1'b0), .dataout(ASMI_DATA), .busy(ASMI_BUSY), .data_valid(ASMI_DVALID));
endmodule