OpenCores
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/sim/rtl_sim
    from Rev 10 to Rev 20
    Reverse comparison

Rev 10 → Rev 20

/src/hitter_sim.vhd
62,35 → 62,64
end hitter_sim;
 
architecture implementation of hitter_sim is
component parse_price_sim
component search_control_sim
port (
RX_CLK: in std_logic;
restart: in std_logic;
processing: out std_logic;
result_is_ok: out std_logic
result_one: out std_logic;
result_two: out std_logic;
result_all_ok: out std_logic
);
end component;
for parse_price_sim_0: parse_price_sim use entity work.parse_price_sim;
for search_control_sim_0: search_control_sim use entity work.search_control_sim;
--signal RX_CLK: std_logic;
signal restart: std_logic;
signal processing: std_logic;
signal result_is_ok: std_logic;
signal result_one: std_logic;
signal result_two: std_logic;
signal result_all_ok: std_logic;
--
--temporarily commented
--component parse_price_sim
-- port (
-- RX_CLK: in std_logic;
-- restart: in std_logic;
-- processing: out std_logic;
-- result_is_ok: out std_logic
-- );
--end component;
--for parse_price_sim_0: parse_price_sim use entity work.parse_price_sim;
-- --signal RX_CLK: std_logic;
-- signal restart: std_logic;
-- signal processing: std_logic;
-- signal result_is_ok: std_logic;
--
signal alight: std_logic := '0';
signal pos: integer := 0;
begin
parse_price_sim_0: parse_price_sim port map (
search_control_sim_0: search_control_sim port map (
RX_CLK => RX_CLK,
restart => restart,
processing => processing,
result_is_ok => result_is_ok
result_one => result_one,
result_two => result_two,
result_all_ok => result_all_ok
);
--
--temporarily commented
--parse_price_sim_0: parse_price_sim port map (
-- RX_CLK => RX_CLK,
-- restart => restart,
-- processing => processing,
-- result_is_ok => result_is_ok
--);
--
flasher: process (RX_CLK) is
begin
if rising_edge(RX_CLK) then
if (pos < 4) then -- ghdl flash
-- if (pos < 62500000) then -- 125Mhz timing / 0.5s
-- if (pos < 62500000) then -- 125Mhz timing / 0.5s
pos <= pos + 1;
else
alight <= not alight;
99,11 → 128,11
end if;
end process flasher;
 
LEDS_POSITIONS_TRI_O(0) <= alight;
LEDS_POSITIONS_TRI_O(1) <= result_is_ok;
LEDS_POSITIONS_TRI_O(2) <= result_is_ok;
LEDS_POSITIONS_TRI_O(3) <= processing;
LEDS_POSITIONS_TRI_O(4) <= alight;
LEDS_POSITIONS_TRI_O(0) <= processing; -- C
LEDS_POSITIONS_TRI_O(1) <= alight; -- W
LEDS_POSITIONS_TRI_O(2) <= result_one; -- S
LEDS_POSITIONS_TRI_O(3) <= result_two; -- N
LEDS_POSITIONS_TRI_O(4) <= result_all_ok; -- E
restart <= PUSH_BUTTONS_5BITS_TRI_I(0);
end implementation;
 
/src/search_control_sim.vhd
0,0 → 1,299
--////////////////////////////////////////////////////////////////////
--// ////
--// search_control_sim.vhd ////
--// ////
--// This file is part of the open_hitter opencores effort. ////
--// <http://www.opencores.org/cores/open_hitter/> ////
--// ////
--// Module Description: ////
--// Simulation program (synthesizable) ////
--// Unit test for search_control.vhd ////
--// ////
--// To Do: ////
--// #LOTS ////
--// ////
--// 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;
use ieee.numeric_std.ALL;
 
entity search_control_sim is
port (
RX_CLK: in std_logic;
restart: in std_logic;
processing: out std_logic;
result_one: out std_logic;
result_two: out std_logic;
result_all_ok: out std_logic
);
end search_control_sim;
architecture behav of search_control_sim is
component search_control is
generic ( searchitems : integer );
port (
RX_CLK: in std_logic;
-- control flag(s) on the incoming bus
search_px_valid_i: in std_logic;
-- pxdata: in price_packet
search_px_type_i: in std_logic_vector(4 downto 0);
search_buy_sell_i: in std_logic_vector(2 downto 0); -- 111 buy, 000 sell
search_px_i: in std_logic_vector(15 downto 0); -- price
search_qty_i: in std_logic_vector(15 downto 0); -- quantity
search_sec_i: in std_logic_vector(55 downto 0); -- 7x 8bits securities identifier
search_id_i: in std_logic_vector(15 downto 0); -- unique/identifier/counter
-- pxdata: out price_packet
order_px_type_o: out std_logic_vector(4 downto 0);
order_buy_sell_o: out std_logic_vector(2 downto 0); -- 111 buy, 000 sell
order_px_o: out std_logic_vector(15 downto 0); -- price
order_qty_o: out std_logic_vector(15 downto 0); -- quantity
order_sec_o: out std_logic_vector(55 downto 0); -- 7x 8bits securities identifier
order_id_o: out std_logic_vector(15 downto 0); -- unique/identifier/counter
-- control flag(s) on the outgoing bus
order_px_valid_o: out std_logic
);
end component;
for search_control_0: search_control use entity work.search_control;
-- control flag(s) on the incoming bus
signal search_px_valid_i: std_logic;
-- pxdata: in price_packet
signal search_px_type_i: std_logic_vector(4 downto 0);
signal search_buy_sell_i: std_logic_vector(2 downto 0); -- 111 buy, 000 sell
signal search_px_i: std_logic_vector(15 downto 0); -- price
signal search_qty_i: std_logic_vector(15 downto 0); -- quantity
signal search_sec_i: std_logic_vector(55 downto 0); -- 7x 8bits securities identifier
signal search_id_i: std_logic_vector(15 downto 0); -- unique/identifier/counter
-- pxdata: out price_packet
signal order_px_type_o: std_logic_vector(4 downto 0);
signal order_buy_sell_o: std_logic_vector(2 downto 0); -- 111 buy, 000 sell
signal order_px_o: std_logic_vector(15 downto 0); -- price
signal order_qty_o: std_logic_vector(15 downto 0); -- quantity
signal order_sec_o: std_logic_vector(55 downto 0); -- 7x 8bits securities identifier
signal order_id_o: std_logic_vector(15 downto 0); -- unique/identifier/counter
-- control
signal order_px_valid_o: std_logic;
begin
-- Component instantiation.
search_control_0: search_control
generic map ( searchitems => 4 ) -- for test case when full at 4 orders
port map (
RX_CLK => RX_CLK,
-- control flag(s) on the incoming bus
search_px_valid_i => search_px_valid_i,
-- pxdata: in price_packet
search_px_type_i => search_px_type_i,
search_buy_sell_i => search_buy_sell_i,
search_px_i => search_px_i,
search_qty_i => search_qty_i,
search_sec_i => search_sec_i,
search_id_i => search_id_i,
-- pxdata: out price_packet
order_px_type_o => order_px_type_o,
order_buy_sell_o => order_buy_sell_o,
order_px_o => order_px_o,
order_qty_o => order_qty_o,
order_sec_o => order_sec_o,
order_id_o => order_id_o,
-- control
order_px_valid_o => order_px_valid_o
);
--
process (RX_CLK) is
type input_pattern_type is record
-- control flag(s) on the incoming bus
search_px_valid_i: std_logic;
-- pxdata: in price_packet
search_px_type_i: std_logic_vector(4 downto 0);
search_buy_sell_i: std_logic_vector(2 downto 0); -- 111 buy, 000 sell
search_px_i: std_logic_vector(15 downto 0); -- price
search_qty_i: std_logic_vector(15 downto 0); -- quantity
search_sec_i: std_logic_vector(55 downto 0); -- 7x 8bits securities identifier
-- search_id_i: std_logic_vector(15 downto 0); -- unique/identifier/counter
end record;
type output_pattern_type is record
-- pxdata: out price_packet
order_px_type_o: std_logic_vector(4 downto 0);
order_buy_sell_o: std_logic_vector(2 downto 0); -- 111 buy, 000 sell
order_px_o: std_logic_vector(15 downto 0); -- price
order_qty_o: std_logic_vector(15 downto 0); -- quantity
order_sec_o: std_logic_vector(55 downto 0); -- 7x 8bits securities identifier
order_id_o: std_logic_vector(15 downto 0); -- unique/identifier/counter
end record;
 
-- The patterns to apply.
constant zz_px: std_logic_vector(15 downto 0) := (others => 'Z');
constant zz_qty: std_logic_vector(15 downto 0) := (others => 'Z');
constant zz_sec: std_logic_vector(55 downto 0) := (others => 'Z');
constant zz_id: std_logic_vector(15 downto 0) := (others => 'Z');
constant set_qty: std_logic_vector(15 downto 0) := std_logic_vector'("0000000000010000");
constant test_px: std_logic_vector(15 downto 0) := std_logic_vector'("0000000011100000");
constant test_qty: std_logic_vector(15 downto 0) := std_logic_vector'("0000000000001100");
constant remain_qty: std_logic_vector(15 downto 0) := std_logic_vector'("0000000000000100");
constant test_sec0: std_logic_vector(55 downto 0) := std_logic_vector'(X"ABA544223478DC");
constant test_sec1: std_logic_vector(55 downto 0) := std_logic_vector'(X"ABA543332178DC");
constant test_sec2: std_logic_vector(55 downto 0) := std_logic_vector'(X"ABA234234378DC");
constant test_sec3: std_logic_vector(55 downto 0) := std_logic_vector'(X"ABA534534578DC");
constant test_id: std_logic_vector(15 downto 0) := std_logic_vector'("0110011001100110");
constant other_id: std_logic_vector(15 downto 0) := std_logic_vector'("0000010001100010");
constant other_px: std_logic_vector(15 downto 0) := std_logic_vector'("0000000000001110");
constant other_sec: std_logic_vector(55 downto 0) := std_logic_vector'(X"CDC423354634AA");
type input_pattern_array is array (natural range <>) of input_pattern_type;
constant input_patterns : input_pattern_array :=
( ('1', std_logic_vector'("00000"), std_logic_vector'("ZZZ"), zz_px, zz_qty, zz_sec), -- 0 reset
('1', std_logic_vector'("ZZZZZ"), std_logic_vector'("ZZZ"), zz_px, zz_qty, zz_sec), -- 1 nothing
('1', std_logic_vector'("00110"), std_logic_vector'("000"), test_px, set_qty, test_sec0), -- 2 sec/set
('1', std_logic_vector'("00110"), std_logic_vector'("000"), test_px, set_qty, test_sec1), -- 3 sec/set
('1', std_logic_vector'("00110"), std_logic_vector'("000"), test_px, set_qty, test_sec1), -- 4 sec/set - repeat
('1', std_logic_vector'("00110"), std_logic_vector'("111"), test_px, set_qty, test_sec2), -- 5 sec/set
('1', std_logic_vector'("00110"), std_logic_vector'("000"), test_px, set_qty, test_sec2), -- 6 sec/set - diff buysell
('1', std_logic_vector'("00110"), std_logic_vector'("000"), test_px, set_qty, test_sec3), -- 7 too many sec/set
('1', std_logic_vector'("11100"), std_logic_vector'("111"), test_px, test_qty, test_sec1), -- 8 incoming px
('1', std_logic_vector'("11100"), std_logic_vector'("111"), test_px, zz_qty, other_sec), -- 9 incoming px (wrong security)
('1', std_logic_vector'("11100"), std_logic_vector'("111"), other_px, test_qty, test_sec1), -- 10incoming px (too low sale price)
('1', std_logic_vector'("11100"), std_logic_vector'("111"), test_px, test_qty, test_sec1) ); -- 11incoming px (part qty)
type output_pattern_array is array (natural range <>) of output_pattern_type;
constant output_patterns : output_pattern_array :=
( (std_logic_vector'("00000"), std_logic_vector'("ZZZ"), zz_px, zz_qty, zz_sec, zz_id), -- 0 reset
(std_logic_vector'("ZZZZZ"), std_logic_vector'("ZZZ"), zz_px, zz_qty, zz_sec, zz_id), -- 1 nothing
(std_logic_vector'("01010"), std_logic_vector'("ZZZ"), zz_px, zz_qty, zz_sec, std_logic_vector'(X"0000")), -- 2 sec/set
(std_logic_vector'("01010"), std_logic_vector'("ZZZ"), zz_px, zz_qty, zz_sec, std_logic_vector'(X"0001")), -- 3 sec/set
(std_logic_vector'("00110"), std_logic_vector'("ZZZ"), zz_px, zz_qty, zz_sec, std_logic_vector'(X"0001")), -- 4 sec/set
(std_logic_vector'("01010"), std_logic_vector'("ZZZ"), zz_px, zz_qty, zz_sec, std_logic_vector'(X"0002")), -- 5 sec/set
(std_logic_vector'("01010"), std_logic_vector'("ZZZ"), zz_px, zz_qty, zz_sec, std_logic_vector'(X"0003")), -- 6 sec/set
(std_logic_vector'("11111"), std_logic_vector'("ZZZ"), zz_px, zz_qty, zz_sec, zz_id), -- 7 bad sec/set (too many)
(std_logic_vector'("11100"), std_logic_vector'("000"), test_px, test_qty, test_sec1, std_logic_vector'(X"0001")), -- 8 incoming px
(std_logic_vector'("11110"), std_logic_vector'("ZZZ"), zz_px, zz_qty, zz_sec, zz_id), -- 9 incoming px (wrong security)
(std_logic_vector'("11101"), std_logic_vector'("ZZZ"), zz_px, zz_qty, zz_sec, zz_id), -- 10incoming px (too low sale price)
(std_logic_vector'("11100"), std_logic_vector'("000"), test_px, remain_qty, test_sec1, std_logic_vector'(X"0001")) ); -- 11incoming px (part qty)
 
-- process control
variable pos: integer;
variable i: integer := 99; -- pattern id
variable subcount: integer := 99; -- pattern step
variable res: integer;
variable res_ok: std_logic;
begin
if rising_edge(RX_CLK) then
if restart = '1' then
i := 0;
subcount := 0;
--
result_all_ok <= '0';
result_one <= '0';
result_two <= '0';
processing <= '0';
end if;
 
-- Pattern step
if i < input_patterns'right+1 then
-- diagnostics (uncomment)
-- write (l, String'("Wrapper start loop i: "));
-- write (l, i);
-- writeline (output, l);
 
processing <= '1';
 
if subcount = 0 then
-- Set the inputs.
search_px_valid_i <= input_patterns(i).search_px_valid_i;
search_px_type_i <= input_patterns(i).search_px_type_i;
search_buy_sell_i <= input_patterns(i).search_buy_sell_i;
search_px_i <= input_patterns(i).search_px_i;
search_qty_i <= input_patterns(i).search_qty_i;
search_sec_i <= input_patterns(i).search_sec_i;
--search_id_i <= input_patterns(i).search_id_i;
res := 0;
res_ok := '1';
subcount := 1;
else
-- reset the go instruction
search_px_valid_i <= '0';
-- Check the outputs.
-- diagnostics (uncomment)
-- write (l, String'(" Wrapper wait results r: "));
-- write (l, r);
-- write (l, String'(" order_px_valid_o: "));
-- write (l, std_logic'image(order_px_valid_o));
-- writeline (output, l);
 
-- got a return .. check it
if order_px_valid_o = '1' then
 
if order_px_type_o /= output_patterns(i).order_px_type_o
or order_buy_sell_o /= output_patterns(i).order_buy_sell_o
or order_px_o /= output_patterns(i).order_px_o
or order_qty_o /= output_patterns(i).order_qty_o
or order_sec_o /= output_patterns(i).order_sec_o
or order_id_o /= output_patterns(i).order_id_o then
--
res_ok := '0';
end if;
res := res + 1;
end if;
 
if subcount = 4 then
-- check result
if res /= 1 then
res_ok := '0';
end if;
 
-- reporting
if i = 11 then
result_all_ok <= res_ok; -- success!
elsif i = 6 then
result_two <= res_ok; -- loader tasks oka
elsif i = 0 then
result_one <= res_ok; -- initial reset worked
end if;
 
-- next pattern
i := i + 1;
subcount := 0;
else
subcount := subcount + 1;
end if;
end if;
else
-- not processing (done or not started)
processing <= '0';
end if; -- i
 
end if; -- RX_CLK
end process;
end behav;

powered by: WebSVN 2.1.0

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