⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fsm.vhd

📁 Sobel--Image Filter (I). An Image filtering is made over data loaded into the on board RAM and prese
💻 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 + -