- added RDY generator => SLAVE is not always ready => better test.
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@660 cc03376c-175c-47c8-b038-4cd826a8556b
This commit is contained in:
@@ -63,6 +63,7 @@ ARCHITECTURE behavior OF tb_vga_frontend64 IS
|
|||||||
signal ADDR_I : unsigned(31 downto 0) := (others => '-');
|
signal ADDR_I : unsigned(31 downto 0) := (others => '-');
|
||||||
signal SDAT_I : unsigned(31 downto 0) := (others => '-');
|
signal SDAT_I : unsigned(31 downto 0) := (others => '-');
|
||||||
signal SDAT_O : unsigned(31 downto 0) := (others => '-');
|
signal SDAT_O : unsigned(31 downto 0) := (others => '-');
|
||||||
|
signal rdy : std_logic := '0';
|
||||||
|
|
||||||
-- VGA signals
|
-- VGA signals
|
||||||
signal vga_clk : std_logic := '1';
|
signal vga_clk : std_logic := '1';
|
||||||
@@ -130,6 +131,13 @@ inst_vga_frontend64 : entity work.vga_frontend64
|
|||||||
|
|
||||||
vga_en <= not RST_O;
|
vga_en <= not RST_O;
|
||||||
|
|
||||||
|
rdy_GEN: process
|
||||||
|
begin
|
||||||
|
wait for 3*CLK_PERIOD/2;
|
||||||
|
wait until rising_edge(CLK_O);
|
||||||
|
rdy <= not rdy;
|
||||||
|
end process;
|
||||||
|
|
||||||
CLK_GEN: process
|
CLK_GEN: process
|
||||||
begin
|
begin
|
||||||
wait for CLK_PERIOD/2;
|
wait for CLK_PERIOD/2;
|
||||||
@@ -143,18 +151,34 @@ VGA_CLK_GEN: process
|
|||||||
end process;
|
end process;
|
||||||
|
|
||||||
-- Slave
|
-- Slave
|
||||||
SRDY_O <= CYC_I;
|
SRDY_O <= CYC_I and rdy;
|
||||||
|
|
||||||
process(CLK_O)
|
process(CLK_O)
|
||||||
|
variable ack_v : unsigned(11 downto 0);
|
||||||
|
type arr64_t is array (11 downto 0) of unsigned(63 downto 0);
|
||||||
|
variable dat_v : arr64_t;
|
||||||
|
variable res: unsigned(63 downto 0);
|
||||||
|
variable count: unsigned(31 downto 0);
|
||||||
begin
|
begin
|
||||||
if rising_edge(CLK_O) then
|
if rising_edge(CLK_O) then
|
||||||
if RST_O = '1' then
|
if RST_O = '1' then
|
||||||
MDAT_O <= X"00000000_00000000";
|
count := X"00000000";
|
||||||
elsif (CYC_I and STB_I) = '1' then
|
for i in 0 to 11 loop
|
||||||
MDAT_O <= MDAT_O + 1;
|
dat_v(i) := X"FFFFFFFF_FFFFFFFF";
|
||||||
ACK_O <= '1';
|
ack_v(i) := '0';
|
||||||
|
end loop;
|
||||||
else
|
else
|
||||||
ACK_O <= '0';
|
if (CYC_I and STB_I) = '1' and rdy = '1' then
|
||||||
|
res := ADDR_I & count;
|
||||||
|
dat_v := dat_v(10 downto 0) & res;
|
||||||
|
ack_v := ack_v(10 downto 0) & '1';
|
||||||
|
count := count + 8;
|
||||||
|
else
|
||||||
|
dat_v := dat_v(10 downto 0) & X"FFFFFFFF_FFFFFFFF";
|
||||||
|
ack_v := ack_v(10 downto 0) & '0';
|
||||||
|
end if;
|
||||||
|
MDAT_O <= dat_v(dat_v'left);
|
||||||
|
ACK_O <= ack_v(ack_v'left);
|
||||||
end if;
|
end if;
|
||||||
end if;
|
end if;
|
||||||
end process;
|
end process;
|
||||||
|
|||||||
Reference in New Issue
Block a user