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

📄 maqestcom.vhd

📁 Image_Filter_An_Image_halftone is performed over data loaded into the on board RAM and presented on
💻 VHD
字号:
-- MAQUINA DE ESTADOS DE COMUNICACIONES DEL SISTEMA

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity maqestcom is
    port (
	addr: in STD_LOGIC_VECTOR(1 downto 0); --para direccionar los registros del sppinterf
	dout: in STD_LOGIC_VECTOR(7 downto 0); --datos del PC para que los leamos
	read: in STD_LOGIC; --pulso que indica que demos un pixel de salida
	write: in STD_LOGIC; --pulso que indica lectura de un pixel
	reset: in STD_LOGIC; --reset global del sistema
	clk: in STD_LOGIC; --reloj del sistema
	fproc: in STD_LOGIC; --fin de procesado
	din: out STD_LOGIC_VECTOR(7 downto 0); --datos de salida para que los lea el PC
	flec: out STD_LOGIC; --fin de lectura
	datoraml: in STD_LOGIC_VECTOR(7 downto 0); --dato que leemos de la ram
     	datorame: out STD_LOGIC_VECTOR(7 downto 0); --dato que escribimos en la ram
     	tipo: out STD_LOGIC_VECTOR(1 downto 0); --indica el tipo de procesado
	oeram: out STD_LOGIC; --para habilitar la RAM en lectura
     	weram: out STD_LOGIC; --para habilitar la RAM en escritura
	triest: out STD_LOGIC; --si vale cero,indica que accedemos al bus de datos en escritura
	dirram: out STD_LOGIC_VECTOR(14 downto 0) --direcci髇 de la ram a la que accedemos
	);
end maqestcom;

