📄 fsm.vhd
字号:
-- Esta version de la fsm presenta 2 diferencias esenciales con respecto a la
-- anterior,son las siguientes :
-- 1. Las senales de habilitacion de un bloque se dan
-- al terminar la operacion del bloque anterior, es
-- decir en el estado anterior.
-- 2. Existe una senal, llamada "desborde", que indica
-- cuando vamos a comparar con un pixel que se
-- encuentra fuera de la matrix de la imagen; En este
-- caso como el resultado de la comparacion es
-- evidentemente nulo se pasa directamente al estado
-- de compara, al que llegara una senal que avise de
-- que estamos en situacion de desbordamiento. La
-- senal de aviso se llama "fuera_matriz".
--
-- En ultimo lugar he anulado el salto inicial de la maquina al estado lectura ya
-- que esta hacia que no funcionase, la correccion solo supone un consumo de un
-- ciclo de reloj adicional en total, desde la habilitacion hasta el resultado de
-- la multiplicacion
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
entity FSM is
port (
en_global: in STD_LOGIC;
desborde: in std_logic; -- Senal del bloque cnt cuando el pixel a computar esta fuera de la matriz;
ini_cuenta1: out STD_LOGIC;
ini_cuenta2: out STD_LOGIC; -- Senal utilizada a modo de reloj para el bloque cnt;
ini_compara: out STD_LOGIC;
fin_compara: in STD_LOGIC;
ini_lectura : out std_logic;
fin_lectura: in std_logic;
fin_lecturas: in std_logic;
ini_almacena: out STD_LOGIC;
fin_almacena: in STD_LOGIC;
ini_multiplica: out STD_LOGIC;
fin_matriz: in STD_LOGIC; -- Lo da el ultimo bloque cuando escribe el ultimo pixel de la matriz de bordes
Fin: out STD_LOGIC;
Clk: in STD_LOGIC;
reset: in STD_LOGIC
);
end FSM;
architecture FSM_arch of FSM is
type state_values is (reposo, cuenta1, cuenta2, multiplica, lectura, compara, almacena);
signal estado_actual, estado_futuro: state_values;
begin
combinacional : process(estado_actual, en_global, fin_lectura,fin_lecturas, fin_compara, fin_almacena, fin_matriz, desborde)
begin
case estado_actual is
when reposo =>
ini_multiplica <='0';
ini_lectura <='0';
ini_compara <= '0';
ini_almacena <= '0';
Fin <= '0';
ini_cuenta1 <= '0';
ini_cuenta2 <='0';
if(en_global ='1') then
estado_futuro <= cuenta2;
else
estado_futuro <= reposo;
end if;
when cuenta1 =>
estado_futuro <= cuenta2;
ini_cuenta1 <= '1';
ini_lectura <='0';
ini_cuenta2 <= '0';
ini_multiplica <='0';
ini_compara <= '0';
ini_almacena <= '0';
Fin <= '0';
when cuenta2 =>
ini_cuenta1 <= '0';
ini_cuenta2 <= '1';
Fin <= '0';
ini_almacena <= '0';
ini_compara <= '0';
ini_lectura <= '0';
ini_multiplica <='0';
if(desborde ='1') then
estado_futuro <= lectura;
else
estado_futuro <= multiplica;
end if;
when multiplica =>
estado_futuro <= lectura;
ini_cuenta1 <= '0';
ini_lectura <='0';
ini_cuenta2 <= '0';
ini_multiplica <='1';
Fin <= '0';
ini_compara <= '0';
ini_almacena <= '0';
when lectura =>
ini_multiplica <='0';
Fin <= '0';
ini_cuenta1 <= '0';
ini_almacena <= '0';
ini_lectura <='1';
ini_compara <= '0';
ini_cuenta2 <= '0';
if(fin_lecturas ='1') then
estado_futuro <= compara;
elsif (fin_lectura='1') then
estado_futuro<= cuenta2;
else
estado_futuro <= lectura;
end if;
when compara =>
ini_multiplica <='0';
ini_cuenta2 <= '0';
Fin <= '0';
ini_compara <= '1';
ini_cuenta1 <= '0';
ini_lectura <='0';
ini_almacena <= '0';
if(fin_compara ='1') then
estado_futuro <= almacena;
else
estado_futuro <= compara;
end if;
when almacena =>
ini_multiplica <='0';
ini_cuenta2 <= '0';
ini_compara <= '0';
ini_almacena <= '1';
ini_lectura <= '0';
ini_cuenta1 <= '0';
if(fin_almacena ='1') then
if(fin_matriz ='1') then
estado_futuro <= reposo;
Fin <= '1';
else
estado_futuro <= cuenta1;
Fin <= '0';
end if;
else
estado_futuro <= almacena;
Fin <= '0';
end if;
end case;
end process combinacional;
sincronismo : process(clk,estado_futuro, reset)
begin
if(reset = '1') then
estado_actual <= reposo;
elsif(clk'event and clk ='1') then
estado_actual <= estado_futuro;
end if;
end process sincronismo;
end FSM_arch;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -