martes, 22 de noviembre de 2016

PROYECTO DIVISIÓN

FUNCIONALIDAD


Como Hacer Una División 8bits/4bits En Binarios

Al contrario de la multiplicación, si necesitamos implementar una división entera, el operador ʺ/ʺ no está soportado para la síntesis, por lo tanto tendremos que diseñar el divisor.
Existen muchos algoritmos de división, a continuación se explicará uno que es el que resulta más parecido a nuestra forma de dividir a mano y es por tanto más sencillo de entender.
En la figura 1 se muestra una división entera realizada con números enteros decimales y con números enteros binarios.

Figura 1: Ejemplo de división entera en decimal y en binario

Veamos paso a paso el algoritmo para hacer la división:
Primero desplazamos a la izquierda el divisor lo más que podamos siempre que ʺquepaʺ en el dividendo (D>d). La cantidad de veces que se ha desplazado la memorizamos. En electrónica digital, diríamos que la guardamos en un registro que llamaremos Desplz. En nuestro ejemplo de la "figura 2" el desplazamiento es 3.


Figura 2: Paso 1 de la división - cálculo del desplazamiento inicial

Una vez que tenemos el divisor desplazado lo más posible a la izquierda (Desplz=3), restamos al dividendo el divisor y ponemos un 1 en el cociente (figura 8.22). En la figura  se han rellenado los ceros que faltan a la derecha provocados por el desplazamiento. En el cálculo manual se hace implícitamente aunque no se ponen para ahorrar la escritura de la resta completa.
Figura 3: Paso 2 de la división

Ahora, el divisor, que hemos desplazado tres veces a la izquierda, lo desplazamos una vez a la derecha, es decir, como si del original lo desplazásemos dos veces a la izquierda. Por tanto Desplz=2. Probamos si cabe con el resultado de la resta anterior, si cabe (D³d) ponemos un uno en el cociente.
Figura 4: Paso 3 de la división

Volvemos a desplazar el divisor a la derecha (ahora Desplz=1), y volvemos a ver si cabe en la nueva resta que hemos hecho.

Figura 5: Paso 4 de la división

Vemos que esta vez no cabe, por tanto pondremos un cero en el cociente, no hacemos la resta, y probamos desplazando el divisor a la derecha (ahora el Desplz=0, volvemos a como estaba al principio)
Figura 6: Paso 5 de la división

Tampoco cabe, y como el cociente ha vuelto a su posición original (Desplz = 0) la división se termina (pues no sacamos decimales).

Figura 7: Paso 6 de la división

Ahora desplazando los restos a la izquierda podríamos sacar decimales. En este caso podríamos sacar el primer decimal para calcular el redondeo del cociente.
Así pues la implementación en hardware de este algoritmo de división se podría hacer de manera secuencial, pero también se podría ʺdesenrollarʺ y realizarla de manera combinacional o segmentada.
Si  se  realiza  de  manera  secuencial,  la  división  se  haría  en  varios  ciclos  de  reloj, que
dependerá del número de bits de los operandos. Por tanto, igual que con el multiplicador secuencial, el divisor necesitará de una parte de control que ordene la ejecución de las operaciones que haya que realizar en cada momento. Una vez terminadas las  operaciones deberá proporcionar una señal de aviso que indique que el resultado está disponible.
Además, el módulo tendrá una señal de entrada que ordene la ejecución de la división.
Para  este  ejemplo  no  se  va  a  incluir  el  esquema  o  el  código  VHDL  del  divisor.   Te recomendamos que lo implementes por ti mismo y que hagas el banco de pruebas. Con la información sobre el algoritmo de división junto con las explicaciones del algoritmo de multiplicación y los otros operadores de este capítulo, pensamos que lo podrías hacer por ti mismo.
Incluso te proponemos que implementes una pequeña calculadora en la FPGA. Metiendo los datos por los pulsadores e interruptores o por la UART. Por ejemplo, si usas la Nexys2, los interruptores podrían ser los operandos y los botones la operación: suma, resta, multiplicación y división. El resultado se obtendría por el display de siete segmentos.
Si usas la XUPV2P, como no hay tantos pulsadores ni interruptores, puedes realizar la operación por la UART, introduciendo primero el primer operador, luego la operación y por último el segundo operador. El mayor problema aquí será el control de lo que llega por la UART y la conversión en órdenes al módulo que realiza la operación. Para simplificar, te recomendamos que los números que envíes estén codificados en binario o en hexadecimal, pero no en decimal. Esto significa que desde el hiperterminal68 enviarías por  ejemplo:  ʺ1110/11=ʺ  ó  ʺE/3=ʺ  en  vez  de  ʺ14/3=ʺ.  Tu  circuito  debería  devolver:
ʺ1000 R10ʺ(en binario) ó ʺ4 R2ʺ (en hexadecimal). Elige una de las dos formas.
Este circuito de división o calculadora por la UART tiene cierta complejidad debido al control, conversiones y la unión de varios módulos, aparte de la propia complejidad del divisor. Sin embargo, podría ser un interesante proyecto que unificaría todo lo que hemos visto hasta ahora.




