====== LAB 2: Extending the Multiplexer ======
===== Synopsis =====
As the module will be used to multiplex single digit values later on, the bus widths need to be adjusted. This is easily done by specifying a range for all data signals which are of type integer. Additionally, error conditions shall also be signaled to the user via the camera display. Therefore, an additional control input named ERROR is needed. The following figure shows the updated schematic:
{{:vhdl_workshop:workshop_extmultiplexer.svg?nolink&500|The enhanced multiplexer}}
==== Behaviour ====
DISP_PHOTO shall be set to ’10’ when the ERROR signal is active. Otherwise, the multiplexer behaviour shall not be changed, i.e. the output shall be equal to the EXP_TIME input when the control signal SHOW_TIME is 1. Else, DISP_PHOTO shall be set to NO_PICS.
==== Data types ====
All data signals (NO_PICS, EXP_TIME, DISP_PHOTO) shall be of type **integer** with a range of valid values from 0 to 10. The new control signal ERROR shall be of type **std_ulogic**, as the SHOW_TIME signal.
==== To do ====
* Modify the existing multiplexer model.
* Compile your design.
* Modify the testbench according to the changes of the DISP_MUX interface and create new stimuli to verify the proper behaviour.
* Compile the testbench.
* Run the simulation.
* Synthesize the model.
===== Implementation =====
library ieee;
use ieee.std_logic_1164.all;
entity DISP_MUX is
port(EXP_TIME : in integer; -- range needed
NO_PICS : in integer; -- range needed
SHOW_TIME : in std_ulogic;
-- add ERROR port
DISP_PHOTO : out integer;); -- range needed
end DISP_MUX;
architecture RTL of DISP_MUX is
begin
process(NO_PICS, EXP_TIME...) -- complete sensitivity list!!
begin
-- add ERROR condition
if SHOW_TIME = '1' then
-- output = exposure time
else
-- output = picture count
end if;
end process;
end RTL;
===== Testbench =====
library ieee;
use ieee.std_logic_1164.all;
entity TB_DISP_MUX is
end TB_DISP_MUX;
architecture TEST of TB_DISP_MUX is
component DISP_MUX
port(EXP_TIME : in integer range 0 to 10;
NO_PICS : in integer range 0 to 10;
SHOW_TIME : in std_ulogic;
-- add ERROR port
DISP_PHOTO : out integer range 0 to 10);
end component;
signal W_EXP_TIME : integer range 0 to 10 := 0;
signal W_NO_PICS : integer range 0 to 10 := 0;
signal W_SHOW_TIME : std_ulogic := '0';
signal W_ERROR : -- type???
signal W_DISP_PHOTO : integer range 0 to 10;
begin
DUT : DISP_MUX
port map (
EXP_TIME => W_EXP_TIME,
NO_PICS => W_NO_PICS,
SHOW_TIME => W_SHOW_TIME,
ERROR => W_ERROR,
DISP_PHOTO => W_DISP_PHOTO);
STIMULI : process
begin
-- DISP_PHOTO = 0
wait for 30 ns;
W_NO_PICS <= 2;
W_EXP_TIME <= 5;
-- DISP_PHOTO = 2
wait for 20 ns;
W_NO_PICS <= 10;
-- DISP_PHOTO = 10
wait for 20 ns;
W_SHOW_TIME <= '1';
-- DISP_PHOTO = 5
wait for 20 ns;
W_EXP_TIME <= 6;
W_NO_PICS <= 4;
-- DISP_PHOTO = 6
wait for 20 ns;
W_SHOW_TIME <= '0';
-- DISP_PHOTO = 4
wait for 20 ns;
W_ERROR <= '1';
-- DISP_PHOTO = 10
wait for 20 ns;
W_SHOW_TIME <= '1';
-- no changes
wait for 20 ns;
W_ERROR <= '0';
-- DISP_PHOTO = 6
wait for 20 ns;
W_SHOW_TIME <= '0';
-- DISP_PHOTO = 4
wait for 20 ns;
wait;
end process STIMULI;
end TEST;
configuration CFG_TB_DISP_MUX of TB_DISP_MUX is
for TEST
end for;
end CFG_TB_DISP_MUX;