OpenCores
URL https://opencores.org/ocsvn/open_hitter/open_hitter/trunk

Subversion Repositories open_hitter

[/] [open_hitter/] [trunk/] [rtl/] [vhdl/] [search_item.vhd] - Diff between revs 14 and 17

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 14 Rev 17
Line 8... Line 8...
--// Module Description:                                          ////
--// Module Description:                                          ////
--// This is the multipelexed search's repeated item. The project ////
--// This is the multipelexed search's repeated item. The project ////
--// buses perform the multiplex and are experienced by each item ////
--// buses perform the multiplex and are experienced by each item ////
--// as b1_* - input to search_item                               ////
--// as b1_* - input to search_item                               ////
--//    b2_* - output from search_item                            ////
--//    b2_* - output from search_item                            ////
--// there is also a small state-machine in each search_item.     ////
--// this version of search_item is stateless i.e. can be queried ////
--// For now, the count of number of states is fixed, per px_type ////
--// every clock cycle                                            ////
--//                                                              ////
--//                                                              ////
--// To Do:                                                       ////
--// To Do:                                                       ////
--//                                                              ////
--//                                                              ////
--// Author(s):                                                   ////
--// Author(s):                                                   ////
--// - Stephen Hawes                                              ////
--// - Stephen Hawes                                              ////
Line 52... Line 52...
--// \$Log\$  TAKE OUT THE \'s and this comment in order to get this to work
--// \$Log\$  TAKE OUT THE \'s and this comment in order to get this to work
--//
--//
library ieee;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_1164.all;
use ieee.numeric_std.ALL;
use ieee.numeric_std.ALL;
 
