mirror of
https://github.com/tillitis/tillitis-key1.git
synced 2024-12-11 17:04:28 -05:00
de668a0244
Signed-off-by: Joachim Strömbergson <joachim@assured.se>
87 lines
2.6 KiB
Verilog
87 lines
2.6 KiB
Verilog
//======================================================================
|
|
//
|
|
// rom..v
|
|
// ------
|
|
// Firmware ROM module. Implemented using Embedded Block RAM
|
|
// in the FPGA.
|
|
//
|
|
//
|
|
// Author: Joachim Strombergson
|
|
// Copyright (C) 2022 - Tillitis AB
|
|
// SPDX-License-Identifier: GPL-2.0-only
|
|
//
|
|
//======================================================================
|
|
|
|
`default_nettype none
|
|
|
|
module rom(
|
|
input wire clk,
|
|
input wire reset_n,
|
|
|
|
input wire cs,
|
|
/* verilator lint_off UNUSED */
|
|
input wire [11 : 0] address,
|
|
/* verilator lint_on UNUSED */
|
|
output wire [31 : 0] read_data,
|
|
output wire ready
|
|
);
|
|
|
|
|
|
//----------------------------------------------------------------
|
|
// Registers, memories with associated wires.
|
|
//----------------------------------------------------------------
|
|
// Size of the sysMem Embedded Block RAM (EBR) memory primarily
|
|
// used for code storage (ROM). The size is number of
|
|
// 32-bit words. Each EBR is 4kbit in size, and (at most)
|
|
// 16-bit wide. Thus means that we use pairs of EBRs, and
|
|
// each pair store 256 32bit words.
|
|
// The size of the EBR allocated to memory must match the
|
|
// size of the firmware file generated by the Makefile.
|
|
//
|
|
// Max size for the ROM is 3072 words, and the address is
|
|
// 12 bits to support ROM with this number of words.
|
|
localparam EBR_MEM_SIZE = `BRAM_FW_SIZE;
|
|
reg [31 : 0] memory [0 : (EBR_MEM_SIZE - 1)];
|
|
initial $readmemh(`FIRMWARE_HEX, memory);
|
|
|
|
reg [31 : 0] rom_rdata;
|
|
reg ready_reg;
|
|
|
|
|
|
//----------------------------------------------------------------
|
|
// Concurrent assignments of ports.
|
|
//----------------------------------------------------------------
|
|
assign read_data = rom_rdata;
|
|
assign ready = ready_reg;
|
|
|
|
|
|
//----------------------------------------------------------------
|
|
// reg_update
|
|
//----------------------------------------------------------------
|
|
always @ (posedge clk)
|
|
begin : reg_update
|
|
if (!reset_n) begin
|
|
ready_reg <= 1'h0;
|
|
end
|
|
else begin
|
|
ready_reg <= cs;
|
|
end
|
|
end // reg_update
|
|
|
|
|
|
//----------------------------------------------------------------
|
|
// rom_logic
|
|
//----------------------------------------------------------------
|
|
always @*
|
|
begin : rom_logic
|
|
/* verilator lint_off WIDTH */
|
|
rom_rdata = memory[address];
|
|
/* verilator lint_on WIDTH */
|
|
end
|
|
|
|
endmodule // rom
|
|
|
|
//======================================================================
|
|
// EOF rom..v
|
|
//======================================================================
|