Documentos de Académico
Documentos de Profesional
Documentos de Cultura
MICROELECTRONICA
Para poder diferenciar entre cada celda que se quiere explorar y en la que nos encontramos
podríamos diferenciarlas ya sea con su fila y columna para cada celda o con el uso de un Token
(símbolo) distinto para cada celda.
En nuestro caso escogimos el uso de caracteres numéricos para designar a cada celda, dentro del
marco del Maze, que no sea un Wall (pared).
Entonces primero se debe realizar esta asignación numérica antes de empezar a explorar y
encontrar la solución a través de los nodos del grafo que constituyen el Maze.
DIAGRAMA DE BLOQUES:
DIAGRAMA DE FLUJO:
CONSIDERACIONES:
Inicialmente cada celda posible por donde se puede trazar camino de exploración esta
designada con el valor 1 y cada celda que representa una pared esta designada con el valor 0.
En la última condición del diagrama de flujo se toma en cuenta como condición para finalizar
que la dirección que se ira a leer sea máximo hasta HxW-1, ya que H representa la altura del
Maze y W su ancho, entonces en la memoria RAM donde se encuentra el Maze mapeado por
filas se sabría que la ultima fila del Maze estaría almacenada en la dirección HxW-1.
DIAGRAMA DE BLOQUES:
DIAGRAMA DE FLUJO:
CONSIDERACIONES:
_FRONTIER: Contiene una lista de valores que definen el entorno (UP, DOWN, LEFT y RIGHT)
respecto al valor de CURRENT, esta lista nos indicara nuestros posibles valores futuros de
exploración.
_VISITED: Contiene una lista de valores que indican las celdas en las que ya estuvimos antes, de
las que ya se definió sus entornos aun por visitar.
_FROM: Contiene una lista en la que se almacena los valores de celda de donde se vino en cada
paso, de esa forma uno puede concatenar la solución del camino hasta el final cuando se
termine el algoritmo.
Usualmente para este algoritmo se deja que explore los nodos de todo el grafo, pero en nuestro
caso en el momento en el que se llegue a la celda de Fin se detendrá el algoritmo para así
empezar a trazar la solución.
CODIGO DE LA MEMORIA RAM A USAR:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY RAM IS
PORT(CLK : IN STD_LOGIC;
READ : IN STD_LOGIC;
ADDRESS : IN STD_LOGIC_VECTOR (3 DOWNTO 0);
DATA_IN : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
DATA_OUT : OUT STD_LOGIC_VECTOR (7 DOWNTO 0));
END RAM;
ARCHITECTURE BEHAVIORAL OF ROM16x8 IS
TYPE ROM_TYPE IS ARRAY (0 TO 15) OF STD_LOGIC_VECTOR (7 DOWNTO 0);
CONSTANT ROM : ROM_TYPE := (
0 => X"02",
1 => X"00",
2 => X"01",
3 => X"04",
4 => X"00",
5 => X"02",
6 => X"01",
7 => X"04",
8 => X"FF",
9 => X"FF",
10 => X"FF",
11 => X"FF",
12 => X"FF",
13 => X"FF",
14 => X"FF",
15 => X"FF",
OTHERS => X"FF");
BEGIN
PROCESS (CLK)
BEGIN
IF RISING_EDGE(CLK) THEN
IF (READ = '1') THEN DATA_OUT <= RAM(CONV_INTEGER(ADDRESS));
ELSE DATA_OUT <= "ZZZZZZZZ";
END IF;
END IF;
ELSE FALLING_EDGE(CLK) THEN
IF (WRITE = '1') then RAM(CONV_INTEGER(ADDRESS)) <= DATA_IN; DATA_OUT <= "ZZZZZZZZ";
END IF
END PROCESS;
END BEHAVIORAL;