URL
https://opencores.org/ocsvn/open_hitter/open_hitter/trunk
Subversion Repositories open_hitter
Compare Revisions
- This comparison shows the changes necessary to convert path
/open_hitter/trunk/rtl
- from Rev 11 to Rev 12
- ↔ Reverse comparison
Rev 11 → Rev 12
/vhdl/search_item.vhd
53,6 → 53,7
--// |
library ieee; |
use ieee.std_logic_1164.all; |
use ieee.numeric_std.ALL; |
|
entity search_item is |
port ( |
60,12 → 61,12
-- control flag(s) on the incoming bus |
b1_px_valid: in std_logic; |
-- pxdata: in price_packet |
b1_px_type: out std_logic_vector(4 downto 0); |
b1_buy_sell: out std_logic_vector(2 downto 0); -- 111 buy, 000 sell |
b1_px: out std_logic_vector(15 downto 0); -- price |
b1_qty: out std_logic_vector(15 downto 0); -- quantity |
b1_sec: out std_logic_vector(55 downto 0); -- 7x 8bits securities identifier |
b1_id: out std_logic_vector(15 downto 0); -- unique/identifier/counter |
b1_px_type: in std_logic_vector(4 downto 0); |
b1_buy_sell: in std_logic_vector(2 downto 0); -- 111 buy, 000 sell |
b1_px: in std_logic_vector(15 downto 0); -- price |
b1_qty: in std_logic_vector(15 downto 0); -- quantity |
b1_sec: in std_logic_vector(55 downto 0); -- 7x 8bits securities identifier |
b1_id: in std_logic_vector(15 downto 0); -- unique/identifier/counter |
-- pxdata: out price_packet |
b2_px_type: out std_logic_vector(4 downto 0); |
b2_buy_sell: out std_logic_vector(2 downto 0); -- 111 buy, 000 sell |
72,7 → 73,7
b2_px: out std_logic_vector(15 downto 0); -- price |
b2_qty: out std_logic_vector(15 downto 0); -- quantity |
b2_sec: out std_logic_vector(55 downto 0); -- 7x 8bits securities identifier |
b2_id: out std_logic_vector(15 downto 0); -- unique/identifier/counter |
b2_id: out std_logic_vector(15 downto 0) -- unique/identifier/counter |
); |
end search_item; |
|
89,10 → 90,9
match: process (RX_CLK) is |
begin |
if rising_edge(RX_CLK) then |
if b1_px_valid then |
if b1_px_valid = '0' then |
|
case b1_px_type is |
when '0000' => |
if b1_px_type = std_logic_vector'("0000") then |
-- do reset store and outputs |
store_px_type <= (others => '0'); |
store_buy_sell <= (others => '0'); -- 111 buy, 000 sell |
108,10 → 108,10
b2_sec <= (others => 'Z'); -- 7x 8bits securities identifier |
b2_id <= (others => 'Z'); -- unique/identifier/counter |
-- |
b2_px_type <== '0000'; |
b2_px_type <= std_logic_vector'(std_logic_vector'("0000")); |
state <= 8; |
|
when '0110' => |
elsif b1_px_type = std_logic_vector'("0110") then |
-- do set store from incoming price |
store_px_type <= b1_px_type; |
store_buy_sell <= b1_buy_sell; |
120,35 → 120,47
store_sec <= b1_sec; |
store_id <= b1_id; |
-- |
b2_px_type <== '0000'; |
b2_px_type <= std_logic_vector'(std_logic_vector'("0000")); |
state <= 8; |
|
when '0101' => |
elsif b1_px_type = std_logic_vector'("0101") then |
-- incoming price, register it and start the state machine |
if (store_sec != b1_sec or store_buy_sell == b1_buy_sell or store_px_type != '0110') |
if (store_sec /= b1_sec or store_buy_sell = b1_buy_sell or store_px_type /= std_logic_vector'(std_logic_vector'("0110")) ) then |
-- not this store_item instance no action, also stop anything that might be going on |
state <= 14; |
elsif (store_qty == 0 or b1_qty == 0 or |
(store_buy_sell == '111' and store_px < b1_px) or |
(store_buy_sell == '000' and store_px > b1_px) ) |
elsif (to_integer(unsigned(store_qty)) = 0 or to_integer(unsigned(b1_qty)) = 0 or |
(store_buy_sell = std_logic_vector'("111") and store_px < b1_px) or |
(store_buy_sell = std_logic_vector'("000") and store_px > b1_px) ) then |
-- no deal: this is the correct store_item but there's no match |
b2_px_type <== '0000'; |
b2_px_type <= std_logic_vector'(std_logic_vector'("0000")); |
state <= 8; |
else |
-- send a return order |
b2_px_type <= '1010'; |
b2_px_type <= std_logic_vector'("1010"); |
b2_buy_sell <= store_buy_sell; -- 111 buy, 000 sell |
b2_px <= b1_px; -- price |
b2_qty <= b1_qty when (b1_qty < store_qty) else store_qty; -- quantity |
b2_sec <= store_sec: -- 7x 8bits securities identifier |
-- b2_qty <= |
if b1_qty < store_qty then |
b2_qty <= b1_qty; |
else |
b2_qty <= store_qty; |
end if; -- quantity |
b2_sec <= store_sec; -- 7x 8bits securities identifier |
b2_id <= store_id; -- unique/identifier/counter |
-- update the store |
store_qty <= (store_qty-b1_qty) when (b1_qty < store_qty) else 0; |
state <= 1; |
-- store_qty |
if (b1_qty < store_qty) then |
store_qty <= std_logic_vector(to_unsigned( to_integer(unsigned(store_qty)) - to_integer(unsigned(b1_qty)) ,16 )); |
else |
store_qty <= (others => '0'); |
state <= 1; |
end if; |
end if; |
|
when others => null; |
end case; -- b1_px_type |
else |
-- no action |
null; |
end if; -- b1_px_type |
|
else -- b1_px_valid |
-- no incoming b1_px so check for state machine actions |
160,12 → 172,12
b2_px <= (others => 'Z'); -- price |
b2_qty <= (others => 'Z'); -- quantity |
b2_sec <= (others => 'Z'); -- 7x 8bits securities identifier |
b2_id <= (others => 'Z'): -- unique/identifier/counter |
b2_id <= (others => 'Z'); -- unique/identifier/counter |
state <= 16; |
|
when 8 => |
-- correct store_item but there was no match |
b2_px_type <== 'ZZZZ'; |
b2_px_type <= std_logic_vector'("ZZZZ"); |
state <= 16; |
|
when others => null; |