aboutsummaryrefslogtreecommitdiffstats
path: root/atk16_fpga/bram_fsm.v
diff options
context:
space:
mode:
authorJan Tuomi <jan@jantuomi.fi>2024-12-29 21:05:56 +0200
committerJan Tuomi <jan@jantuomi.fi>2024-12-29 21:05:56 +0200
commitf1096f78f89e10b867b6ff7689d0a8777855b451 (patch)
treeb23af05d56a814e8f4ead16295e850f58af27214 /atk16_fpga/bram_fsm.v
parent5636fc7373b51306c8a3b8ba703831f67fdbf685 (diff)
Rename mem_fsm -> bram_fsm
Diffstat (limited to 'atk16_fpga/bram_fsm.v')
-rw-r--r--atk16_fpga/bram_fsm.v58
1 files changed, 58 insertions, 0 deletions
diff --git a/atk16_fpga/bram_fsm.v b/atk16_fpga/bram_fsm.v
new file mode 100644
index 0000000..763b853
--- /dev/null
+++ b/atk16_fpga/bram_fsm.v
@@ -0,0 +1,58 @@
+`default_nettype none
+
+`define ST_IDLE 3'd0
+`define ST_READ 3'd1
+`define ST_WRITE 3'd2
+
+module bram_fsm(
+ input clk,
+ input [15:0] addr,
+ input [15:0] data_in,
+ input read_en,
+ input write_en,
+
+ output wire [15:0] data_out,
+ output reg done
+);
+ reg wr, rd;
+ reg [15:0] bram_addr;
+ reg [2:0] state = 0;
+ bram bram_inst(
+ .clk(clk),
+ .addr(bram_addr),
+ .cs_n(1'd0),
+ .wr_n(~wr),
+ .rd_n(~rd),
+ .bram_data_in(data_in),
+ .bram_data_out(data_out)
+ );
+
+ always @(posedge clk) begin
+ case (state)
+ `ST_IDLE: begin
+ done <= 0;
+ if (~done && read_en) begin
+ state <= `ST_READ;
+ bram_addr <= addr;
+ rd <= 1;
+ wr <= 0;
+ end
+ else if (~done && write_en) begin
+ state <= `ST_WRITE;
+ bram_addr <= addr;
+ rd <= 0;
+ wr <= 1;
+ end
+ end
+ `ST_READ: begin
+ state <= `ST_IDLE;
+ done <= 1;
+ end
+ `ST_WRITE: begin
+ state <= `ST_IDLE;
+ done <= 1;
+ end
+ endcase
+ end
+
+endmodule