--use std.textio.all; --  Imports the standard textio package.
 
 
entity search_item is
entity search_item is
   generic ( item_id: std_logic_vector(15 downto 0) );
   generic ( item_id: std_logic_vector(15 downto 0) );
   port (
   port (
        RX_CLK: in std_logic;
        RX_CLK: in std_logic;
Line 77... Line 78...
           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;
end search_item;
 
 
architecture search_item_implementation of search_item is
architecture search_item_implementation of search_item is
      signal state : integer range 0 to 16 := 16;
      -- signal state : integer range 0 to 16 := 16;
 
      signal requires_reset: std_logic := '0';
   -- pxdata: out price_packet
   -- pxdata: out price_packet
      signal store_px_type: std_logic_vector(4 downto 0) := (others => '0');
      signal store_px_type: std_logic_vector(4 downto 0) := (others => 'Z');
      signal store_buy_sell: std_logic_vector(2 downto 0) := (others => '0');   -- 111 buy, 000 sell
      signal store_buy_sell: std_logic_vector(2 downto 0) := (others => 'Z');   -- 111 buy, 000 sell
      signal store_px: std_logic_vector(15 downto 0) := (others => '0');     -- price
      signal store_px: std_logic_vector(15 downto 0) := (others => 'Z');     -- price
      signal store_qty: std_logic_vector(15 downto 0) := (others => '0');    -- quantity
      signal store_qty: std_logic_vector(15 downto 0) := (others => 'Z');    -- quantity
      signal store_sec: std_logic_vector(55 downto 0) := (others => '0');    -- 7x 8bits securities identifier
      signal store_sec: std_logic_vector(55 downto 0) := (others => 'Z');    -- 7x 8bits securities identifier
      signal store_id: std_logic_vector(15 downto 0) := (others => '0');     -- unique/identifier/counter
 
begin
begin
   match: process (RX_CLK) is
   match: process (RX_CLK) is
 
--        variable l : line;
   begin
   begin
      if rising_edge(RX_CLK) then
      if rising_edge(RX_CLK) then
 
   --   if falling_edge(RX_CLK) then
         if b1_px_valid = '1' then
         if b1_px_valid = '1' then
 
 
 
--        write (l, String'("  Item Rising Edge "));
 
--                for j in b1_id'range loop
 
--                    write(l, std_logic'image(b1_id(j)) );
 
--                 end loop;
 
--                write (l, String'(" instruction:  "));
 
--                for j in b1_px_type'range loop
 
--                    write(l, std_logic'image(b1_px_type(j)) );
 
--                 end loop;
 
--        writeline ( output, l);
 
 
 
 
            if b1_px_type = std_logic_vector'("00000") then
            if b1_px_type = std_logic_vector'("00000") then
                   -- do reset store and outputs
                   -- do reset store and outputs
                   store_px_type  <= (others => '0');
                   store_px_type  <= (others => '0');
                   store_buy_sell <= (others => '0');   -- 111 buy, 000 sell
                   store_buy_sell <= (others => '0');   -- 111 buy, 000 sell
                   store_px       <= (others => '0');   -- price
                   store_px       <= (others => '0');   -- price
                   store_qty      <= (others => '0');   -- quantity
                   store_qty      <= (others => '0');   -- quantity
                   store_sec      <= (others => '0');   -- 7x 8bits securities identifier
                   store_sec      <= (others => '0');   -- 7x 8bits securities identifier
              -- not reset / generic     store_id       <= (others => '0');   -- unique/identifier/counter
 
                   --
                   --
                   b2_px_type  <= (others => 'Z');
                   b2_px_type  <= (others => 'Z');
                   b2_buy_sell <= (others => 'Z');   -- 111 buy, 000 sell
                   b2_buy_sell <= (others => 'Z');   -- 111 buy, 000 sell
                   b2_px       <= (others => 'Z');   -- price
                   b2_px       <= (others => 'Z');   -- price
                   b2_qty      <= (others => 'Z');   -- quantity
                   b2_qty      <= (others => 'Z');   -- quantity
                   b2_sec      <= (others => 'Z');   -- 7x 8bits securities identifier
                   b2_sec      <= (others => 'Z');   -- 7x 8bits securities identifier
                   b2_id       <= (others => 'Z');   -- unique/identifier/counter
                   b2_id       <= (others => 'Z');   -- unique/identifier/counter
                   --
                   --
                   b2_px_type <= std_logic_vector'("ZZZZZ");
                   requires_reset <= '0';
                   state <= 16;
 
 
 
            elsif b1_px_type = std_logic_vector'("00110") then
            elsif b1_px_type = std_logic_vector'("00110") then
                  if store_buy_sell = b1_buy_sell and
                  if store_buy_sell = b1_buy_sell and
                     store_sec      = b1_sec  then
                     store_sec      = b1_sec  then
                       -- do set store from incoming price 
                       -- do set store from incoming price 
                       store_px_type  <= b1_px_type;
                       store_px_type  <= b1_px_type;
                       -- store_buy_sell <= b1_buy_sell;
                       -- store_buy_sell <= b1_buy_sell;
                       store_px       <= b1_px;
                       store_px       <= b1_px;
                       store_qty      <= b1_qty;
                       store_qty      <= b1_qty;
                       -- store_sec      <= b1_sec;
 
                       store_id       <= b1_id;
 
                       --
                       --
                       b2_px_type <= std_logic_vector'(std_logic_vector'("00110"));
                       b2_px_type <= std_logic_vector'(std_logic_vector'("00110"));
                       state <= 8;
                       b2_buy_sell <= (others => 'Z');
 
                       b2_px       <= (others => 'Z');
 
                       b2_qty      <= (others => 'Z');
 
                       b2_sec      <= (others => 'Z');
 
                       b2_id       <= (others => 'Z');
 
                       requires_reset <= '1';
 
                   else
 
                       if requires_reset = '1' then
 
                          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
 
                          requires_reset <= '0';
 
                       end if;
                   end if;
                   end if;
 
 
            elsif b1_px_type = std_logic_vector'("01010") then
            elsif b1_px_type = std_logic_vector'("01010") then
                   if item_id = b1_id then
                   if item_id = b1_id then
                       -- do set store and security from incoming price 
                       -- do set store and security from incoming price 
                       store_px_type  <= b1_px_type;
                       store_px_type  <= b1_px_type;
                       store_buy_sell <= b1_buy_sell;
                       store_buy_sell <= b1_buy_sell;
                       store_px       <= b1_px;
                       store_px       <= b1_px;
                       store_qty      <= b1_qty;
                       store_qty      <= b1_qty;
                       store_sec      <= b1_sec;
                       store_sec      <= b1_sec;
                       store_id       <= b1_id;
 
                       --
                       --
                       b2_px_type <= b1_px_type;
                       b2_px_type  <= std_logic_vector'(std_logic_vector'("01010"));
 
                       b2_buy_sell <= (others => 'Z');
 
                       b2_px       <= (others => 'Z');
 
                       b2_qty      <= (others => 'Z');
 
                       b2_sec      <= (others => 'Z');
                       b2_id      <= item_id;
                       b2_id      <= item_id;
                       state <= 8;
                       requires_reset <= '1';
 
                   else
 
                       if requires_reset = '1' then
 
                          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
 
                          requires_reset <= '0';
 
                       end if;
                   end if;
                   end if;
 
 
            elsif b1_px_type = std_logic_vector'("11100") then
            elsif b1_px_type = std_logic_vector'("11100") then
                   -- incoming price, register it and start the state machine
                   -- incoming price, register it and start the state machine
                   if (store_sec /= b1_sec or store_buy_sell = b1_buy_sell ) then
                   if (store_sec /= b1_sec or store_buy_sell = b1_buy_sell ) then
                      -- not this store_item instance no action
                       if requires_reset = '1' then
                      null;
                          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
 
                          requires_reset <= '0';
 
                       end if;
                   elsif (to_integer(unsigned(store_qty)) = 0 or to_integer(unsigned(b1_qty)) = 0 or
                   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'("111") and store_px < b1_px) or
                             (store_buy_sell = std_logic_vector'("000") and store_px > b1_px) ) then
                             (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
                      -- no deal: this is the correct store_item but there's no match
                      b2_px_type <= std_logic_vector'(std_logic_vector'("11101"));
                      b2_px_type <= std_logic_vector'(std_logic_vector'("11101"));
 
                      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
 
                      requires_reset <= '1';
                   else
                   else
                      -- send a return order
                      -- send a return order
                      b2_buy_sell <= store_buy_sell;   -- 111 buy, 000 sell
                      b2_buy_sell <= store_buy_sell;   -- 111 buy, 000 sell
                      b2_sec <= store_sec;                                          -- 7x 8bits securities identifier
                      b2_sec <= store_sec;                                          -- 7x 8bits securities identifier
                      b2_id <= store_id;                                            -- unique/identifier/counter
                      b2_id <= item_id;                                            -- unique/identifier/counter
                      b2_px <= b1_px;                   -- price
                      b2_px <= b1_px;                   -- price
                      -- b2_qty <= 
                      -- b2_qty <= 
                      if b1_qty < store_qty then
                      if b1_qty < store_qty then
                         b2_qty <= b1_qty;
                         b2_qty <= b1_qty;
                      else
                      else
Line 170... Line 221...
                         store_qty <= std_logic_vector(to_unsigned( to_integer(unsigned(store_qty)) - to_integer(unsigned(b1_qty)) ,16 ));
                         store_qty <= std_logic_vector(to_unsigned( to_integer(unsigned(store_qty)) - to_integer(unsigned(b1_qty)) ,16 ));
                      else
                      else
                         store_qty <= (others => '0');
                         store_qty <= (others => '0');
                      end  if;
                      end  if;
                      b2_px_type <= std_logic_vector'(std_logic_vector'("11100"));
                      b2_px_type <= std_logic_vector'(std_logic_vector'("11100"));
 
                      requires_reset <= '1';
                   end if;
                   end if;
                   state <= 8;
 
 
 
            else
            else
               -- no action
               -- no action
               null;
                       if requires_reset = '1' then
 
                          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
 
                          requires_reset <= '0';
 
                       end if;
            end if;   -- b1_px_type
            end if;   -- b1_px_type
 
 
         else     -- b1_px_valid
         else     -- b1_px_valid
            -- no incoming b1_px so check for state machine actions
            if requires_reset = '1' then
            case state is
 
               when 8 =>
 
                   -- sent return order, so clean up
 
                   b2_px_type  <= (others => 'Z');
                   b2_px_type  <= (others => 'Z');
                   b2_buy_sell <= (others => 'Z');    -- 111 buy, 000 sell
                   b2_buy_sell <= (others => 'Z');    -- 111 buy, 000 sell
                   b2_px       <= (others => 'Z');    -- price
                   b2_px       <= (others => 'Z');    -- price
                   b2_qty      <= (others => 'Z');    -- quantity
                   b2_qty      <= (others => 'Z');    -- quantity
                   b2_sec      <= (others => 'Z');    -- 7x 8bits securities identifier
                   b2_sec      <= (others => 'Z');    -- 7x 8bits securities identifier
                   b2_id       <= (others => 'Z');    -- unique/identifier/counter
                   b2_id       <= (others => 'Z');    -- unique/identifier/counter
                   --
               requires_reset <= '0';
                   b2_px_type <= std_logic_vector'("ZZZZZ");
 
                   state <= 16;
 
 
 
               when others => null;
 
            end case;   -- state
 
 
 
            if (state < 16) then
 
               state <= state + 1;
 
            end if;
            end if;
 
 
         end if;     -- b1_px_valid
         end if;     -- b1_px_valid
 
 
 
--              b2_id       <=  std_logic_vector'(X"0000");  -- testing
 
 
      end if;
      end if;
   end process match;
   end process match;
 
 
end search_item_implementation;
end search_item_implementation;
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.