📄 maqestcom.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 + -