- improved allocation stuff
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@842 cc03376c-175c-47c8-b038-4cd826a8556b
This commit is contained in:
+35
-22
@@ -184,7 +184,7 @@ host_state_next:
|
|||||||
end process;
|
end process;
|
||||||
|
|
||||||
host_state:
|
host_state:
|
||||||
process(host_s, alloc_req, alloc_OK, fill_rdy, din_vld, ctrl_in.pkt_commit_en)
|
process(host_s, alloc_OK, fill_rdy, din_vld, ctrl_in.pkt_commit_en, alloc_req)
|
||||||
begin
|
begin
|
||||||
|
|
||||||
fill_cnt_set <= '0';
|
fill_cnt_set <= '0';
|
||||||
@@ -208,15 +208,16 @@ host_state:
|
|||||||
end if;
|
end if;
|
||||||
|
|
||||||
when host_alloc =>
|
when host_alloc =>
|
||||||
|
alloc_ack <= '1';
|
||||||
|
host_sn <= host_idle;
|
||||||
if alloc_OK = '1' then
|
if alloc_OK = '1' then
|
||||||
host_sn <= host_setup;
|
host_sn <= host_setup;
|
||||||
alloc_ack <= '1';
|
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
when host_setup =>
|
when host_setup =>
|
||||||
|
host_sn <= host_arm;
|
||||||
fill_cnt_set <= '1';
|
fill_cnt_set <= '1';
|
||||||
fill_ptr_set <= '1';
|
fill_ptr_set <= '1';
|
||||||
host_sn <= host_arm;
|
|
||||||
|
|
||||||
when host_arm =>
|
when host_arm =>
|
||||||
fill_cnt_adv <= '1';
|
fill_cnt_adv <= '1';
|
||||||
@@ -227,7 +228,7 @@ host_state:
|
|||||||
fill_ptr_adv <= not fill_rdy and din_vld;
|
fill_ptr_adv <= not fill_rdy and din_vld;
|
||||||
if alloc_req = '1' then
|
if alloc_req = '1' then
|
||||||
host_sn <= host_alloc;
|
host_sn <= host_alloc;
|
||||||
elsif fill_rdy = '1' or ctrl_in.pkt_commit_en = '1' then
|
elsif ctrl_in.pkt_commit_en = '1' then
|
||||||
host_sn <= host_commit;
|
host_sn <= host_commit;
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
@@ -259,10 +260,36 @@ alloc_request_logic:
|
|||||||
fill_size <= ctrl_in.tx_size(word_ptr_t'left+2 downto 2) + 1;
|
fill_size <= ctrl_in.tx_size(word_ptr_t'left+2 downto 2) + 1;
|
||||||
end if;
|
end if;
|
||||||
ctrl_out.tx_size <= resize(ctrl_in.tx_size(word_ptr_t'left downto 0), 16);
|
ctrl_out.tx_size <= resize(ctrl_in.tx_size(word_ptr_t'left downto 0), 16);
|
||||||
|
|
||||||
elsif alloc_ack = '1' then
|
elsif alloc_ack = '1' then
|
||||||
alloc_req <= '0';
|
alloc_req <= '0';
|
||||||
alloc_size <= fill_size;
|
if alloc_OK = '1' then
|
||||||
|
alloc_size <= fill_size;
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process;
|
||||||
|
|
||||||
|
------------------------------------------------------------------
|
||||||
|
host_alloc_armed_register:
|
||||||
|
process(clk)
|
||||||
|
begin
|
||||||
|
if rising_edge(clk) then
|
||||||
|
if reset_en = '1' or ctrl_in.pkt_commit_en = '1' or ctrl_in.pkt_alloc_en = '1' then
|
||||||
|
ctrl_out.pkt_armed <= '0';
|
||||||
|
elsif alloc_ack = '1' then
|
||||||
|
ctrl_out.pkt_armed <= alloc_OK;
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process;
|
||||||
|
|
||||||
|
------------------------------------------------------------------
|
||||||
|
alloc_eval_logic:
|
||||||
|
process(clk)
|
||||||
|
begin
|
||||||
|
if rising_edge(clk) then
|
||||||
|
alloc_OK <= '0';
|
||||||
|
if fill_size < nwords_free then
|
||||||
|
alloc_OK <= '1';
|
||||||
end if;
|
end if;
|
||||||
end if;
|
end if;
|
||||||
end process;
|
end process;
|
||||||
@@ -280,20 +307,6 @@ fill_base_logic:
|
|||||||
end if;
|
end if;
|
||||||
end process;
|
end process;
|
||||||
|
|
||||||
------------------------------------------------------------------
|
|
||||||
alloc_eval_logic:
|
|
||||||
process(clk)
|
|
||||||
begin
|
|
||||||
if rising_edge(clk) then
|
|
||||||
alloc_OK <= '0';
|
|
||||||
if alloc_req = '1' then
|
|
||||||
if fill_size < nwords_free then
|
|
||||||
alloc_OK <= '1';
|
|
||||||
end if;
|
|
||||||
end if;
|
|
||||||
end if;
|
|
||||||
end process;
|
|
||||||
|
|
||||||
------------------------------------------------------------------
|
------------------------------------------------------------------
|
||||||
nwords_free_counter:
|
nwords_free_counter:
|
||||||
process(clk)
|
process(clk)
|
||||||
@@ -302,7 +315,7 @@ nwords_free_counter:
|
|||||||
if reset_en = '1' then
|
if reset_en = '1' then
|
||||||
nwords_free <= (others => '1');
|
nwords_free <= (others => '1');
|
||||||
elsif mem_alloc_en = '1' then
|
elsif mem_alloc_en = '1' then
|
||||||
nwords_free <= nwords_free - fill_size;
|
nwords_free <= nwords_free - alloc_size;
|
||||||
elsif mem_free_en = '1' then
|
elsif mem_free_en = '1' then
|
||||||
nwords_free <= nwords_free + xfer_size;
|
nwords_free <= nwords_free + xfer_size;
|
||||||
end if;
|
end if;
|
||||||
|
|||||||
Reference in New Issue
Block a user