Circuito Anti Rebote 





El uso de actuadores mecánicos como los pulsadores, tiene muchas ventajas, sobre todo económicas, ya que son muy baratos. Sin embargo, precisamente por su naturaleza mecánica, vienen acompañados de ciertos problemas que dependiendo del uso que hagamos de ellos, pueden llegar a ser un verdadero quebradero de cabeza. El mayor de estos inconvenientes es el rebote o bouncing.

Al ser accionados, los pulsadores tardan cierto tiempo en alcanzar un estado estable, es decir, que durante muy poco tiempo (del orden de los milisengundos) pueden cambiar entre el estado pulsado y no pulsado hasta que la señal se estabiliza. A pesar de ser muy poco tiempo, es el suficiente para que un sistema digital lo detecte como varias pulsaciones. La siguiente imagen muestra una señal de rebote típica.








Hay varias aproximaciones para solucionar este problema, tanto hardware como software. En esta ocasión vamos a ver cómo atajar este problema desde el punto de vista hardware y más concretamente con VHDL.

Obviamente, hablamos de un circuito secuencial que debe recordar si el botón estaba pulsado en un momento anterior y compararlo con el estado actual, así que es necesario el uso de biestables o flip flops. La idea general es que si durante un periodo de tiempo lo suficientemente amplio (unos 10 u 11 milisegundos) el valor actual del pulsador y el valor del flip flop que almacena el estado anterior son iguales, podemos dar por sentado que el pulsador ha llegado a un estado de pulsación estable. El siguiente código VHDL implementa dicho circuito.


codigo en vhdl



Antirebote de pulsadores…

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity antirebote is
    port (
        clk : in std_logic;
       btn_in    : in std_logic;
       btn_out  : out std_logic);
end antirebote;

architecture beh of antirebote is
    constant CNT_SIZE : integer := 19;
    signal btn_prev   : std_logic := '0';
    signal counter    : std_logic_vector(CNT_SIZE downto 0) := (others => '0');

