- more realistic timing of J-Bus Master

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@843 cc03376c-175c-47c8-b038-4cd826a8556b
This commit is contained in:
2010-03-28 22:32:27 +00:00
parent 67136eeedf
commit 4f1f4ca77b
+77 -29
View File
@@ -32,7 +32,7 @@ END tb_emac_top_jb;
ARCHITECTURE behavior OF tb_emac_top_jb IS ARCHITECTURE behavior OF tb_emac_top_jb IS
constant CLK_PERIOD : time := 10 ns; constant CLK_PERIOD : time := 10 ns;
constant MII_CLK_PERIOD : time := 8 ns; constant MII_CLK_PERIOD : time := 40 ns;
signal CLK : std_logic := '1'; signal CLK : std_logic := '1';
signal RST : std_logic := '1'; signal RST : std_logic := '1';
@@ -78,7 +78,7 @@ ARCHITECTURE behavior OF tb_emac_top_jb IS
signal dat_o_cnt : natural; signal dat_o_cnt : natural;
signal pkt_count : natural; signal pkt_count : natural;
type emac_action_t is (emac_idle, emac_alloc, emac_wait_alloc, emac_write, emac_wait_data, emac_read, emac_free); type emac_action_t is (emac_idle, emac_alloc, emac_write, emac_commit, emac_wait_data, emac_read, emac_free);
signal emac_action : emac_action_t; signal emac_action : emac_action_t;
BEGIN BEGIN
@@ -124,9 +124,9 @@ inst_pkt_gen : entity work.pkt_gen
( (
f_sysclk => 100.0, f_sysclk => 100.0,
PKT_DLY_MIN => 1.0E-6, PKT_DLY_MIN => 1.0E-6,
PKT_DLY_MAX => 10.0E-6, PKT_DLY_MAX => 5.0E-6,
PKT_SIZE_MIN => 64, PKT_SIZE_MIN => 64,
PKT_SIZE_MAX => 512 PKT_SIZE_MAX => 1512
) )
PORT MAP PORT MAP
@@ -200,41 +200,62 @@ STIMULUS: process
STB_I <= '1'; STB_I <= '1';
WE_I <= '1'; WE_I <= '1';
ADDR_I <= X"0000_0004"; ADDR_I <= X"0000_0004";
wait until rising_edge(CLK) and SRDY_O = '1';
STB_I <= '0';
-- set alloc request check_alloc_ok:
while(true) loop
-- set alloc request
wait until rising_edge(CLK) and SRDY_O = '1';
DAT_I <= X"0200_0000";
STB_I <= '1';
WE_I <= '1';
ADDR_I <= X"0000_0000";
check_bsy:
while (true) loop
wait until rising_edge(CLK) and SRDY_O = '1';
WE_I <= '0';
STB_I <= '1';
ADDR_I <= X"0000_0000";
wait until rising_edge(CLK) and SRDY_O = '1';
STB_I <= '0';
wait until rising_edge(CLK) and ACK_O = '1';
wait until rising_edge(CLK);
if DAT_O_reg(25) = '0' then
exit check_bsy;
end if;
end loop;
if DAT_O_reg(24) = '1' then
exit check_alloc_ok;
end if;
end loop;
CYC_I <= '0';
emac_action <= emac_idle;
end procedure emac_alloc;
procedure emac_commit is
begin
-- RX- DEALLOCATION
emac_action <= emac_commit;
-- set free request
CYC_I <= '1'; CYC_I <= '1';
wait until rising_edge(CLK) and SRDY_O = '1'; wait until rising_edge(CLK) and SRDY_O = '1';
DAT_I <= X"0200_0000"; DAT_I <= X"0100_0000";
STB_I <= '1'; STB_I <= '1';
WE_I <= '1'; WE_I <= '1';
ADDR_I <= X"0000_0000"; ADDR_I <= X"0000_0000";
wait until rising_edge(CLK) and SRDY_O = '1'; wait until rising_edge(CLK) and SRDY_O = '1';
STB_I <= '0'; STB_I <= '0';
WE_I <= '0'; WE_I <= '0';
-- check alloc busy
emac_action <= emac_wait_alloc;
check_bsy:
while (true) loop
CYC_I <= '1';
wait until rising_edge(CLK) and SRDY_O = '1';
STB_I <= '1';
ADDR_I <= X"0000_0000";
wait until rising_edge(CLK) and SRDY_O = '1';
STB_I <= '0';
wait until rising_edge(CLK) and ACK_O = '1';
wait until rising_edge(CLK);
if DAT_O_reg(25) = '0' then
exit check_bsy;
end if;
end loop;
emac_action <= emac_idle; emac_action <= emac_idle;
end procedure emac_alloc; end procedure emac_commit;
procedure emac_write (size : natural) is procedure emac_write (size : natural) is
variable data : unsigned (7 downto 0); variable data : unsigned (7 downto 0);
variable num_words : natural; variable num_words : natural;
@@ -268,6 +289,9 @@ STIMULUS: process
STB_I <= '0'; STB_I <= '0';
wait until rising_edge(CLK) and SRDY_O = '1'; wait until rising_edge(CLK) and SRDY_O = '1';
emac_commit;
emac_action <= emac_idle; emac_action <= emac_idle;
end procedure emac_write; end procedure emac_write;
@@ -377,6 +401,30 @@ STIMULUS: process
RST <= '0'; RST <= '0';
wait for 60*CLK_PERIOD; wait for 60*CLK_PERIOD;
emac_alloc (1004);
emac_alloc (1004);
emac_alloc (1004);
emac_alloc (1004);
emac_alloc (1004);
emac_alloc (1004);
emac_alloc (1004);
emac_alloc (1004);
emac_alloc (1004);
emac_alloc (1004);
emac_alloc (1004);
emac_alloc (1004);
for i in 1 to 10 loop
for j in 1 to 500 loop
emac_alloc (72);
emac_write (72);
end loop;
wait for 2 ms;
end loop;
wait until rising_edge(mii_tx_clk) and mii_tx_en = '0';
wait for 6000*CLK_PERIOD;
loop_back_en <= '1'; loop_back_en <= '1';
emac_alloc (72); emac_alloc (72);
@@ -480,8 +528,8 @@ STIMULUS: process
loop_back_en <= '0'; loop_back_en <= '0';
pktgen_rst <= '0'; pktgen_rst <= '0';
pkt_count <= 0; pkt_count <= 0;
for i in 1 to 100 loop for i in 1 to 500 loop
wait for 100000*CLK_PERIOD; wait for 7 us;
emac_read (0); emac_read (0);
emac_free; emac_free;
pkt_count <= pkt_count + 1; pkt_count <= pkt_count + 1;