- added Blitter registers
Committed on the Free edition of March Hare Software CVSNT Server. Upgrade to CVS Suite for more features and support: http://march-hare.com/cvsnt/ git-svn-id: http://moon:8086/svn/vhdl/trunk@669 cc03376c-175c-47c8-b038-4cd826a8556b
This commit is contained in:
@@ -132,14 +132,31 @@ architecture Behavioral of vga_frontend64 is
|
||||
signal vga_fb_front : unsigned(31 downto 0);
|
||||
signal host_fb_front : unsigned(31 downto 0);
|
||||
signal host_fb_back : unsigned(31 downto 0);
|
||||
signal blit_addr_src_0 : unsigned(31 downto 0);
|
||||
signal blit_addr_src_1 : unsigned(31 downto 0);
|
||||
signal blit_addr_dst : unsigned(31 downto 0);
|
||||
signal blit_dimx_src_0 : unsigned(31 downto 0);
|
||||
signal blit_dimx_src_1 : unsigned(31 downto 0);
|
||||
signal blit_dimx_dst : unsigned(31 downto 0);
|
||||
signal blit_nx : unsigned(31 downto 0);
|
||||
signal blit_ny : unsigned(31 downto 0);
|
||||
signal blit_func_sel : unsigned(3 downto 0);
|
||||
signal blit_comb_sel : unsigned(3 downto 0);
|
||||
signal blit_request : std_logic;
|
||||
signal blit_request_set : std_logic;
|
||||
signal blit_request_clr : std_logic;
|
||||
signal blit_complete : std_logic;
|
||||
signal blit_complete_ack : std_logic;
|
||||
signal blit_complete_inten : std_logic;
|
||||
signal vga_scan_rdy : std_logic;
|
||||
signal vga_master_en : std_logic;
|
||||
signal request_cnt_rst : std_logic;
|
||||
signal request_cnt_en : std_logic;
|
||||
signal request_en : std_logic;
|
||||
signal pixel_cnt_rst : std_logic;
|
||||
signal read_bus_en : std_logic;
|
||||
signal request_cnt : natural range 0 to MAX_REQUEST_CNT-1;
|
||||
signal read_cnt : natural range 0 to MAX_REQUEST_CNT-1;
|
||||
signal request_cnt : unsigned(28 downto 0);
|
||||
signal read_cnt : unsigned(28 downto 0);
|
||||
signal bus_read_fin : std_logic;
|
||||
|
||||
signal STB_O_scan : std_logic;
|
||||
signal ADDR_O_scan : unsigned(31 downto 0);
|
||||
@@ -187,6 +204,17 @@ proc_bufchg_irq:
|
||||
end if;
|
||||
end process;
|
||||
|
||||
proc_blit_flags:
|
||||
process(CLK_I)
|
||||
begin
|
||||
if rising_edge(CLK_I) then
|
||||
if RST_I = '1' then
|
||||
blit_request <= '0';
|
||||
blit_complete <= '0';
|
||||
end if;
|
||||
end if;
|
||||
end process;
|
||||
|
||||
inst_vga_backend : entity work.vga_backend
|
||||
GENERIC MAP
|
||||
(
|
||||
@@ -297,7 +325,7 @@ inst_bus_fifo: entity work.fifo_sync
|
||||
);
|
||||
bus_rdy <= not bus_fifo_full;
|
||||
bus_fifo_re <= not bus_fifo_empty and SRDY_I;
|
||||
bus_fifo_we <= STB_O_scan and request_cnt_en;
|
||||
bus_fifo_we <= request_en;
|
||||
bus_fifo_data_in <= (others => '-');
|
||||
bus_fifo_addr_in <= ADDR_O_scan;
|
||||
bus_fifo_sel_in <= (others => '1');
|
||||
@@ -317,14 +345,14 @@ vga_master_next:
|
||||
end process;
|
||||
|
||||
vga_master:
|
||||
process(s, stat_vga_rdy, vga_master_en, vga_scan_rdy, fifo_almost_empty, fifo_almost_full, SRDY_I, ACK_I, read_cnt, request_cnt)
|
||||
process(s, stat_vga_rdy, vga_master_en, vga_scan_rdy, fifo_almost_empty, fifo_almost_full, SRDY_I, ACK_I, bus_read_fin)
|
||||
begin
|
||||
|
||||
CYC_O <= '0';
|
||||
STB_O_scan <= '0';
|
||||
pixel_cnt_rst <= '0';
|
||||
request_cnt_rst <= '0';
|
||||
request_cnt_en <= '0';
|
||||
request_en <= '0';
|
||||
read_bus_en <= '0';
|
||||
sn <= s;
|
||||
|
||||
@@ -349,7 +377,7 @@ vga_master:
|
||||
when bus_request =>
|
||||
CYC_O <= '1';
|
||||
STB_O_scan <= '1';
|
||||
request_cnt_en <= '1';
|
||||
request_en <= '1';
|
||||
read_bus_en <= '1';
|
||||
if fifo_almost_full = '1' then
|
||||
sn <= bus_data;
|
||||
@@ -357,7 +385,7 @@ vga_master:
|
||||
when bus_data =>
|
||||
CYC_O <= '1';
|
||||
read_bus_en <= '1';
|
||||
if read_cnt = request_cnt then
|
||||
if bus_read_fin = '1' then
|
||||
sn <= rdy;
|
||||
if vga_master_en = '0' then
|
||||
sn <= idle;
|
||||
@@ -369,35 +397,42 @@ vga_master:
|
||||
end case;
|
||||
end process;
|
||||
|
||||
request_counter:
|
||||
proc_bus_request_counter:
|
||||
process(CLK_I)
|
||||
begin
|
||||
if rising_edge(CLK_I) then
|
||||
if request_cnt_rst = '1' then
|
||||
request_cnt <= 0;
|
||||
elsif request_cnt_en = '1' and bus_rdy = '1' then
|
||||
if request_cnt /= MAX_REQUEST_CNT-1 then
|
||||
request_cnt <= request_cnt + 1;
|
||||
end if;
|
||||
request_cnt <= (others => '0');
|
||||
elsif request_en = '1' and bus_rdy = '1' then
|
||||
request_cnt <= request_cnt + 1;
|
||||
end if;
|
||||
end if;
|
||||
end process;
|
||||
|
||||
read_counter:
|
||||
proc_bus_read_counter:
|
||||
process(CLK_I)
|
||||
begin
|
||||
if rising_edge(CLK_I) then
|
||||
if request_cnt_rst = '1' then
|
||||
read_cnt <= 0;
|
||||
read_cnt <= (others => '0');
|
||||
elsif read_bus_en = '1' and ACK_I = '1' then
|
||||
if read_cnt /= MAX_REQUEST_CNT-1 then
|
||||
read_cnt <= read_cnt + 1;
|
||||
end if;
|
||||
read_cnt <= read_cnt + 1;
|
||||
end if;
|
||||
end if;
|
||||
end process;
|
||||
|
||||
addr_gen_scan:
|
||||
proc_bus_read_finish:
|
||||
process(CLK_I)
|
||||
begin
|
||||
if rising_edge(CLK_I) then
|
||||
bus_read_fin <= '0';
|
||||
if read_cnt = request_cnt then
|
||||
bus_read_fin <= '1';
|
||||
end if;
|
||||
end if;
|
||||
end process;
|
||||
|
||||
proc_scan_addr:
|
||||
process(CLK_I)
|
||||
begin
|
||||
if rising_edge(CLK_I) then
|
||||
@@ -405,7 +440,7 @@ addr_gen_scan:
|
||||
if pixel_cnt_rst = '1' then
|
||||
pixel_cnt <= 0;
|
||||
front <= host_fb_front;
|
||||
elsif request_cnt_en = '1' and bus_rdy = '1' then
|
||||
elsif request_en = '1' and bus_rdy = '1' then
|
||||
if pixel_cnt /= MAX_REQUEST_CNT/2-1 then
|
||||
pixel_cnt <= pixel_cnt + 1;
|
||||
else
|
||||
@@ -471,10 +506,15 @@ registers_read:
|
||||
|
||||
-- sys_vga_ctrl 0
|
||||
when "0000" =>
|
||||
SDAT_O(0) <= cg_rdy;
|
||||
SDAT_O(1) <= vga_master_en;
|
||||
SDAT_O(2) <= bufchg_irq_en;
|
||||
SDAT_O(3) <= bufchg_flag;
|
||||
SDAT_O(0) <= cg_rdy;
|
||||
SDAT_O(1) <= vga_master_en;
|
||||
SDAT_O(2) <= bufchg_irq_en;
|
||||
SDAT_O(3) <= bufchg_flag;
|
||||
SDAT_O(8) <= blit_request;
|
||||
SDAT_O(9) <= blit_complete;
|
||||
SDAT_O(10) <= blit_complete_inten;
|
||||
SDAT_O(23 downto 20) <= blit_comb_sel;
|
||||
SDAT_O(19 downto 16) <= blit_func_sel;
|
||||
|
||||
-- sys_vga_ascii 4
|
||||
when "0001" =>
|
||||
@@ -504,13 +544,44 @@ registers_read:
|
||||
when "0111" =>
|
||||
SDAT_O <= vga_fb_back;
|
||||
|
||||
-- sys_blit_addr_src_0 32
|
||||
when "1000" =>
|
||||
SDAT_O <= blit_addr_src_0;
|
||||
|
||||
-- sys_blit_addr_src_1 36
|
||||
when "1001" =>
|
||||
SDAT_O <= blit_addr_src_1;
|
||||
|
||||
-- sys_blit_addr_dst 40
|
||||
when "1010" =>
|
||||
SDAT_O <= blit_addr_dst;
|
||||
|
||||
-- sys_blit_dimx_src_0 44
|
||||
when "1011" =>
|
||||
SDAT_O <= blit_dimx_src_0;
|
||||
|
||||
-- sys_blit_dimx_src_1 48
|
||||
when "1100" =>
|
||||
SDAT_O <= blit_dimx_src_1;
|
||||
|
||||
-- sys_blit_dimx_dst 52
|
||||
when "1101" =>
|
||||
SDAT_O <= blit_dimx_dst;
|
||||
|
||||
-- sys_blit_nx 56
|
||||
when "1110" =>
|
||||
SDAT_O <= blit_nx;
|
||||
|
||||
-- sys_blit_ny 60
|
||||
when "1111" =>
|
||||
SDAT_O <= blit_ny;
|
||||
|
||||
when others => null;
|
||||
end case;
|
||||
end if;
|
||||
end if;
|
||||
end process;
|
||||
|
||||
|
||||
registers_write:
|
||||
process(CLK_I)
|
||||
begin
|
||||
@@ -521,23 +592,33 @@ registers_write:
|
||||
cg_clr_screen <= '0';
|
||||
cg_clr_line <= '0';
|
||||
bufchg_flag_ack <= '0';
|
||||
blit_request_set <= '0';
|
||||
blit_complete_ack <= '0';
|
||||
if RST_I = '1' then
|
||||
cg_din <= (others => '0');
|
||||
vga_master_en <= '0';
|
||||
bufchg_irq_en <= '0';
|
||||
host_fb_front <= X"40000000";
|
||||
host_fb_back <= X"40010000";
|
||||
cg_color <= (X"FF", X"FF", X"FF", X"FF");
|
||||
cg_din <= (others => '0');
|
||||
vga_master_en <= '0';
|
||||
bufchg_irq_en <= '0';
|
||||
blit_complete_inten <= '0';
|
||||
blit_func_sel <= (others => '0');
|
||||
blit_comb_sel <= (others => '0');
|
||||
host_fb_front <= X"40000000";
|
||||
host_fb_back <= X"40010000";
|
||||
cg_color <= (X"FF", X"FF", X"FF", X"FF");
|
||||
elsif (STB_I and CYC_I and WE_I) = '1' then
|
||||
case ADDR_I(5 downto 2) is
|
||||
|
||||
-- sys_vga_ctrl 0
|
||||
when "0000" =>
|
||||
vga_master_en <= SDAT_I(1);
|
||||
bufchg_irq_en <= SDAT_I(2);
|
||||
bufchg_flag_ack <= SDAT_I(3);
|
||||
cg_clr_screen <= SDAT_I(4);
|
||||
cg_clr_line <= SDAT_I(5);
|
||||
vga_master_en <= SDAT_I(1);
|
||||
bufchg_irq_en <= SDAT_I(2);
|
||||
bufchg_flag_ack <= SDAT_I(3);
|
||||
cg_clr_screen <= SDAT_I(4);
|
||||
cg_clr_line <= SDAT_I(5);
|
||||
blit_request_set <= SDAT_I(8);
|
||||
blit_complete_ack <= SDAT_I(9);
|
||||
blit_complete_inten <= SDAT_I(10);
|
||||
blit_func_sel <= SDAT_I(19 downto 16);
|
||||
blit_comb_sel <= SDAT_I(23 downto 20);
|
||||
|
||||
-- sys_vga_ascii 4
|
||||
when "0001" =>
|
||||
@@ -567,6 +648,38 @@ registers_write:
|
||||
bufchg_flag_ack <= '1';
|
||||
host_fb_back <= SDAT_I(31 downto 2) & "00";
|
||||
|
||||
-- sys_blit_addr_src_0 32
|
||||
when "1000" =>
|
||||
blit_addr_src_0 <= SDAT_I;
|
||||
|
||||
-- sys_blit_addr_src_1 36
|
||||
when "1001" =>
|
||||
blit_addr_src_1 <= SDAT_I;
|
||||
|
||||
-- sys_blit_addr_dst 40
|
||||
when "1010" =>
|
||||
blit_addr_dst <= SDAT_I;
|
||||
|
||||
-- sys_blit_dimx_src_0 44
|
||||
when "1011" =>
|
||||
blit_dimx_src_0 <= SDAT_I;
|
||||
|
||||
-- sys_blit_dimx_src_1 48
|
||||
when "1100" =>
|
||||
blit_dimx_src_1 <= SDAT_I;
|
||||
|
||||
-- sys_blit_dimx_dst 52
|
||||
when "1101" =>
|
||||
blit_dimx_dst <= SDAT_I;
|
||||
|
||||
-- sys_blit_nx 56
|
||||
when "1110" =>
|
||||
blit_nx <= SDAT_I;
|
||||
|
||||
-- sys_blit_ny 60
|
||||
when "1111" =>
|
||||
blit_ny <= SDAT_I;
|
||||
|
||||
when others => null;
|
||||
end case;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user