Ho capito che le variabili vanno utilizzate solamente all'interno di un processo e il loro valore viene aggiornato immediatamente. Alla fine del processo però il valore finale viene conservato? E per quanto riguarda un segnale invece?
In particolare vorrei creare una FSM che carica un valore da un registro, somma una certa quantità a questo valore e poi riscrive il tutto nel registro. Questo ciclo vorrei che continuasse fino ad una certa soglia, ripartendo dal primo stato ricaricando il valore (aggiornato della quantità sommata fino ad ora). La lettura/scrittura del registro pensavo di pilotarla con due segnali provenienti dalla FSM.
Ho pensato di usare una variabile per assegnare il valore letto, incrementare quindi la variabile e infine assegnarla al segnale in uscita verso il registro. E' corretto?
Leonardo wrote:Non c'è bisogno. Al limite bisogna stare attenti a non creare latch involontari coi segnali, sopratutto nei processi con if..then
entity Input_Manager is
port (
clk25 : in std_logic;
reset : in std_logic;
frameoff : in std_logic;
sync_pad : out std_logic;
up : in std_logic;
down : in std_logic;
y_PadIN : in std_logic_vector (8 downto 0);
y_PadOUT : out std_logic_vector (8 downto 0);
state_test : out std_logic_vector (3 downto 0)
);
end Input_Manager;
architecture IM of Input_Manager is
--attribute enum_encoding : string;
type stato is (w, a, b, c, d, e, f, g, h);
--attribute enum_encoding of stato : type is ("1100 1000 0000 0010 0011 0110 0001 0100 1010");
signal presentState : stato;
signal nextState : stato;
constant DEFAULT_Y_PAD : std_logic_vector (8 downto 0) := "011101111";
constant edgeWidth : integer := 20;
constant monitorHeight : integer := 480;
constant padRadius : integer := 40;
begin
--
seq : process (clk25, reset, presentState)
begin
if (reset = '1') then
presentState <= w;
else if (clk25'event and clk25 = '1') then
presentState <= nextState;
end if;
end if;
end process;
fut : process (presentState, frameoff, up, down)
begin
case presentState is
when w =>
if (frameoff = '0') then
nextState <= w;
else
nextState <= a;
end if;
when a =>
nextState <= b;
when b =>
nextState <= c;
when c =>
if (frameoff = '0') then
nextState <= c;
else
if (up = '1') then
if (down = '1') then
nextState <= h;
else
if (y_PadIN + padRadius < monitorHeight -edgeWidth -4) then --up
nextState <= d;
else
nextState <= h;
end if;
end if;
else
if (down = '1') then
if (y_PadIN - padRadius > edgeWidth +3) then --down
nextState <= e;
else
nextState <= h;
end if;
else
nextState <= h;
end if;
end if;
end if;
when d =>
nextState <= f;
when e =>
nextState <= g;
when f =>
if (frameoff = '0') then
nextState <= f;
else
nextState <= b;
end if;
when g =>
if (frameoff = '0') then
nextState <= g;
else
nextState <= b;
end if;
when h =>
if (frameoff = '0') then
nextState <= h;
else
nextState <= b;
end if;
end case;
end process;
uscite : process (presentState)
variable temp : std_logic_vector (8 downto 0);
begin
sync_pad <= '0';
case presentState is
when w =>
y_PadOUT <= DEFAULT_Y_PAD;
state_test <= "1100";
when a =>
state_test <= "1000";
when b =>
sync_pad <= '1';
temp := y_PadIN;
state_test <= "0000";
when c =>
state_test <= "0010";
when d =>
y_PadOUT <= temp + 4;
state_test <= "0011";
when e =>
y_PadOUT <= temp - 4;
state_test <= "0110";
when f =>
state_test <= "0001";
when g =>
state_test <= "0100";
when h =>
state_test <= "1010";
end case;
end process;
end IM;
Users browsing this forum: No registered users and 10 guests