From 42811f868bfc0ffb0ae82ab7cf69a621f935b96b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Luis=20Monta=C3=B1es=20Ojados?= Date: Sun, 1 Mar 2026 03:44:57 +0100 Subject: [PATCH] add rom --- roadmap.md | 2 +- rom/program.hex | 5 +++++ rom/rom.v | 21 +++++++++++++++++++++ rom/rom_tb.v | 44 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 rom/program.hex create mode 100644 rom/rom.v create mode 100644 rom/rom_tb.v diff --git a/roadmap.md b/roadmap.md index 4987f99..0ff6a91 100644 --- a/roadmap.md +++ b/roadmap.md @@ -352,7 +352,7 @@ gtkwave modulo.vcd - [x] Fase 2.3 — Shift Register - [x] Fase 2.4 — Register File - [x] Fase 3.1 — RAM sincrona -- [ ] Fase 3.2 — ROM +- [x] Fase 3.2 — ROM - [ ] Fase 3.3 — Stack - [ ] Fase 4.1 — FSM Semaforo - [ ] Fase 4.2 — UART TX diff --git a/rom/program.hex b/rom/program.hex new file mode 100644 index 0000000..a219390 --- /dev/null +++ b/rom/program.hex @@ -0,0 +1,5 @@ +BEEF +1234 +ABCD +0000 +FF00 diff --git a/rom/rom.v b/rom/rom.v new file mode 100644 index 0000000..f72ebe7 --- /dev/null +++ b/rom/rom.v @@ -0,0 +1,21 @@ +/* + ROM +*/ + +module rom #( + parameter DEPTH = 256, + parameter W = 16, + parameter FILE = "" +) ( + input clk, + input [$clog2(DEPTH)-1:0] addr, + output reg [W-1:0] rd_data +); + reg [W-1:0] mem [0:DEPTH-1]; + + initial $readmemh(FILE, mem); + + always @(posedge clk) begin + rd_data <= mem[addr]; + end +endmodule \ No newline at end of file diff --git a/rom/rom_tb.v b/rom/rom_tb.v new file mode 100644 index 0000000..ab63a8a --- /dev/null +++ b/rom/rom_tb.v @@ -0,0 +1,44 @@ +/* + ROM +*/ +`include "rom/rom.v" + +module rom_tb; + reg clk; + reg [7:0] addr; + wire [15:0] rd_data; + + rom #(.FILE("rom/program.hex")) rom1( + .clk(clk), + .addr(addr), + .rd_data(rd_data) + ); + + initial clk = 0; + always #5 clk = ~clk; + + initial begin + $dumpfile("rom/rom.vcd"); + $dumpvars(0, rom_tb); + + addr = 0; + @(posedge clk); + $display("addr=%d, rd_data=%x", addr, rd_data); + @(posedge clk); + $display("addr=%d, rd_data=%x", addr, rd_data); + + addr = 1; + @(posedge clk); + $display("addr=%d, rd_data=%x", addr, rd_data); + @(posedge clk); + $display("addr=%d, rd_data=%x", addr, rd_data); + + addr = 2; + @(posedge clk); + $display("addr=%d, rd_data=%x", addr, rd_data); + @(posedge clk); + $display("addr=%d, rd_data=%x", addr, rd_data); + + $finish; + end +endmodule \ No newline at end of file