summaryrefslogtreecommitdiff
path: root/testsuite/gna/sr2676/reset-rtl.vhdl
diff options
context:
space:
mode:
authorTristan Gingold2013-12-29 14:50:36 +0100
committerTristan Gingold2013-12-29 14:50:36 +0100
commit3c7ce7119cc82e72736c2690e0705462c8576779 (patch)
treed08dc6a9e497b6f356c72d9f47baac66bdd436b0 /testsuite/gna/sr2676/reset-rtl.vhdl
parentaad9a60cc0cba4ce6f626c6367d11b14dba70926 (diff)
downloadghdl-3c7ce7119cc82e72736c2690e0705462c8576779.tar.gz
ghdl-3c7ce7119cc82e72736c2690e0705462c8576779.tar.bz2
ghdl-3c7ce7119cc82e72736c2690e0705462c8576779.zip
Add sr2676 test.
Diffstat (limited to 'testsuite/gna/sr2676/reset-rtl.vhdl')
-rw-r--r--testsuite/gna/sr2676/reset-rtl.vhdl120
1 files changed, 120 insertions, 0 deletions
diff --git a/testsuite/gna/sr2676/reset-rtl.vhdl b/testsuite/gna/sr2676/reset-rtl.vhdl
new file mode 100644
index 0000000..722661f
--- /dev/null
+++ b/testsuite/gna/sr2676/reset-rtl.vhdl
@@ -0,0 +1,120 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+use work.reset_types.all;
+
+architecture rtl of power_on_reset is
+ --signal current_state: reset_state;
+ signal current_state: reset_state;
+ signal next_state: reset_state;
+ signal por_counter: unsigned(31 downto 0);
+ signal saved_por_counter: unsigned(31 downto 0);
+
+ constant DELAY_POWER_STABLE_CLOCKS: unsigned := to_unsigned((10 * 1000), 32)/clk_period_ns;
+ constant DELAY_PM_READ_ID_CLOCKS: unsigned :=
+ DELAY_POWER_STABLE_CLOCKS + to_unsigned((10 * 1000), 32)/clk_period_ns;
+ constant DELAY_PM_READ_ID_DONE_CLOCKS: unsigned :=
+ DELAY_PM_READ_ID_CLOCKS + to_unsigned((10 * 1000), 32)/clk_period_ns;
+
+
+begin
+
+-- advance the state variable and detect reset
+advance_state: process(clk, reset)
+begin
+ if (reset = '1') then
+ current_state <= RST;
+ elsif rising_edge(clk) then
+ current_state <= next_state;
+ end if;
+end process advance_state;
+
+run_counter: process(clk, current_state)
+begin
+ if (current_state = RST) then
+ por_counter <= (others => '0');
+ elsif (current_State = MONITOR_RESET) then
+ por_counter <= por_counter;
+ else
+ por_counter <= por_counter + 1;
+ end if;
+end process run_counter;
+
+-- select the next state
+select_state: process(clk)
+begin
+ sys_clken <= '1';
+ core_en <= '1';
+ case current_state is
+ when RST =>
+ core_en <= '0';
+ sys_clken <= '0';
+ clk_33mhz_en <= '0';
+ cfg_drv <= '0';
+ rd_pmbrd_rev <= '0';
+ next_state <= ENABLE_CORE_POWER;
+
+ when ENABLE_CORE_POWER =>
+ if (por_counter < DELAY_POWER_STABLE_CLOCKS) then
+ -- wait for core power to stabilize
+ next_state <= ENABLE_CORE_POWER;
+ else
+ next_state <= SELECT_PROCESSOR_POR_CONFIG;
+ end if;
+
+ when SELECT_PROCESSOR_POR_CONFIG =>
+ cfg_drv <= '1';
+ next_state <= SAMPLE_HW_CONFIG;
+
+ when SAMPLE_HW_CONFIG =>
+ if (por_counter < DELAY_PM_READ_ID_CLOCKS) then
+ -- delay until ready to read personality module ID
+ next_state <= SAMPLE_HW_CONFIG;
+ else
+ next_state <= SELECT_PERSONALITY_ID;
+ end if;
+
+ when SELECT_PERSONALITY_ID =>
+ rd_pmbrd_rev <= '1';
+ next_state <= SAMPLE_PERSONALITY_ID;
+
+ when SAMPLE_PERSONALITY_ID =>
+ if (por_counter < DELAY_PM_READ_ID_DONE_CLOCKS) then
+ next_state <= SAMPLE_PERSONALITY_ID;
+ else
+ next_state <= DESELECT_PERSONALITY_ID;
+ end if;
+
+ when DESELECT_PERSONALITY_ID =>
+ rd_pmbrd_rev <= '0';
+ next_state <= DEASSERT_HRESET;
+
+ when DEASSERT_HRESET =>
+ saved_por_counter <= por_counter;
+ if (por_counter < (saved_por_counter + 4)) then
+ next_state <= DEASSERT_HRESET;
+ else
+ next_state <= DESELECT_PROCESSOR_POR_CONFIG;
+ end if;
+
+ when DESELECT_PROCESSOR_POR_CONFIG =>
+ cfg_drv <= '0';
+ next_state <= WAIT_FOR_PROCESSOR;
+
+ when WAIT_FOR_PROCESSOR =>
+ next_state <= ENABLE_ALL_DEVICES;
+
+ when ENABLE_ALL_DEVICES =>
+ next_state <= MONITOR_RESET;
+
+ when MONITOR_RESET =>
+ next_state <= MONITOR_RESET;
+ end case;
+end process select_state;
+
+-- output state variable
+cur_state <= current_state;
+
+end rtl;
+
+