Problemas Resueltos de VHDL

Download as pdf or txt
Download as pdf or txt
You are on page 1of 4

UNIVERSIDAD NACIONAL DEL CALLAO 1 ESCUELA PROFESIONAL DE ING.

ELECTRONICA PROBLEMAS RESUELTOS DE VHDL

Ejemplo#1: MEMORIA RAM GENERICA library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity SRAM is generic( w: d: a: port( Clock: Enable: Read: Write: Read_Addr: Write_Addr: Data_in: Data_out: ); end SRAM;

integer:=4; -- ancho de palabra integer:=4; -- n de palabras integer:=2);-- ancho direccin in std_logic; in std_logic; in std_logic; in std_logic; in std_logic_vector(a-1 downto 0); in std_logic_vector(a-1 downto 0); in std_logic_vector(w-1 downto 0); out std_logic_vector(w-1 downto 0)

architecture behav of SRAM is type ram_type is array (0 to d-1) of std_logic_vector(w-1 downto 0); signal tmp_ram: ram_type; begin -- Lectura process(Clock, Read) begin if (Clock'event and Clock='1') then if Enable='1' then if Read='1' then Data_out <= tmp_ram(std2n(Read_Addr)); else Data_out <= (Data_out'range => 'Z'); -- Todos los bits de Data_out se ponen a 'Z' end if; end if; end if; end process; -- Escritura process(Clock, Write) begin if (Clock'event and Clock='1') then if Enable='1' then if Write='1' then tmp_ram(std2n(Write_Addr)) <= Data_in; end if; end if; end if; end process; end behav;

UNIVERSIDAD NACIONAL DEL CALLAO 2 ESCUELA PROFESIONAL DE ING. ELECTRONICA


Ejemplo#2: SUMA DE 2 VECTORES library IEEE; use IEEE.std_logic_1164.all; package ope_aritmeticas is function vector_to_natural (v:in std_logic_vector) return natural; function natural_to_vector (nat : in natural; length : in natural) return std_logic_vector; procedure vector_add ( v1, v2 : in std_logic_vector; v_result : out std_logic_vector); end ope_aritmeticas; package body ope_aritmeticas is function vector_to_natural (v:in std_logic_vector) return natural is variable aux : natural:=0; begin for i in v'range loop if v(i)='1' then aux := aux + (2**i); end if; end loop; return aux; end vector_to_natural; function natural_to_vector (nat : in natural; length : in natural) return std_logic_vector is variable v: std_logic_vector(length-1 downto 0); variable cociente, aux, i, resto: natural; begin aux:= nat; i:=0; while (aux/=0) and (i<length) loop cociente := aux/2; resto := aux mod 2; if resto=0 then v(i):='0'; else v(i):='1'; end if; i := i+1; aux := cociente; end loop; for j in i to length-1 loop v(j):='0'; end loop; return v; end natural_to_vector; procedure vector_add ( v1, v2 : in std_logic_vector; v_result : out std_logic_vector) is variable suma,long: natural; begin long:=v1'length; suma:= vector_to_natural(v1) + vector_to_natural(v2); v_result := natural_to_vector(suma,long); end vector_add; end ope_aritmeticas;

UNIVERSIDAD NACIONAL DEL CALLAO 3 ESCUELA PROFESIONAL DE ING. ELECTRONICA


library IEEE; use IEEE.std_logic_1164.all; use work.ope_aritmeticas.all; -- Para poder utilizar el paquete entity sum is port (v1,v2: in std_logic_vector; v_result : out std_logic_vector); end sum; architecture beh of sum is begin p1: process(v1, v2) variable suma: natural; begin vector_addu(v1,v2,suma); v_result<= suma; end process p1; end beh;

Ejemplo#3: REGISTRO DE 8 BITS entity biestable is port (clk, reset, C: in bit; D: out bit); end biestable; architecture arch of biestable is begin process(clk, reset) begin if reset=1 then D<=0; elsif (clkevent and clk=1) then D<=C; end if; end process; end arch; entity registro_8 is port (clk, reset: in bit; A: in bit_vector(7 downto 0); B: out bit_vector(7 downto 0)); end registro_8; architecture estructural of registro_8 is component biestable port(clk, reset, c: in bit; d: out bit); end component biestable; signal F: bit_vector(7 downto 0); begin gen: for i in 0 to 7 generate u: biestable port map(clk, reset, A(i),F(i)); end generate gen; B <= F; end estructural;

UNIVERSIDAD NACIONAL DEL CALLAO 4 ESCUELA PROFESIONAL DE ING. ELECTRONICA


Ejemplo#4: CONTROLADOR DE MOTOR PASO A PASO library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity motor is port( clk : in std_logic; en, dir : in std_logic; a, b, c, d : out std_logic); end fsmf; architecture funcional of motor is type estados is (s1, s2, s3, s4); signal state : estados; begin process (clk) begin if (clk'event and clk = '1') then case state is when s1 => a <= '1'; b <= '0'; if (en = '0') then state <= s1; elsif (dir = '0') then state <= s2; else state <= s4; end if; when s2 => a <= '1'; b <= '0'; if (en = '0') then state <= s2; elsif (dir = '0') then state <= s3; else state <= s1; end if; when s3 => a <= '0'; b <= '1'; if (en = '0') then state <= s3; elsif (dir = '0') then state <= s4; else state <= s2; end if; when s4 => a <= '0'; b <= '1'; if (en = '0') then state <= s4; elsif (dir = '0') then state <= s1; else state <= s3; end if; end case; end if; end process; end funcional;

c <= '1'; d <= '0';

c <= '0'; d <= '1';

c <= '0'; d <= '1';

c <= '1'; d <= '0';

You might also like