Reputation: 77
Here is my code for a up_down_counter the comments are in dutch but don't matter so much.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity up_down_teller is
port ( maxc_vector : in std_logic_vector(6 downto 0); -- "maximum count" : maximale telwaarde (decimaal) = aantal posities - 1
minc_vector : in std_logic_vector(6 downto 0);
enable : in std_logic;
up_down : in std_logic; -- telrichting
clk_500ms : in std_logic; -- systeemklok
bcd : out std_logic_vector(7 downto 0); -- tellerstand
tc : out std_logic -- tc geeft aan wanneer de maximum telwaarde bereikt is (voor cascade)
);
end up_down_teller;
architecture Behavioral of up_down_teller is
signal maxc_int : integer range 0 to 99;
signal minc_int : integer range 0 to 99;
maxc_int <= to_integer(signed(maxc_vector));
minc_int <= to_integer(signed(minc_vector));
-- berekening maximumwaarden voor eenheden (Emax) en tientallen (Tmaxà
constant Emax : integer := maxc_int mod 10; -- rest na deling mc door 10 levert maximumwaarde voor eenheden
constant Tmax : integer := (maxc_int - Emax)/10; -- mc verminderd met Emax levert veelvoud van 10. Delen door 10 levert het maximumcijfer voor de tientallen.
-- berekening minimumwaarden voor eenheden (Emin) en tientallen (Tmin)
constant Emin : integer := minc_int mod 10; -- rest na deling mc door 10 levert minimumwaarde voor eenheden
constant Tmin : integer := (minc_int - Emin)/10; -- minc_int verminderd met Emin levert veelvoud van 10. Delen door 10 levert het minimumcijfer voor de tientallen.
-- declaratie interne signalen
signal sEcnt_i : integer range 0 to 9; -- declaratie een terugleesbaar signaal voor het tellen van de eenheden
signal sTcnt_i : integer range 0 to 9; -- declaratie een terugleesbaar signaal voor het tellen van de tientallen
BEGIN
tellerproces : process (clk_500ms)
.
.
.
What follows is less important.
When i run this code it generates an error because I can't convert the types before "BEGIN" but I have to so I can do the calculations for the min and max valuees, are there any workarounds for this?
Upvotes: 0
Views: 52
Reputation: 492
You have to define maxc_int
and minc_int
as either generics or constants to do this. If you have them as signals they could change during runtime, and you can't change the size of the signals during runtime.
An entity with generics could look like this:
entity up_down_teller is
generic(
maxc_vector : integer range 0 to 99 := 10;
minc_vector : integer range 0 to 99 := 10
);
port ( enable : in std_logic;
up_down : in std_logic; -- telrichting
clk_500ms : in std_logic; -- systeemklok
bcd : out std_logic_vector(7 downto 0); -- tellerstand
tc : out std_logic -- tc geeft aan wanneer de maximum telwaarde bereikt is (voor cascade)
);
end up_down_teller;
Upvotes: 2