use ieee.std_logic_unsigned.conv_integer;
use ieee.std_logic_arith.conv_std_logic_vector;
use work.motonesfpga_common.all;
+use ieee.std_logic_unsigned.all;\r
entity vga_ctl is
port ( \r
constant sw_pop_fifo : std_logic_vector(2 downto 0) := "001";\r
constant sw_write : std_logic_vector(2 downto 0) := "010";\r
constant sw_write_ack : std_logic_vector(2 downto 0) := "011";\r
-constant sw_write_burst1 : std_logic_vector(2 downto 0) := "100";\r
-constant sw_write_burst2 : std_logic_vector(2 downto 0) := "101";\r
+constant sw_write_burst : std_logic_vector(2 downto 0) := "100";\r
+constant sw_write_burst_last : std_logic_vector(2 downto 0) := "101";\r
\r
signal sw_state : std_logic_vector(2 downto 0);\r
\r
--write to sdram status\r
case sw_state is\r
when sw_idle => --0: idle...\r
- if (f_emp = '1') then\r
+ if (f_cnt < "00001000") then --wait until fifo > 8\r
sw_state <= sw_idle;\r
else\r
sw_state <= sw_pop_fifo;\r
sw_state <= sw_write_ack;\r
\r
when sw_write_ack => --3: push first data\r
- sw_state <= sw_write_burst1;\r
+ sw_state <= sw_write_burst;\r
\r
- when sw_write_burst1 => --4-1: repeat...\r
- if (bst_wr_cnt(7 downto 1) = "0000000") then -- case 0 or 1\r
- sw_state <= sw_idle;\r
+ when sw_write_burst => --4: repeat...\r
+ if (bst_wr_cnt > "00000001") then -- busrt write\r
+ sw_state <= sw_write_burst;\r
else\r
- sw_state <= sw_write_burst2;\r
+ sw_state <= sw_write_burst_last;\r
end if;\r
\r
- when sw_write_burst2 => --4-2: repeat...\r
- if (bst_wr_cnt(7 downto 1) = "0000000") then -- case 0 or 1\r
- sw_state <= sw_idle;\r
- else\r
- sw_state <= sw_write_burst2;\r
- end if;\r
- \r
- when others =>\r
+ when others => --other and burst last...\r
sw_state <= sw_idle;\r
end case;\r
\r
end process;\r
\r
f_rd <= '0' when rst_n = '0' else\r
- '1' when (sw_state = sw_pop_fifo or sw_state = sw_write_burst2) else\r
+ '1' when (sw_state = sw_pop_fifo) else\r
+ '1' when (sw_state = sw_write_burst) else\r
'0';\r
-\r
f_val_we_n <= not f_rd;\r
--- f_val_p : process (rst_n, mem_clk)\r
--- begin\r
--- if (rst_n = '0') then\r
--- f_val_we_n <= '1';\r
--- elsif (rising_edge(mem_clk)) then\r
--- if (f_rd = '1') then\r
--- f_val_we_n <= '0';\r
--- else\r
--- f_val_we_n <= '1';\r
--- end if;\r
--- end if;\r
--- end process;\r
+ sdram_addr_inc_n <= not f_rd;\r
\r
sdram_addr_res_n <= rst_n;\r
- sdram_addr_inc_n <= '1' when rst_n = '0' else\r
- '0' when (sw_state(2) = '1') else --case sw_write_burst1 or sw_write_burst2\r
- '1';\r
bst_wr_cnt_we_n <= '1' when rst_n = '0' else\r
'0' when sw_state = sw_idle else\r
'1';\r
- wbs_adr_i <= sdram_write_addr;\r
+ wbs_adr_i <= sdram_write_addr - 1;\r
wbs_dat_i <= "0000" & f_val;\r
- wbs_tga_i <= bst_wr_cnt;\r
+ wbs_tga_i <= bst_wr_cnt + 1;\r
wbs_cyc_i <= '0' when rst_n = '0' else\r
'1' when sw_state >= sw_write else\r
'0';\r