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
- from Rev 10 to Rev 11
- ↔ Reverse comparison
Rev 10 → Rev 11
/rtl/vhdl/search_item.vhd
0,0 → 1,184
--//////////////////////////////////////////////////////////////////// |
--// //// |
--// search_item.vhd //// |
--// //// |
--// This file is part of the open_hitter opencores effort. //// |
--// <http://www.opencores.org/cores/open_hitter/> //// |
--// //// |
--// Module Description: //// |
--// This is the multipelexed search's repeated item. The project //// |
--// buses perform the multiplex and are experienced by each item //// |
--// as b1_* - input to search_item //// |
--// b2_* - output from search_item //// |
--// there is also a small state-machine in each search_item. //// |
--// For now, the count of number of states is fixed, per px_type //// |
--// //// |
--// To Do: //// |
--// //// |
--// Author(s): //// |
--// - Stephen Hawes //// |
--// //// |
--//////////////////////////////////////////////////////////////////// |
--// //// |
--// Copyright (C) 2015 Stephen Hawes and OPENCORES.ORG //// |
--// //// |
--// This source file may be used and distributed without //// |
--// restriction provided that this copyright statement is not //// |
--// removed from the file and that any derivative work contains //// |
--// the original copyright notice and the associated disclaimer. //// |
--// //// |
--// This source file is free software; you can redistribute it //// |
--// and/or modify it under the terms of the GNU Lesser General //// |
--// Public License as published by the Free Software Foundation; //// |
--// either version 2.1 of the License, or (at your option) any //// |
--// later version. //// |
--// //// |
--// This source is distributed in the hope that it will be //// |
--// useful, but WITHOUT ANY WARRANTY; without even the implied //// |
--// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// |
--// PURPOSE. See the GNU Lesser General Public License for more //// |
--// details. //// |
--// //// |
--// You should have received a copy of the GNU Lesser General //// |
--// Public License along with this source; if not, download it //// |
--// from <http://www.opencores.org/lgpl.shtml> //// |
--// //// |
--//////////////////////////////////////////////////////////////////// |
--// |
--// \$Id\$ TAKE OUT THE \'s and this comment in order to get this to work |
--// |
--// CVS Revision History |
--// |
--// \$Log\$ TAKE OUT THE \'s and this comment in order to get this to work |
--// |
library ieee; |
use ieee.std_logic_1164.all; |
|
entity search_item is |
port ( |
RX_CLK: in std_logic; |
-- 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 |
-- 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 |
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 |
); |
end search_item; |
|
architecture search_item_implementation of search_item is |
signal state : integer range 0 to 16 := 16; |
-- pxdata: out price_packet |
signal store_px_type: std_logic_vector(4 downto 0) := (others => '0'); |
signal store_buy_sell: std_logic_vector(2 downto 0) := (others => '0'); -- 111 buy, 000 sell |
signal store_px: std_logic_vector(15 downto 0) := (others => '0'); -- price |
signal store_qty: std_logic_vector(15 downto 0) := (others => '0'); -- quantity |
signal store_sec: std_logic_vector(55 downto 0) := (others => '0'); -- 7x 8bits securities identifier |
signal store_id: std_logic_vector(15 downto 0) := (others => '0'); -- unique/identifier/counter |
begin |
match: process (RX_CLK) is |
begin |
if rising_edge(RX_CLK) then |
if b1_px_valid then |
|
case b1_px_type is |
when '0000' => |
-- do reset store and outputs |
store_px_type <= (others => '0'); |
store_buy_sell <= (others => '0'); -- 111 buy, 000 sell |
store_px <= (others => '0'); -- price |
store_qty <= (others => '0'); -- quantity |
store_sec <= (others => '0'); -- 7x 8bits securities identifier |
store_id <= (others => '0'); -- unique/identifier/counter |
-- |
b2_px_type <= (others => 'Z'); |
b2_buy_sell <= (others => 'Z'); -- 111 buy, 000 sell |
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_px_type <== '0000'; |
state <= 8; |
|
when '0110' => |
-- do set store from incoming price |
store_px_type <= b1_px_type; |
store_buy_sell <= b1_buy_sell; |
store_px <= b1_px; |
store_qty <= b1_qty; |
store_sec <= b1_sec; |
store_id <= b1_id; |
-- |
b2_px_type <== '0000'; |
state <= 8; |
|
when '0101' => |
-- 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') |
-- 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) ) |
-- no deal: this is the correct store_item but there's no match |
b2_px_type <== '0000'; |
state <= 8; |
else |
-- send a return order |
b2_px_type <= '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_id <= store_id; -- unique/identifier/counter |
-- update the store |
store_qty <= (store_qty-b1_qty) when (b1_qty < store_qty) else 0; |
state <= 1; |
end if; |
|
when others => null; |
end case; -- b1_px_type |
|
else -- b1_px_valid |
-- no incoming b1_px so check for state machine actions |
case state is |
when 1 => |
-- sent return order, so clean up |
b2_px_type <= (others => 'Z'); |
b2_buy_sell <= (others => 'Z'); -- 111 buy, 000 sell |
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 |
state <= 16; |
|
when 8 => |
-- correct store_item but there was no match |
b2_px_type <== 'ZZZZ'; |
state <= 16; |
|
when others => null; |
end case; -- state |
|
if (state < 16) then |
state <= state + 1; |
end if; |
|
end if; -- b1_px_valid |
|
end if; |
end process match; |
|
end search_item_implementation; |
|