| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- // 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);
- // Currently read address (for debugging)
- reg [11:0] ff_addr;
- always_ff@(posedge clock) ff_addr <= address;
- `endif
- endmodule
|