|
|
@@ -0,0 +1,143 @@
|
|
|
+
|
|
|
+// synopsys translate_off
|
|
|
+`timescale 1 ps / 1 ps
|
|
|
+// synopsys translate_on
|
|
|
+
|
|
|
+
|
|
|
+module m9k_rom (
|
|
|
+ address,
|
|
|
+ clock,
|
|
|
+ q);
|
|
|
+
|
|
|
+ parameter PROGRAM="";
|
|
|
+ parameter NAME="";
|
|
|
+
|
|
|
+ input [9:0] address;
|
|
|
+ input clock;
|
|
|
+ output [7:0] q;
|
|
|
+`ifndef ALTERA_RESERVED_QIS
|
|
|
+// synopsys translate_off
|
|
|
+`endif
|
|
|
+ tri1 clock;
|
|
|
+`ifndef ALTERA_RESERVED_QIS
|
|
|
+// synopsys translate_on
|
|
|
+`endif
|
|
|
+
|
|
|
+ wire [7:0] sub_wire0;
|
|
|
+ wire [7:0] q = sub_wire0[7:0];
|
|
|
+
|
|
|
+ initial $display("Initialising ROM Memory: %s", PROGRAM);
|
|
|
+
|
|
|
+ altsyncram altsyncram_component (
|
|
|
+ .address_a (address),
|
|
|
+ .clock0 (clock),
|
|
|
+ .q_a (sub_wire0),
|
|
|
+ .aclr0 (1'b0),
|
|
|
+ .aclr1 (1'b0),
|
|
|
+ .address_b (1'b1),
|
|
|
+ .addressstall_a (1'b0),
|
|
|
+ .addressstall_b (1'b0),
|
|
|
+ .byteena_a (1'b1),
|
|
|
+ .byteena_b (1'b1),
|
|
|
+ .clock1 (1'b1),
|
|
|
+ .clocken0 (1'b1),
|
|
|
+ .clocken1 (1'b1),
|
|
|
+ .clocken2 (1'b1),
|
|
|
+ .clocken3 (1'b1),
|
|
|
+ .data_a ({8{1'b1}}),
|
|
|
+ .data_b (1'b1),
|
|
|
+ .eccstatus (),
|
|
|
+ .q_b (),
|
|
|
+ .rden_a (1'b1),
|
|
|
+ .rden_b (1'b1),
|
|
|
+ .wren_a (1'b0),
|
|
|
+ .wren_b (1'b0));
|
|
|
+ defparam
|
|
|
+ altsyncram_component.address_aclr_a = "NONE",
|
|
|
+ altsyncram_component.clock_enable_input_a = "BYPASS",
|
|
|
+ altsyncram_component.clock_enable_output_a = "BYPASS",
|
|
|
+ altsyncram_component.init_file = PROGRAM,
|
|
|
+ altsyncram_component.intended_device_family = "Cyclone IV E",
|
|
|
+ altsyncram_component.lpm_hint = {"ENABLE_RUNTIME_MOD=YES,INSTANCE_NAME=", NAME},
|
|
|
+ altsyncram_component.lpm_type = "altsyncram",
|
|
|
+ altsyncram_component.numwords_a = 1024,
|
|
|
+ altsyncram_component.operation_mode = "ROM",
|
|
|
+ altsyncram_component.outdata_aclr_a = "NONE",
|
|
|
+ altsyncram_component.outdata_reg_a = "UNREGISTERED",
|
|
|
+ altsyncram_component.ram_block_type = "M9K",
|
|
|
+ altsyncram_component.widthad_a = 10,
|
|
|
+ altsyncram_component.width_a = 8,
|
|
|
+ altsyncram_component.width_byteena_a = 1;
|
|
|
+
|
|
|
+endmodule
|
|
|
+
|
|
|
+module pseudo_rom(addr, clk, q);
|
|
|
+ parameter PROGRAM="";
|
|
|
+
|
|
|
+ input reg clk;
|
|
|
+ input wire [9:0] addr;
|
|
|
+ output reg [7:0] q;
|
|
|
+
|
|
|
+ initial $display("Initialising ROM Memory: %s", PROGRAM);
|
|
|
+
|
|
|
+ reg [9:0] addr0;
|
|
|
+ logic [7:0] rom [2**10:0];
|
|
|
+ initial $readmemh(PROGRAM, rom);
|
|
|
+ always_ff@(posedge clk) addr0 <= addr;
|
|
|
+ assign q[7:0] = rom[addr0];
|
|
|
+
|
|
|
+endmodule
|
|
|
+
|
|
|
+module rom (
|
|
|
+ address,
|
|
|
+ clock,
|
|
|
+ q);
|
|
|
+ parameter PROGRAM="";
|
|
|
+
|
|
|
+ input reg [11:0] address;
|
|
|
+ input clock;
|
|
|
+ output reg [31:0] q;
|
|
|
+
|
|
|
+ reg [31:0] qn;
|
|
|
+
|
|
|
+ reg [9:0] addr0, addr1, addr2, addr3;
|
|
|
+ reg [11:0] a3, a2, a1;
|
|
|
+ reg [7:0] q0, q1, q2, q3;
|
|
|
+ reg [1:0] ar;
|
|
|
+ always_ff@(posedge clock) ar <= address[1:0];
|
|
|
+
|
|
|
+ always_comb begin
|
|
|
+ a3 = address + 3;
|
|
|
+ a2 = address + 2;
|
|
|
+ a1 = address + 1;
|
|
|
+ // Dividing by 4
|
|
|
+ addr0 = a3[11:2];
|
|
|
+ addr1 = a2[11:2];
|
|
|
+ addr2 = a1[11:2];
|
|
|
+ addr3 = address[11:2];
|
|
|
+
|
|
|
+ case(ar)
|
|
|
+ 2'b00: qn = {q3, q2, q1, q0};
|
|
|
+ 2'b01: qn = {q0, q3, q2, q1};
|
|
|
+ 2'b10: qn = {q1, q0, q3, q2};
|
|
|
+ 2'b11: qn = {q2, q1, q0, q3};
|
|
|
+ endcase
|
|
|
+ q = qn;
|
|
|
+ end
|
|
|
+ //always_ff@(posedge clock) q <= qn;
|
|
|
+
|
|
|
+ `ifdef SYNTHESIS
|
|
|
+ m9k_rom#({PROGRAM, "_0.mif"}, "rom0") rom0(addr0, clock, q0);
|
|
|
+ m9k_rom#({PROGRAM, "_1.mif"}, "rom1") rom1(addr1, clock, q1);
|
|
|
+ m9k_rom#({PROGRAM, "_2.mif"}, "rom2") rom2(addr2, clock, q2);
|
|
|
+ m9k_rom#({PROGRAM, "_3.mif"}, "rom3") rom3(addr3, clock, q3);
|
|
|
+ `else
|
|
|
+ pseudo_rom#({PROGRAM, "_0.mem"}) rom0(addr0, clock, q0);
|
|
|
+ pseudo_rom#({PROGRAM, "_1.mem"}) rom1(addr1, clock, q1);
|
|
|
+ pseudo_rom#({PROGRAM, "_2.mem"}) rom2(addr2, clock, q2);
|
|
|
+ pseudo_rom#({PROGRAM, "_3.mem"}) rom3(addr3, clock, q3);
|
|
|
+ `endif
|
|
|
+
|
|
|
+endmodule
|
|
|
+
|
|
|
+
|