Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Aplicar los conocimientos adquiridos para disear, comprender y operar un ALU en FPGA
Disear los mdulos que complementan a la ALU
Disear mdulos opcionales de funciones de un microprocesador.
AND
MUX
OR
4x1
XOR 8bits
UBC
De acuerdo con lo anterior mostrado se puede observar que el cdigo podemos dividirlo en 5
partes y crearnos componentes para asi llamarlos en un cdigo TOP-LEVEL integrando de esta
manera la entidad de la ALU
Analizaremos el comportamiento de cada bloque para crear un componente de cada una de ellas.
Modulo lgico AND (mod_and)
A_and (8 bits)
B_and (8 bits)
AND R_and (8 bits)
Como podemos observar requerimos de 2 variables de entrada y una de salida, todas sern
vectores de 8 bits.
library ieee;
use ieee.std_logic_1164.all;
entity mod_and is port(
A_and:in std_logic_vector (7 downto 0);
B_and:in std_logic_vector (7 downto 0);
R_and:out std_logic_vector (7 downto 0));
end mod_and;
architecture arq_mod_and of mod_and is
begin
R_and <= A_and and B_and;
end arq_mod_and;
A_or (8 bits)
B_or (8 bits)
OR R_or (8 bits)
Como podemos observar requerimos de 2 variables de entrada y una de salida, todas sern
vectores de 8 bits.
library ieee;
use ieee.std_logic_1164.all;
entity mod_or is port(
A_or:in std_logic_vector (7 downto 0);
B_or:in std_logic_vector (7 downto 0);
R_or:out std_logic_vector (7 downto 0));
end mod_or;
architecture arq_mod_or of mod_or is
begin
R_or <= A_or or B_or;
end arq_mod_or;
Modulo lgico XOR (mod_or)
A_xor (8 bits)
B_xor (8 bits)
XOR R_xor (8 bits)
Como podemos observar requerimos de 2 variables de entrada y una de salida, todas sern
vectores de 8 bits.
library ieee;
use ieee.std_logic_1164.all;
entity mod_xor is port(
A_xor:in std_logic_vector (7 downto 0);--entrada
B_xor:in std_logic_vector (7 downto 0);--entrada
R_xor:out std_logic_vector (7 downto 0));--salida
end mod_xor;
architecture arq_mod_xor of mod_xor is
begin
R_xor <= A_xor xor B_xor;-- xor de las dos variables
end arq_mod_xor;
B_ubc (8 bits)
UBC R_ubc (8 bits)
La ubc adems de tener la entrada de 8 bits de cada variable de entrada cuenta con variables de
control para generar las funciones con que cuenta el ALU estas son CX1 CY1 CX2 CY2 y CE en
nuestra entidad se vern reflejados estas variables y debemos reslizar el cdigo en dos partes la
del sumador y la de control (de paso y de inversin).
Las funciones de paso y de inversion ya se haban visto en el laboratorio 1 estas se hacen bit a bit
de cada variable con el respectivo bit de control por ejemplo para A_ubc(0) se tendra que
almacenar en una variable diferente el resultado
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY ubc IS
PORT(
A_ubc:IN STD_LOGIC_VECTOR (7 DOWNTO 0);
B_ubc:IN STD_LOGIC_vector (7 DOWNTO 0);
CX1,CY1,CX2,CY2,CE:IN STD_LOGIC;
COUT: OUT STD_LOGIC;
R_ubc:OUT STD_LOGIC_vector (7 DOWNTO 0));
END ubc;
ARCHITECTURE arq_ubc OF ubc IS
SIGNAL X0,X1,X2,X3,X4,X5,X6,X7: STD_LOGIC;
SIGNAL Y0,Y1,Y2,Y3,Y4,Y5,Y6,Y7: STD_LOGIC;
SIGNAL C0,C1,C2,C3,C4,C5,C6,C7: STD_LOGIC;
BEGIN
-- CONTROL DE PASO Y CONTROL DE INVERSION
X0 <= (A_ubc(0) AND CX1) XOR CX2; X1 <= (A_ubc(1) AND CX1) XOR CX2;
X2 <= (A_ubc(2) AND CX1) XOR CX2; X3 <= (A_ubc(3) AND CX1) XOR CX2;
X4 <= (A_ubc(4) AND CX1) XOR CX2; X5 <= (A_ubc(5) AND CX1) XOR CX2;
X6 <= (A_ubc(6) AND CX1) XOR CX2; X7 <= (A_ubc(7) AND CX1) XOR CX2;
Y0 <= (B_ubc(0) AND CY1) XOR CY2; Y1 <= (B_ubc(1) AND CY1) XOR CY2;
Y2 <= (B_ubc(2) AND CY1) XOR CY2; Y3 <= (B_ubc(3) AND CY1) XOR CY2;
Y4 <= (B_ubc(4) AND CY1) XOR CY2; Y5 <= (B_ubc(5) AND CY1) XOR CY2;
Y6 <= (B_ubc(6) AND CY1) XOR CY2; Y7 <= (B_ubc(7) AND CY1) XOR CY2;
-- SUMADOR Y CARRY
R_ubc(0) <= X0 XOR Y0 XOR CE; C0 <= (X0 AND Y0)OR((X0 XOR Y0)AND CE);
R_ubc(1) <= X1 XOR Y1 XOR C0; C1 <= (X1 AND Y1)OR((X1 XOR Y1)AND C0);
R_ubc(2) <= X2 XOR Y2 XOR C1; C2 <= (X3 AND Y2)OR((X2 XOR Y2)AND C1);
R_ubc(3) <= X3 XOR Y3 XOR C2; C3 <= (X3 AND Y3)OR((X3 XOR Y3)AND C2);
R_ubc(4) <= X4 XOR Y4 XOR C3; C4 <= (X4 AND Y4)OR((X4 XOR Y4)AND C3);
R_ubc(5) <= X5 XOR Y5 XOR C4; C5 <= (X5 AND Y5)OR((X5 XOR Y5)AND C4);
R_ubc(6) <= X6 XOR Y6 XOR C5; C6 <= (X6 AND Y6)OR((X6 XOR Y6)AND C5);
R_ubc(7) <= X7 XOR Y7 XOR C6;
E_1mux (8 bits)
E_3mux (8 bits)
4x1
E_4mux (8 bits)
8bits
a b
En el mux deben ingresar todas las seales que tengamos de los otros componentes creados
(modulo and, or, xor y del ubc). En nuestra entidad por el momento colocaremos solo E_imux para
las 4 entradas y la salida nica de R_mux. Que deber mostrarse en el final del ALU.
library ieee;
use ieee.std_logic_1164.all;
entity mod_mux is port(
E_1mux:in std_logic_vector (7 downto 0);
E_2mux:in std_logic_vector (7 downto 0);
E_3mux:in std_logic_vector (7 downto 0);
E_4mux:in std_logic_vector (7 downto 0);
a: in std_logic;
b: in std_logic;
R_mux:out std_logic_vector (7 downto 0));
end mod_mux;
architecture arq_mod_mux of mod_mux is
signal G: std_logic_vector (1 downto 0);
begin
G(0)<=a;
G(1)<=b;
with G select
R_mux <= E_1mux when "00",
E_2mux when "01",
E_3mux when "10",
E_4mux when others;
end arq_mod_mux;
Entonces la ALU integrada quedara siendo:
A (8 bits) AND
MUX R (8 bits)
OR
4x1
B (8 bits)
XOR 8bits
C (1bit)
UBC
S4 S3 S2 S1 S0 S6 S5
Cdigo del alu integrado
library ieee;
use ieee.std_logic_1164.all;
ENTITY alu IS
PORT(
A: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
B: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
S0,S1,S2,S3,S4,S5,S6: IN STD_LOGIC;
R: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
C: OUT STD_LOGIC);
END alu;
ARCHITECTURE estructura OF alu IS
END estructura;
3.- Disee instrucciones de salto con banderas C,Z,V, y N.
Para este diseo es necesario tener las banderas calculadas en nuestro circuito o cdigo entonces
se diseara tomando en cuenta esta consideracin tomando como un bloque aparte las banderas
de nuestro circuito suponemos que C,Z,V y N ya estn calculadas.
Analizando las banderas el circuito debe ser capaz de entregarnos un argumento que nos lleve a
otra direccin de memoria para realizar una operacin determinada, siguiendo esta lgica
tenemos como entrada las Banderas C,Z,V y N y como salida el puntero que nos llevara a otra
direccin de memoria a este le llamaremos PS (puntero de salto) el esquema del bloque ser:
C
PS (8 bits)
Z
V
HTL
C,Z,V y N load(1bit)
N
El puntero de salto debe ser conectado a un contador que tenga carga en paralelo de esta manera
se direccionara a otra direccin de memoria para realizar la operacin del salto
1. Utilizando 4 registros que se habiliten de acuerdo a las necesidades del salto para cada
bandera habilitando un buffer de alta impedancia para cada registro de las banderas.
2. Utilizando una memoria que nos entregue las direcciones a las que se debe saltar si una
bandera esta activa y un registro que transfiera esta informacin cuando tengamos una
bandera activa. Como tenemos 4 variables podemos realizar saltos diferentes aplicando
dos condiciones unidas a la vez lo que nos da un mayor desarrollo de saltos con facilidad y
menor consumo de energa ya que podemos realizarlo con dos integrados; no obstante
perdemos las siguientes direcciones de la memoria y la hacemos intil desperdiciando el
espacio disponible de esta. Adems para este diseo podramos obtener los datos de salto
pregrabado en la memoria de salto las direcciones a las que se quiera saltar.
En cdigo VHDL para aplicarlo en FPGA sera ms fcil tener una memoria de salto para poder
direccionar directamente la direccin de la memoria que corresponde a la condicin. Adems que
el desarrollo del cdigo sera mucho ms rpido
En cdigo se veria lo siguiente:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY salto_banderas IS
PORT(
PS: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
LOAD: IN STD_LOGIC;
DIR_SALTO_C:IN STD_LOGIC_VECTOR(7 DOWNTO 0); -- se debe grabar previamente
DIR_SALTO_Z:IN STD_LOGIC_VECTOR(7 DOWNTO 0); -- estas direcciones de salto
DIR_SALTO_V:IN STD_LOGIC_VECTOR(7 DOWNTO 0); -- para las banderas que tengamos
DIR_SALTO_N:IN STD_LOGIC_VECTOR(7 DOWNTO 0); -- en una memoria o si se conoce el
C: IN STD_LOGIC; -- programa podemos apuntar y
Z: IN STD_LOGIC; -- copiar directamente en el codigo **
V: IN STD_LOGIC;
N: IN STD_LOGIC);
END salto_banderas;
WITH M SELECT
PS <= DIR_SALTO_C WHEN "0001", ---- **
DIR_SALTO_Z WHEN "0010", ---- apuntar directamente
DIR_SALTO_V WHEN "0011",
DIR_SALTO_N WHEN OTHERS;
with M select
LOAD <= '0' WHEN "0000", --- PARA CARGAR LOS DATOS
'1' WHEN OTHERS; --- EN EL PUNTERO DE INSTRUCCIONES
END arq_salto_banderas;
4.- Disee instrucciones para tambor de desplazamiento con 4 opciones
Desplazamiento aritmtico a la derecha
Desplazamiento aritmtico a la izquierda
Rotacin lgica a la derecha
Rotacin lgica a la izquierda
Para el diseo requerimos de 4 instrucciones que nos reproduzcan el desplazamiento estas sern
seleccionadas de acuerdo a la siguiente tabla que debe ser aadida al circuito del computador.
N tipo Cdigo
1 Desp. Arit derecha 00
2 Desp. Arit izquierda 01
3 Rot. Log derecha 10
4 Rot. Log izquierda 11
Estos desplazamiento se pueden realizar con mux de 4 a1 para cada desplazamiento la variable de
seleccin se actualiza y nos muestra el desplazamiento o la rotacin dependiendo lo que queramos
mostrar.
Para cada vez que se realice el desplazamiento la variable que se est desplazando debe actualizarse
y cambiar el valor de esta todo esto se realizara con un registro de 8 bits para luego devolver a la
entrada el valor que se desplaz posteriormente se debe cambiar el valor direccionando con un
buffer de alta impedancia de la siguiente manera:
direc
A (8 bits)
ciona MUX REG
mien 4x1 8 bits
to 8bits
R (8 bits)
Cdigo en vhdl para el desplazamiento
library ieee;
use ieee.std_logic_1164.all;
process(clk,c,b)
begin
if(clk'event and clk = '1')then
A<=R;
A<=R;
A<=R;
end if;
end if;
end process;
end arq_mod_tambor_desplazamiento;
Cen Dc Un
1 1
9 9
9 9
1 9 8
Como las unidades y las decenas generan acarreo ambos bloques necesitan correccin sumar 66
Cen Dc Un
1 1
1001 1001
1001 1001
1 0011 0010
Sumamos 6 a cada bloque
Cen Dc Un
0001 0001
1001 1001
1001 1001
0001 0011 0010
0110 0110
0001 1001 1000
1 9 8
entity sumabcd is
port (au,ad: in std_logic_vector(3 downto 0);
bu,bd: in std_logic_vector(3 downto 0);
ru: inout std_logic_vector(3 downto 0);
rd: inout std_logic_vector(3 downto 0);
rc: inout std_logic);
end sumabcd;
begin
process(au,bu,ad,bd)
begin
ru <= au + bu;
rd <= ad + bd;
--condicion para la correccion
if ru> "1001" then
--condicion para la correccion y acarreo
if ru>"1111" then
s <= '1';
rd <= rd + s;
ru <= ru + "0110";
if rd > "1001" then
if rd>"1111" then
rc <='1';
rd <= rd + "0110";
else
rd <= rd + "0110";
if rd >"1111" then
rc <= '1';
else
rc <= '0';
end if;
end if;
else
rd <= rd;
end if;
else
ru <= ru +"0110";
if ru>"1111" then
s<='1';
rd <= rd + s;
if rd >"1001" then
if rd > "1111" then
rc <='1';
rd <= rd + "0110";
else
rd <= rd + "0110";
if rd > "1111" then
rc <='1';
else
rc <='0';
end if;
end if;
else
rd <= rd;
rc<='0';
end if;
else
ru<=ru;
if rd >"1001" then
if rd > "1111" then
rc <='1';
rd <= rd + "0110";
else
rd <= rd + "0110";
if rd > "1111" then
rc <='1';
else
rc <='0';
end if;
end if;
else
rd <= rd;
rc<='0';
end if;
end if;
end if;
else
ru <= ru;
if rd >"1001" then
if rd > "1111" then
rc <='1';
rd <= rd + "0110";
else
rd <= rd + "0110";
if rd > "1111" then
rc <='1';
else
rc <='0';
end if;
end if;
else
rd <= rd;
rc<='0';
end if;
end if;
end process;
end fun;
Universidad Mayor De San Andrs
Facultad de Ingeniera
INGENIERIA
ELECTRONICA
Laboratorio de
MICROPROCESADORES
ETN 801
PRE - INFORME N4
IMPLEMENTACION DE ALU EN
FPGA
INTEGRANTES
Univ. lbarez Flores Juan Pablo
Univ. Catari Condorino Miguel Edgar
Univ. Choque Quispe Cristian Flix
La Paz- Bolivia