From 24ef39b739dece7ef9bafa4a064ed9cb41433c34 Mon Sep 17 00:00:00 2001 From: Daniel Jobson Date: Thu, 14 Nov 2024 14:02:53 +0100 Subject: [PATCH] fpga: Automatically control app_mode in hardware MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Instead of manually switching to app mode using the APP_MODE register, app mode will be enabled when the CPU fetches an instruction outside of firmware ROM. Co-authored-by: Mikael Ă…gren --- hw/application_fpga/core/tk1/rtl/tk1.v | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/hw/application_fpga/core/tk1/rtl/tk1.v b/hw/application_fpga/core/tk1/rtl/tk1.v index 122b187..a0e0381 100644 --- a/hw/application_fpga/core/tk1/rtl/tk1.v +++ b/hw/application_fpga/core/tk1/rtl/tk1.v @@ -109,6 +109,7 @@ module tk1 #( localparam FW_RAM_FIRST = 32'hd0000000; localparam FW_RAM_LAST = 32'hd0000fff; // 4 KB + localparam FW_ROM_LAST = 32'h00001fff; //---------------------------------------------------------------- // Registers including update variables and write enable. @@ -117,6 +118,7 @@ module tk1 #( reg cdi_mem_we; reg app_mode_reg; + reg app_mode_new; reg app_mode_we; reg [ 2 : 0] led_reg; @@ -292,7 +294,7 @@ module tk1 #( gpio2_reg[1] <= gpio2_reg[0]; if (app_mode_we) begin - app_mode_reg <= 1'h1; + app_mode_reg <= app_mode_new; end if (led_we) begin @@ -484,12 +486,27 @@ module tk1 #( end end + //---------------------------------------------------------------- + // app_mode_ctrl + // + // Automatically lower privilege when executing above ROM. + // ---------------------------------------------------------------- + always @* begin : app_mode_ctrl + app_mode_new = 1'h0; + app_mode_we = 1'h0; + + if (cpu_valid & cpu_instr) begin + if (cpu_addr > FW_ROM_LAST) begin + app_mode_new = 1'h1; + app_mode_we = 1'h1; + end + end + end //---------------------------------------------------------------- // api //---------------------------------------------------------------- always @* begin : api - app_mode_we = 1'h0; led_we = 1'h0; gpio3_we = 1'h0; gpio4_we = 1'h0; @@ -516,10 +533,6 @@ module tk1 #( if (cs) begin tmp_ready = 1'h1; if (we) begin - if (address == ADDR_APP_MODE_CTRL) begin - app_mode_we = 1'h1; - end - if (address == ADDR_LED) begin led_we = 1'h1; end