- added transfer dropstate in case of RAM full

- registered ctrl_out.pkt_lost. Cleared on pkt_free
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@832 cc03376c-175c-47c8-b038-4cd826a8556b
This commit is contained in:
2010-03-28 08:28:29 +00:00
parent 34de6ae03e
commit 6746955337
+30 -39
View File
@@ -54,27 +54,19 @@ ARCHITECTURE behavior OF emac_rx IS
signal flush_en : std_logic;
signal fill_ptr : word_ptr_t;
signal fill_ptr_set : std_logic;
signal fill_ptr_adv : std_logic;
signal commit_en : std_logic;
signal uncommit_en : std_logic;
signal xfer_ram_limit : word_ptr_t;
signal xfer_ram_full : std_logic;
signal xfer_base : word_ptr_t;
signal xfer_size : word_ptr_t;
signal xfer_ptr : word_ptr_t;
signal xfer_cnt : word_ptr_t;
signal xfer_ptr_set : std_logic;
signal xfer_ptr_adv : std_logic;
signal xfer_cnt_set : std_logic;
signal xfer_cnt_adv : std_logic;
signal xfer_rdy : std_logic;
signal xfer_tag : unsigned(3 downto 0);
signal xfer_remain : unsigned(1 downto 0);
signal xfer_odd : std_logic;
signal xfer_remain_en : std_logic;
signal ram_en_a : std_logic;
signal ram_we_a : std_logic;
@@ -111,10 +103,10 @@ ARCHITECTURE behavior OF emac_rx IS
signal word_count_ack : std_logic;
signal word_count_vld : std_logic;
type host_state_t is (host_init, host_flush, host_idle, host_setup, host_arm, host_fill, host_uncommit);
type host_state_t is (host_init, host_flush, host_idle);
signal host_s, host_sn : host_state_t;
type xfer_state_t is (xfer_init, xfer_idle, xfer_setup, xfer_wait, xfer_active, xfer_free);
type xfer_state_t is (xfer_init, xfer_idle, xfer_setup, xfer_active, xfer_drop, xfer_free);
signal xfer_s, xfer_sn : xfer_state_t;
begin
@@ -122,7 +114,6 @@ begin
ctrl_out.rx_size <= cmd_fifo_dout(31 downto 16);
ctrl_out.pkt_avail <= not cmd_fifo_empty;
ctrl_out.rx_er <= mii_rx_er;
ctrl_out.pkt_lost <= xfer_ram_full;
dout <= ram_dout_a;
@@ -137,7 +128,7 @@ begin
ram_en_b <= '1';
ram_din_b <= mii_fifo_dout(31 downto 0);
ram_addr_b <= xfer_ptr;
ram_we_b <= xfer_cnt_adv;
ram_we_b <= xfer_ptr_adv;
cmd_fifo_we <= commit_en;
cmd_fifo_re <= ctrl_in.pkt_free_en;
@@ -157,12 +148,10 @@ host_state_next:
end process;
host_state:
process(host_s, cmd_fifo_empty, ctrl_in.pkt_read_en, ctrl_in.pkt_req_en)
process(host_s)
begin
flush_en <= '0';
fill_ptr_set <= '0';
fill_ptr_adv <= '0';
host_sn <= host_s;
@@ -177,25 +166,6 @@ host_state:
host_sn <= host_idle;
when host_idle =>
if cmd_fifo_empty = '0' then
host_sn <= host_setup;
end if;
when host_setup =>
fill_ptr_set <= '1';
host_sn <= host_arm;
when host_arm =>
host_sn <= host_fill;
when host_fill =>
fill_ptr_adv <= ctrl_in.pkt_read_en;
if ctrl_in.pkt_req_en = '1' then
host_sn <= host_uncommit;
end if;
when host_uncommit =>
host_sn <= host_idle;
when others =>
host_sn <= host_idle;
@@ -261,23 +231,29 @@ xfer_state:
when xfer_setup =>
xfer_cnt_set <= '1';
xfer_ptr_set <= '1';
xfer_sn <= xfer_wait;
when xfer_wait =>
xfer_sn <= xfer_active;
when xfer_active =>
mii_fifo_re <= '1';
xfer_cnt_adv <= not mii_fifo_empty;
xfer_ptr_adv <= not mii_fifo_empty;
if xfer_ram_full = '1' then
xfer_sn <= xfer_free;
xfer_sn <= xfer_drop;
elsif xfer_rdy = '1' then
if mii_fifo_empty = '1' then
xfer_sn <= xfer_free;
end if;
end if;
when xfer_drop =>
mii_fifo_re <= '1';
xfer_cnt_adv <= not mii_fifo_empty;
if xfer_rdy = '1' then
if mii_fifo_empty = '1' then
xfer_sn <= xfer_free;
end if;
end if;
when xfer_free =>
word_count_ack <= '1';
commit_en <= not xfer_ram_full;
@@ -290,6 +266,21 @@ xfer_state:
end process;
------------------------------------------------------------------
pkt_lost_register:
process(clk)
begin
if rising_edge(clk) then
if flush_en = '1' then
ctrl_out.pkt_lost <= '0';
elsif word_count_ack = '1' and xfer_ram_full = '1' then
ctrl_out.pkt_lost <= '1';
elsif ctrl_in.pkt_free_en = '1' then
ctrl_out.pkt_lost <= '0';
end if;
end if;
end process;
xfer_limit_register:
process(clk)
begin