-------------------------------------------------------------------------------------------------100
|
-------------------------------------------------------------------------------------------------100
|
--| Modular Oscilloscope
|
--| Modular Oscilloscope
|
--| UNSL - Argentine
|
--| UNSL - Argentine
|
--|
|
--|
|
--| File: channel_selector.vhd
|
--| File: channel_selector.vhd
|
--| Version: 0.2
|
--| Version: 0.2
|
--| Tested in: Actel A3PE1500
|
--| Tested in: Actel A3PE1500
|
--| Board: RVI Prototype Board + LP Data Conversion Daughter Board
|
--| Board: RVI Prototype Board + LP Data Conversion Daughter Board
|
--|-------------------------------------------------------------------------------------------------
|
--|-------------------------------------------------------------------------------------------------
|
--| Description:
|
--| Description:
|
--| CONTROL - Channel Selector
|
--| CONTROL - Channel Selector
|
--| This controls the comunication with the daq module.
|
--| This controls the comunication with the daq module.
|
--|
|
--|
|
--|-------------------------------------------------------------------------------------------------
|
--|-------------------------------------------------------------------------------------------------
|
--| File history:
|
--| File history:
|
--| 0.1 | jul-2009 | First testing
|
--| 0.1 | jul-2009 | First testing
|
--| 0.2 | jul-2009 | Added generic number of channel
|
--| 0.2 | jul-2009 | Added generic number of channel
|
----------------------------------------------------------------------------------------------------
|
----------------------------------------------------------------------------------------------------
|
--| Copyright ® 2009, Facundo Aguilera.
|
--| Copyright © 2009, Facundo Aguilera.
|
--|
|
--|
|
--| This VHDL design file is an open design; you can redistribute it and/or
|
--| This VHDL design file is an open design; you can redistribute it and/or
|
--| modify it and/or implement it after contacting the author.
|
--| modify it and/or implement it after contacting the author.
|
----------------------------------------------------------------------------------------------------
|
----------------------------------------------------------------------------------------------------
|
|
|
|
|
--==================================================================================================
|
--==================================================================================================
|
-- TODO
|
-- TODO
|
-- · Speed up the design
|
-- · Speed up the design
|
--==================================================================================================
|
--==================================================================================================
|
|
|
|
|
library ieee;
|
library ieee;
|
use ieee.std_logic_1164.all;
|
use ieee.std_logic_1164.all;
|
--use IEEE.STD_LOGIC_UNSIGNED.ALL;
|
--use IEEE.STD_LOGIC_UNSIGNED.ALL;
|
use IEEE.NUMERIC_STD.ALL;
|
use IEEE.NUMERIC_STD.ALL;
|
use ieee.math_real.all;
|
use ieee.math_real.all;
|
|
|
|
|
|
|
----------------------------------------------------------------------------------------------------
|
----------------------------------------------------------------------------------------------------
|
----------------------------------------------------------------------------------------------------
|
----------------------------------------------------------------------------------------------------
|
entity channel_selector is
|
entity channel_selector is
|
generic(
|
generic(
|
N_CHANNELS: integer := 16 -- number of channels
|
N_CHANNELS: integer := 16 -- number of channels
|
);
|
);
|
port(
|
port(
|
channels_I: in std_logic_vector(N_CHANNELS-1 downto 0);
|
channels_I: in std_logic_vector(N_CHANNELS-1 downto 0);
|
channel_number_O: out std_logic_vector(3 downto 0);
|
channel_number_O: out std_logic_vector(3 downto 0);
|
clk_I: in std_logic;
|
clk_I: in std_logic;
|
enable_I: in std_logic;
|
enable_I: in std_logic;
|
reset_I: in std_logic
|
reset_I: in std_logic
|
);
|
);
|
end entity channel_selector;
|
end entity channel_selector;
|
|
|
|
|
----------------------------------------------------------------------------------------------------
|
----------------------------------------------------------------------------------------------------
|
----------------------------------------------------------------------------------------------------
|
----------------------------------------------------------------------------------------------------
|
architecture ARCH01 of channel_selector is
|
architecture ARCH01 of channel_selector is
|
constant CHANNEL_WIDTH: integer := integer(ceil(log2(real(N_CHANNELS))));
|
constant CHANNEL_WIDTH: integer := integer(ceil(log2(real(N_CHANNELS))));
|
|
|
signal channel: unsigned(CHANNEL_WIDTH-1 downto 0);
|
signal channel: unsigned(CHANNEL_WIDTH-1 downto 0);
|
signal next_channel: unsigned(CHANNEL_WIDTH-1 downto 0);
|
signal next_channel: unsigned(CHANNEL_WIDTH-1 downto 0);
|
|
|
|
|
begin
|
begin
|
|
|
--------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------
|
-- Output
|
-- Output
|
channel_number_O <= (3 downto CHANNEL_WIDTH => '0') & std_logic_vector(channel);
|
channel_number_O <= (3 downto CHANNEL_WIDTH => '0') & std_logic_vector(channel);
|
--channel_number_O <= std_logic_vector(channel);
|
--channel_number_O <= std_logic_vector(channel);
|
--------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------
|
-- Combinational selection
|
-- Combinational selection
|
|
|
P_comb: process(channel,channels_I)
|
P_comb: process(channel,channels_I)
|
variable j : integer range 0 to N_CHANNELS-1;
|
variable j : integer range 0 to N_CHANNELS-1;
|
variable index: integer range 0 to N_CHANNELS-1;
|
variable index: integer range 0 to N_CHANNELS-1;
|
begin
|
begin
|
|
|
|
|
-- -- for i in 0 to N_CHANNELS loop
|
-- -- for i in 0 to N_CHANNELS loop
|
-- if i = to_integer(channel) then
|
-- if i = to_integer(channel) then
|
-- exit;
|
-- exit;
|
-- end if;
|
-- end if;
|
-- end loop;
|
-- end loop;
|
|
|
-- for i in 0 to N_CHANNELS loop
|
-- for i in 0 to N_CHANNELS loop
|
--i := to_natural(channel);
|
--i := to_natural(channel);
|
for j in 0 to N_CHANNELS-1 loop
|
for j in 0 to N_CHANNELS-1 loop
|
|
|
if (j + to_integer(channel) + 1) > (N_CHANNELS - 1) then
|
if (j + to_integer(channel) + 1) > (N_CHANNELS - 1) then
|
index := j + to_integer(channel) + 1 - N_CHANNELS;
|
index := j + to_integer(channel) + 1 - N_CHANNELS;
|
else
|
else
|
index := j + to_integer(channel) + 1;
|
index := j + to_integer(channel) + 1;
|
end if;
|
end if;
|
|
|
if channels_I(index) = '1' then
|
if channels_I(index) = '1' then
|
next_channel <= to_unsigned(index, CHANNEL_WIDTH);
|
next_channel <= to_unsigned(index, CHANNEL_WIDTH);
|
exit;
|
exit;
|
else
|
else
|
next_channel <= channel;
|
next_channel <= channel;
|
end if;
|
end if;
|
|
|
end loop;
|
end loop;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- for i in 0 to N_CHANNELS loop
|
-- for i in 0 to N_CHANNELS loop
|
-- if channel = to_unsigned(i, 4) then
|
-- if channel = to_unsigned(i, 4) then
|
-- for j in i+1 to (2*N_CHANNELS)-1 loop
|
-- for j in i+1 to (2*N_CHANNELS)-1 loop
|
-- if j > N_CHANNELS-1 then
|
-- if j > N_CHANNELS-1 then
|
-- index := j - N_CHANNELS;
|
-- index := j - N_CHANNELS;
|
-- else
|
-- else
|
-- index := j;
|
-- index := j;
|
-- end if;
|
-- end if;
|
--
|
--
|
-- if channels_I(index) = '1' then
|
-- if channels_I(index) = '1' then
|
-- next_channel <= to_unsigned(index, CHANNEL_WIDTH);
|
-- next_channel <= to_unsigned(index, CHANNEL_WIDTH);
|
-- exit;
|
-- exit;
|
-- else
|
-- else
|
-- next_channel <= channel;
|
-- next_channel <= channel;
|
-- end if;
|
-- end if;
|
-- end loop;
|
-- end loop;
|
-- exit;
|
-- exit;
|
-- else
|
-- else
|
-- next_channel <= channel;
|
-- next_channel <= channel;
|
-- end if;
|
-- end if;
|
-- end loop;
|
-- end loop;
|
|
|
end process;
|
end process;
|
|
|
|
|
--------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------
|
-- Clocked
|
-- Clocked
|
|
|
P_clock: process(enable_I, reset_I, next_channel, clk_I)
|
P_clock: process(enable_I, reset_I, next_channel, clk_I)
|
begin
|
begin
|
if clk_I'event and clk_I = '1' then
|
if clk_I'event and clk_I = '1' then
|
if reset_I = '1' then
|
if reset_I = '1' then
|
channel <= (others => '0');
|
channel <= (others => '0');
|
elsif enable_I = '1' then
|
elsif enable_I = '1' then
|
channel <= next_channel;
|
channel <= next_channel;
|
end if;
|
end if;
|
end if;
|
end if;
|
end process;
|
end process;
|
|
|
|
|
|
|
|
|
|
|