begin
    process(clk)
    begin
       if (clk'event and clk='1') then
             if (btn_prev xor btn_in) = '1' then
                    counter <= (others => '0');
                    btn_prev <= btn_in;
             elsif (counter(CNT_SIZE) = '0') then
                    counter <= counter + 1;
else
                    btn_out <= btn_prev;
             end if;
       end if;
    end process;
end beh;



La señal btn_prev es el biestable encargado de almacenar el estado anterior (entiéndase, el estado en el pulso de reloj anterior). Para contar el tiempo se usa un contador de 20 bits .Dentro del proceso, en cada pulso de reloj se comprueba mediante una puerta xor si el valor del pulsador es diferente al del pulso de reloj previo. Si es así, el contador se pone a cero y vuelve a comenzar la cuenta de tiempo, si no, se incrementa el contador, salvo que su último bit sea 1, en cuyo caso, ha pasado el tiempo suficiente como para dar por hecho que la pulsación ya es estable. Si este es el caso, ponemos el valor del biestable btn_prev en btn_out (que es otro biestable que se conecta a la salida del circuito).
El tamaño del contador se ha ajustado para una frecuencia de reloj de 50 MHz. En general, el tiempo que se consigue según el tamaño del contador se puede aproximar con la siguiente fórmula.




Siendo n el número de bits del contador. Así pues, en este caso tenemos un reloj de 50 MHz y un contador de 20 bits. Como en realidad el contador no va a contar hasta el final sino hasta que su bit más significativo sea 1, podemos usar un valor n=19 como una aproximación más que aceptable.





Por lo tanto, estamos dejando un margen de algo más de 10 milisegundos para que se estabilice el pulsador. Un valor muy razonable para un pulsador normal.

Código VHDL De La Division De 7 Bits/4 Bits


Division4.
1. Almacene el numerador en la concatenación de 111: n2
2. Almacene el denominador en d
3. Repita 4 veces:
    cambio n1&n2 corre a la izquierda un bit
    Si n1> d
           n1 = n1- d;
           n2(0) = 1;
4. Cociente = n2
    Residuo = n1 (3: 0);
El problema con el algoritmo division4 es que divide un numerador de 7 bits
(Dividendo) por un denominador de 4 bits (divisor) y produce un cociente de 4 bits y un 4-bit
recordatorio. Si el divisor es demasiado pequeño (menor que los 4 bits superiores del dividendo) entonces el cociente no encajará en 4 bits y tenemos una condición de desbordamiento. Lo que necesitamos es un Algoritmo que producirá un cociente de 7 bits y un resto de 4 bits, podemos hacerlo mediante Llamar al algoritmo Loop dos veces. Primero dividimos el divisor en la "parte alta" de la Dividendo para obtener la "parte alta" del cociente. El "alto resto" Se convierte en parte del dividendo restante que es dividido por el divisor para obtener la "parte baja" Del cociente y el resto final. 
Diagrama De Estados

 División Ejemplo 1



División Ejemplo 2



En la imagen “Código VHDL De La Division De 7 Bits/4 Bits, utiliza un procedimiento VHDL para implementar el divisor de 7 bits mostrado en el Diagrama de estados. Obsérvese que el procedimiento implementa el algoritmo division4 descrito anteriormente que Resulta en un cociente de 4 bits. Llamar a este procedimiento dos veces en el proceso en la Programa implementará el circuito mostrado en el diagrama de estados Tenga en cuenta que los procedimientos deben ser llamados desde dentro de un proceso. No contienen procesos. Declaraciones de procedimiento, por ejemplo, si Los bucles sólo se pueden utilizar dentro de un procedimiento sin un proceso.



Cuando se llega al estado del decodificador se hace lo siguiente:


 Debe pasar de binario a BCD

Para lo cual se utiliza el siguiente método
      En este método, que puede resultar muy útil en electrónica o en computación, lo primero que se hace es comparar el número binario con el número nueve, pero expresado en código BCD; enseguida, si el número binario que queremos convertir a BCD es mayor que el número nueve, entonces al número binario que se convertirá en BCD se le suma el número seis (expresado también en BCD). Posteriormente, vamos a incrementar el número que nos sirve para comparar (la referencia) y en lugar de nueve se convertirá en diecinueve (expresado en BCD), y si el nuevo número obtenido sigue siendo mayor al número con el cuál lo estamos comparando, nuevamente se le vuelve a sumar seis. Reiteraremos el proceso cuantas veces sea necesario, y lo que se estará realizando por medio de este método, es que después de que  se ha ido sumando el número seis consecutivamente a cada número binario que pretendemos convertir a BCD,  se compararan estos resultados con los números nueve (expresado en BCD), diecinueve (expresado en BCD), veintinueve (expresado en BCD), treinta y nueve, y así sucesivamente, hasta que el nuevo número que le hemos ido sumando sucesivamente el número seis en BCD, sea menor o igual que el número con el cual lo estamos comparando.

   110001 es mayor que (>) 001001, entonces se le sumara el número 0110 (seis)


             110001 > 00 1001
         +     0110
             110111 >01 1001
         +     0110
             111101 > 10 1001
         +     0110
           1000011  > 11 1001
         +     0110
           1001001 < 100 1001

Ejemplo 2  numero 36
Al número 36 en binario se compara y se le suma seis si es mayor

110011      >  00  1001    =9
       110
101010     >  01   1001      =25
       110
110000     >  10  1001        =41
       110   
 011  0110  >  11  1001        =57
   3       6

De esta forma se realiza la codificación del número  qué se va a mostrar en los display de siete segmentos, multiplexados.


CODIGO VHDL
















Ejercicio Teclado
El propósito es conectar un teclado matricial 4x4 (TM4) al puerto PMOD JA de la tarjeta Nexys 4. Cada vez que se presione una tecla, su valor se mostrara en el display de siete segmentos (D7S) numero 0, el ultimo visto desde la derecha del conjunto de displays.

Para la realización de este ejercicio, se Divide por etapas:

Paso 1 Diagrama De Estados



Paso 2 definicion de teclado


como se ve en la figura, el teclado cuenta con 7 pines de control. por ejemplo cuando aprietas la tecla numero 1 se conectan los pines 2 y 3, para la tecla 5 se conectan los pines 7 y 1.

En la imagen se puede ver un teclado matricial de 4 filas por 3 columnas con un total de 12 teclas (4×3), consta de 7 pines, 4 pines para las filas y 3 pines para las columnas, este se caracteriza porque a cada tecla le corresponde 2 pines, un pin de una fila y un pin de una columna, para su uso con la FPGA solo serán necesarios la utilización de 7 pines de este.

Se puede ver el orden de las filas y las columnas para este modelo, siendo necesario siempre verificarlos mediante la hoja de datos del teclado que se tenga, en este caso por ejemplo a la tecla 1 le corresponde el pin 1 por estar en la fila 1 y el pin 5 por estar en la  columna 1, a la tecla 8 por ejemplo le corresponde el pin 3 por estar en la fila 3 y el pin 6 por estar en la columna 2, la misma idea es para las demás teclas en cuanto a la correspondencia de pines por tecla.
Teclado matricial
Internamente el teclado matricial de 4×3 se lo puede ver como en la imagen, en ella se ve por ejemplo para las filas en negro, que a la fila 1 le corresponden las teclas 1, 2, 3, y están conectados al pin 1 del teclado, lo mismo para las otras filas; en cuanto a las columnas en azul, por ejemplo a la columna 2 le corresponden las teclas 2, 4, 8, 0 que están conectadas al pin 6, lo mismo para las otras columnas.

Paso 3 definicion de entradas Ds7
El display es una forma de representar números en equipos electrónicos. Está compuesto de siete segmentos que se pueden encender o apagar individualmente. Cada segmento tiene la forma de una pequeña línea.




A cada uno de los segmentos que forman el display se les denomina a, b, c, d, e, f y g y están ensamblados de forma que se permita activar cada segmento por separado consiguiendo formar cualquier dígito numérico. A continuación se muestran algunos ejemplos:
  • Si se activan o encienden todos los segmentos se forma el número “8”.
  • Si se activan sólo los segmentos: “a, b, c, d, e, f,” se forma el número “0”.
  • Si se activan sólo los segmentos: “a, b, g, e, d,” se forma el número “2”.
  • Si se activan sólo los segmentos: “b, c, f, g,” se forma el número “4”.



Paso 4 definición de Hardware Pmods

CONECTORES PMOD
La NEXYS 4 cuenta con 4 conectores PMOD que ofrecen la posibilidad de adicionar hardware a la tarjeta para realizar diseños todavía mas complicados. Cada conector ofrece 8 señales de datos, dos conexiones a GND y dos a 3.3V. En la siguiente tabla se muestra a que pines del FPGA están conectados cada señal de los PMOD

Para la realización de este ejercicio, los pmod a utilizar en la FPGA son los "JA" :
Para el taller del teclado se necesita reflejar la tecla oprimida en un display de 7 segmentos. Como la tarjeta fpga nexys 4 posee 8 displays, usaremos tan solo 1, en este caso el "n6", este se introduce en el código en un vector de 8 bits, en el cual cada bit va a representar un display entonces ponemos en "0" el display que vayamos a utilizar.


Paso 5 código en Software Vivado, Programación "VHDL" 
  • Programación en .vhd

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity division is
    port (
    ledfila, ledcol : out unsigned(3 downto 0);
        clk     : in std_logic;
        reset   : in std_logic;
fila    : in unsigned(3 downto 0);
col     : out unsigned(2 downto 0);
display : out std_logic_vector(7 downto 0);
seg7    : out std_logic_vector(6 downto 0)
    );
end division;

architecture division of division is
    type estado is (reposo, inicio, cuenta, rotacion, deteccionFilaCol, deteccionTecla, mostrar);
    signal estadoActual, estadoSiguiente : estado;
    signal scol : unsigned(2 downto 0);
    signal scol4 : unsigned(3 downto 0);
    signal nfila : unsigned(3 downto 0);
    signal tecla : unsigned(3 downto 0);
    signal multi : unsigned(7 downto 0);

    signal contador : unsigned(23 downto 0);
    constant U0L : unsigned(23 downto 0) := to_unsigned(0,24);

    constant U0 : unsigned(3 downto 0) := to_unsigned(0,4);
    constant U11: unsigned (3 downto 0) := to_unsigned (11,4);
    constant U1 : unsigned(3 downto 0) := to_unsigned(1,4);
    constant U2 : unsigned(3 downto 0) := to_unsigned(2,4);
    constant U3 : unsigned(3 downto 0) := to_unsigned(3,4);
    constant U4 : unsigned(3 downto 0) := to_unsigned(4,4);
    constant U5 : unsigned(3 downto 0) := to_unsigned(5,4);
    constant U6 : unsigned(3 downto 0) := to_unsigned(6,4);
    constant U7 : unsigned(3 downto 0) := to_unsigned(7,4);
    constant U8 : unsigned(3 downto 0) := to_unsigned(8,4);
    constant U9 : unsigned(3 downto 0) := to_unsigned(9,4);
    constant U12: unsigned(3 downto 0) := to_unsigned (12,4);
    constant U10: unsigned (3 downto 0) := to_unsigned (10,4);
begin

ledfila <= fila;
ledcol <= '1' & scol;
    display <= "11111110";
    col <= scol;
    multi <= U3*nfila;
 
    -- camino de datos (datapath)
    process(clk, estadoActual,tecla,scol,fila)
      begin
       if (clk'event and clk = '1') then
         case estadoActual is
             when reposo =>
         scol <= "111";
            contador <= U0L;

             when inicio =>
         scol <= "011";

             when cuenta =>
                  contador <= contador+1;

             when rotacion =>
                  scol <= scol(1 downto 0) & scol(2);
                  contador <= U0L;

    when deteccionFilaCol =>
                  case fila is      
                      when "0111" => nfila <= U0;
             when "1011" => nfila <= U1;
                      when "1101" => nfila <= U2;
                      when "1110" => nfila <= U3;
                     when others => nfila <= U10;
                  end case;
                  case scol is      
                      when "011" => scol4 <= U0;
     when "101" => scol4 <= U1;
                      when "110" => scol4 <= U2;
                      when others => scol4 <= U0;
                  end case;

    when deteccionTecla =>
                  if fila(3)='0' then
                     tecla <= U0;
                  else
                     tecla <= scol4 + U1 + multi(3 downto 0);
                  end if;

             when mostrar =>
                  case tecla is      
                      when U11 => seg7 <= "1111001";  -- 1 working
                      when U8 => seg7 <= "0011001";  -- 4 working
                      when U5 => seg7 <= "0111000";  -- 7 working
                      when U12 => seg7 <= "0110000";  -- 3
                      when U7 => seg7 <= "0010010";  -- 5 working
                      when U4 => seg7 <= "0000000";  -- 8 working
                      When U10 => seg7 <= "0100100";  -- 2 working
                      --When U3 => seg7 <= "1110000"; -- no se
                      when U9 => seg7 <= "0000010";  -- 6 working
                      when U6 => seg7 <= "0011000";  -- 9 working
                      when others => seg7 <= "1000000";  -- *, #
                  end case;
           end case;
         end if;
    end process;

    -- registro de estado
    process(clk, reset)
    begin
        if (reset = '1') then
            estadoActual <= reposo;
        elsif (clk'event and clk = '1') then
            estadoActual <= estadoSiguiente;
        end if;
    end process;

    process (estadoActual,fila,contador) is
    begin
      case estadoActual is    
        when reposo => estadoSiguiente <= inicio;
        when inicio => estadoSiguiente <= cuenta;
        when cuenta =>
           if contador = "111111111111111111111111" then
               estadoSiguiente <= rotacion;
           else
           estadoSiguiente <= cuenta;
           end if;
        when rotacion =>
           if (fila = "1111") then
              estadoSiguiente <= cuenta;
           else
              estadoSiguiente <= deteccionFilaCol;
           end if;
        when deteccionFilaCol =>
              estadoSiguiente <= deteccionTecla;
        when deteccionTecla =>
              estadoSiguiente <= mostrar;
        when mostrar =>
              estadoSiguiente <= inicio;
     end case;
   end process;
end division;

  • Programación en .xdc (constrains)
set_property LOC E3 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports clk]

# Mapear RESET a BTND
set_property LOC V10 [get_ports reset]
set_property IOSTANDARD LVCMOS33 [get_ports reset]

set_property PACKAGE_PIN B13 [get_ports {col[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {col[0]}]
set_property PACKAGE_PIN F14 [get_ports {col[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {col[1]}]
set_property PACKAGE_PIN D17 [get_ports {col[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {col[2]}]
set_property PACKAGE_PIN G13 [get_ports {fila[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {fila[0]}]
set_property PACKAGE_PIN C17 [get_ports {fila[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {fila[1]}]
set_property PACKAGE_PIN D18 [get_ports {fila[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {fila[2]}]
set_property PACKAGE_PIN E18 [get_ports {fila[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {fila[3]}]

set_property PACKAGE_PIN L3 [get_ports {seg7[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg7[0]}]
set_property PACKAGE_PIN N1 [get_ports {seg7[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg7[1]}]
set_property PACKAGE_PIN L5 [get_ports {seg7[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg7[2]}]
#set_property SEVERITY {warning} [get_drc_checks NSTD-1]
#set_property SEVERITY {warning} [get_drc_checks UCIO-1]
set_property PACKAGE_PIN L4 [get_ports {seg7[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg7[3]}]
set_property PACKAGE_PIN K3 [get_ports {seg7[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg7[4]}]
set_property PACKAGE_PIN M2 [get_ports {seg7[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg7[5]}]
set_property PACKAGE_PIN L6 [get_ports {seg7[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg7[6]}]

set_property PACKAGE_PIN N6 [get_ports {display[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {display[0]}]

set_property PACKAGE_PIN M6 [get_ports {display[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {display[1]}]

set_property PACKAGE_PIN M3 [get_ports {display[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {display[2]}]

set_property PACKAGE_PIN N5 [get_ports {display[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {display[3]}]

set_property PACKAGE_PIN N2 [get_ports {display[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {display[4]}]

set_property PACKAGE_PIN N4 [get_ports {display[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {display[5]}]

set_property PACKAGE_PIN L1 [get_ports {display[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {display[6]}]

set_property PACKAGE_PIN M1 [get_ports {display[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {display[7]}]

set_property PACKAGE_PIN T8 [get_ports {ledcol[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {ledcol[0]}]

set_property PACKAGE_PIN V9 [get_ports {ledcol[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {ledcol[1]}]

set_property PACKAGE_PIN R8 [get_ports {ledcol[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {ledcol[2]}]

set_property PACKAGE_PIN T6 [get_ports {ledcol[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {ledcol[3]}]

set_property PACKAGE_PIN P2 [get_ports {ledfila[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {ledfila[0]}]

set_property PACKAGE_PIN R2 [get_ports {ledfila[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {ledfila[1]}]

set_property PACKAGE_PIN U1 [get_ports {ledfila[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {ledfila[2]}]

set_property PACKAGE_PIN P5 [get_ports {ledfila[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {ledfila[3]}]

Paso 6 funcionamiento en la FPGA


WEBGRAFIA:
1. http://mrelbernitutoriales.com/teclado/
2. https://programacionsiemens.com/display-de-7-segmentos-step-7/

DESCARGAShttps://mega.nz/#!CZVGhKCY!vP5DViGqmQFIODJtvkXr_XhPGExSpHHd-t3wBqiZW5w


miércoles, 21 de septiembre de 2016

Ejercicio multiplicador de 3 Bits

1) Especificación
multiplicador de 2 señales por donde cada una le entran 3 bits.

2)Modelo Matemático


3)Descripcion

 Architectura





















LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.ALL;
entity circuito1 is
Port ( A : in STD_LOGIC_VECTOR (2 downto 0);
          B : in STD_LOGIC_VECTOR (2 downto 0);          
         M : out STD_LOGIC_VECTOR (5 downto 0);
end circuito1;
architecture Behavioral of circuito1 is
begin
process (A , B)
begin
M <= A * B;
end process;
end Behavioral;


lunes, 19 de septiembre de 2016

std_logic_vector

std_logic_vector

DEFINICION

El tipo std_logic_vector está predefinido en el paquete Std_Logic_1164 como un tipo de matriz de una dimensión estándar con cada elemento siendo del tipo std_logic.
  • Std_logic_vector no es una parte de la Norma VHDL. En lugar de ello, se define por IEEE Std 1164

Sintaxis:

type std_logic_vector is array (natural range <>) of std_logic;

Descripción

Std_logic_vector es un (unbound) es decir vectores sin restricciones de elementos resueltos en nueve valores lógicos ( std_logic tipo), que se definen en el paquete Std_Logic_1164.

El paquete Std_Logic_1164 define operadores lógicos ("and", "nand", "or", "nor", "xor", and "not") para operadores del tipo std_logic_vector. Además, las funciones de conversión desde y hacia bit_vector se apoyan también.

Al asignar un objeto del tipo std_logic_vector se puede realizar de la misma manera como en el caso de las matrices, es decir, utilizando asignaciones de un solo elemento, concatenationaggregates , rebanadaso cualquier combinación de ellos. Por otra parte, debido a que los elementos son de tipo resuelta que se le permite hacer múltiples tareas a un tipo de objeto std_logic_vector. En tal caso, se utiliza la función de resolución definida para std_logic.

EJEMPLO

-----------------------------------------------------------
Type T_Data is array (7 downto 0) of std_logic;
signal DataBus, Memory : T_Data;
CPU : process
variable RegA : T_Data;
begin
  ...
  DataBus <= RegA;
end process CPU;
Mem : process
begin
  ...
  DataBus <= Memory;
end process Mem;
-----------------------------------------------------------

Std_logic_vector es la mejor opción para los autobuses, que son impulsados ​​desde diferentes lugares, como en el bus de datos enumerados arriba. Tal asignación múltiple sería ilegal si se utiliza un bit_vector.

Notas importantes

  • Std_logic_vector no se debe confundir con el tipo Std_Ulogic_Vector. Elementos de estos últimos son del tipo Std_Ulogic y son de la versión unresloved de std_logic. Esto significa que es ilegal  los dos valores (por ejemplo, '0' y 'Z') para ser simultáneamente en una señal del tipo Std_ulogic.
  • Con el fin de utilizar el tipo de std_logic_vector, el paquete Std_Logic_1164 debe estar incluido explícitamente en el comienzo de una entidad:
    biblioteca IEEE; utilizar IEEE.Std_Logic_1164. todo ;

Webgrafia
http://www.vhdl.renerta.com/mobile/source/vhd00069.htm

lunes, 29 de agosto de 2016

Circuito secuencial S mayoría 3

Circuito secuencial S mayoría 3

Si
# 1>=int (N/2 +1)   →M=1
Necesidad:
Saber cuántos 1s hay en un bloque de N bits.
·         Especificaciones
·         Modelado matemático
·         Modelado funcional

Si D=1    → cuenta <=cuenta +1
I=0, cuenta=0, m=0.
While (i< N) {
If (D=1){
Cuenta <=cuenta+1}
I<=i+1  }
If ((cuenta>=int ( N/2+1) 
{
 m<=1 
}

Diagrama de estados