- 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:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user