architecture maqestcom_arch of maqestcom is
type estado is (esplec,espwri,lee1,lee2,lee3,finlec,finlee,espinstp,espwrip,procesa,procbin,prochalf,espfinproc,espinste,espwrie,interpreta,original,proc,esc1,esc2,esc3,espesc,espread1,espread2,espread3,espread4,finesc);
signal est_actual, est_sig: estado;
signal diraux,dirauxprox: STD_LOGIC_VECTOR(14 downto 0);
signal inst,instaux,datorameaux,datoramlaux,datorameaux1,datoramlaux1: STD_LOGIC_VECTOR(7 downto 0);
signal leeor,leeproc,leeoraux,leeprocaux: STD_LOGIC;
begin
datorame<=datorameaux;
async: process (est_actual,addr,read,write,fproc,diraux,dirauxprox,leeor,leeproc,inst,dout,datoraml,datoramlaux1,datorameaux,datoramlaux) --proceso as韓crono
begin
din<="00000000"; --valores por defecto
flec<='0';
datorameaux1<=datorameaux;
datoramlaux<=datoramlaux1;
instaux<=inst;
leeoraux<=leeor;
leeprocaux<=leeproc;
dirauxprox<=diraux;
tipo<="00";
oeram<='1'; 
weram<='1';
triest<='1';
case est_actual is
	when esplec => --estado por defecto
		dirauxprox<="000000000000000";
		if (write='1' and addr="00")then --si llega un pulso de write y direcci髇 "00"
		triest<='0';
		est_sig <= espwri; --se pasa al estado de lectura de los pixeles
		datorameaux1<=dout; --mapeamos lo que nos den en un registro auxiliar
		else
		triest<='1';
		est_sig<=esplec; -- si no,se continua en el mismo estado
		end if;
	when espwri =>
		triest<='0';
		
		if(write='0') then --si baja write
		est_sig<=lee1;
		else
		est_sig<=espwri;
		end if;
	when lee1 => --primer ciclo de lectura de los pixeles
		triest<='0';
		est_sig <=lee2;
	when lee2 => --segundo ciclo de lectura de los pixeles
		triest<='0';
		weram<='0'; --lo ponemos a cero para escribir en la ram
		est_sig<=lee3;
	when lee3 => --tercer ciclo de lectura de los pixeles
		triest<='0';
		est_sig<=finlec;
	when finlec =>
		triest<='0';
		if(diraux = "011111111111111" )then
			triest<='1';
			est_sig<=finlee;
		elsif(write='1' and addr="00")then
		    datorameaux1<=dout; --mapeamos lo que nos den en un registro auxiliar
		     dirauxprox <= diraux + 1; --se incrementa la direcci髇

			triest<='0';
			est_sig<=espwri;
		else
		  dirauxprox<=diraux;
		  est_sig<=finlec;
		end if;
	when finlee=>
		dirauxprox<="000000000000000";
		flec<='1';
		est_sig<=espinstp;
	when espinstp => --se espera la instrucci髇 a ejecutar 
		if (write='1' and addr="10")then --si llega un pulso de write y direcci髇 "10"
		est_sig <= espwrip; --se pasa al estado de lectura de la instrucci髇 de procesado
		else
		est_sig<=espinstp;
		end if;
	when espwrip=>
		instaux<=dout; --se mapea la instrucci髇
		if(write='1')then
		est_sig<=espwrip;
		else
		est_sig<=procesa;
		end if;
	when procesa => --se procesa la imagen
		if(inst="01100010")then --en ASCII es la letra "b"
		est_sig<=procbin;
		elsif(inst="01101000")then --en ASCII es la letra "h"
		est_sig<=prochalf;
		else
		est_sig<=espinstp;
		end if;
	when procbin =>
		tipo<="01"; --indica binarizaci髇
		est_sig<=espfinproc;
	when prochalf =>
		tipo<="10"; --indica halftone
		est_sig<=espfinproc;
	when espfinproc => --se espera que termine de procesar
		if(fproc='1')then --si se ha terminado de procesar
		est_sig<=espinste; --se espera la instrucci髇 de escritura
		else
		est_sig<=espfinproc; --se espera a que termine de procesar
		end if;
	when espinste => --se espera la instrucci髇 de escritura
		if (write='1' and addr="10")then --si llega un pulso de write y direcci髇 "10"
		est_sig <= espwrie; --se pasa al estado de lectura de la instrucci髇 de escritura
		else
		est_sig<=espinste;
		end if;
	when espwrie=>
		instaux<=dout; --se mapea la instrucci髇
		if(write='1')then
		est_sig<=espwrie;
		else
		est_sig<=interpreta;
		end if;
	when interpreta => --se interpreta la instrucci髇
		if(inst="01101111")then --en ASCII es la letra "o"
		est_sig<=original;
		elsif(inst="01110000")then --en ASCII es la letra "p"
		est_sig<=proc; --quieren leer la procesada
		else
		est_sig<=espinste;
		end if;
	when original => --quieren leer la original
		leeoraux<='1';
		dirauxprox<="000000000000000";
		est_sig<=esc1; 
	when proc => --quieren leer la procesada
		leeprocaux<='1';
		dirauxprox<="100000000000000"; 
		est_sig <=esc1;
	when esc1 => --primer ciclo de escritura de los pixeles
		est_sig<=esc2;
	when esc2 => --segundo ciclo de lectura de los pixeles
		oeram<='0'; --lo ponemos a cero para leer de la ram
		datoramlaux<=datoraml; --mapeamos en ese registro lo que haya en el bus de datos
		est_sig<=esc3;
	when esc3 => --tercer ciclo de escritura de los pixeles
		est_sig<=espesc;
	when espesc =>
		if(read='1' and addr="01")then
		est_sig<=espread1;
		else
		est_sig<=espesc;
		end if;
	when espread1=>
		din<=datoramlaux1; --mapeamos lo que nos den en din
		if(read='0')then
		est_sig<=espread2;
		else
		est_sig<=espread1;
		end if;
	when espread2=>
		din<=datoramlaux1; --mapeamos lo que nos den en din
		if(read='1')then
		est_sig<=espread3;
		else
		est_sig<=espread2;
		end if;
	when espread3=>
		din<=datoramlaux1; --mapeamos lo que nos den en din
		if(read='0')then
		est_sig<=espread4;
		else
		est_sig<=espread3;
		end if;
	when espread4=>
		din<=datoramlaux1; --mapeamos lo que nos den en din
		dirauxprox <= diraux + 1; --se incrementa la direcci髇
		est_sig<=finesc;
	when finesc=>
		if(dirauxprox(14)='1' and leeor='1') then --se termina de escribir los pixeles originales
		leeoraux<='0';
		est_sig<=esplec;
		elsif(dirauxprox(14)='0' and leeproc='1') then --se termina de escribir los pixeles procesados
		leeprocaux<='0';
		est_sig<=esplec;
		else
		est_sig <=esc1;
		end if;
end case;
end process;	
sync: process(clk,reset,est_sig,dirauxprox,datorameaux1,datoramlaux,instaux,leeoraux,leeprocaux) --proceso s韓crono
begin
	if (reset='1') then --si se produce un reset global del dise駉
		est_actual<=esplec; --pasamos inmediatamente al estado inicial
		diraux<="000000000000000";
		datorameaux<="00000000";
		datoramlaux1<="00000000";
		inst<="00000000";
		leeor<='0';
		leeproc<='0';
	elsif (clk'event and clk='1') then --cada flanco de subida del reloj
		est_actual<=est_sig; --pasamos al siguiente estado
		diraux <=dirauxprox;
		datorameaux<=datorameaux1;
		datoramlaux1<=datoramlaux;
		inst<=instaux;
		leeor<=leeoraux;
		leeproc<=leeprocaux;
	end if;
end process;

dirram<=diraux;
	 
end maqestcom_arch;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -