Está en la página 1de 15

1.

Disear un codificador BCD a AITKEN


Cdigo VHDL

Simulacin

2. Disear un comparador de dos nmeros de 8 bits c/u

Conversin

Cdigo VHDL

Simulacin

3. Disear un mux cudruple 2 a 1


Cdigo VHDL

Simulacin

4. Disear un comparador de dos nmeros de 2 bits c/u


Cdigo VHDL

Simulacin

5. Mquina de Estado Moore

6. Mquina de Estado Mealy

7. Problema 1
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY prob1 IS
PORT (X: IN STD_LOGIC;
reinicio, reloj: IN
STD_LOGIC;
Z: OUT
STD_LOGIC_VECTOR (1 DOWNTO
0 )) ;
END ENTITY prob1;
ARCHITECTURE detector OF prob1
IS
TYPE estado IS (estado0,
estado1, estado2, estado3,
estado4);
SIGNAL estado_pr,
estado_sg: estado;
BEGIN
SEQ: PROCESS (reinicio, reloj)
BEGIN
IF(X = '1') THEN estado_pr
<= estado0;
ELSIF RISING_EDGE (reloj)
THEN estado_pr <= estado_sg;
END IF;
END PROCESS SEQ;
COMB: PROCESS (X, estado_pr)
BEGIN
CASE estado_pr IS
WHEN estado0=>
IF (x = '1') THEN estado_sg
<= estado1; ELSE estado_sg <=
estado0;
END IF;
WHEN estado1 =>
IF (x = '0') THEN estado_sg <=
END IF;
WHEN estado2 =>
IF (x = '1') THEN estado_sg <=
END IF;
WHEN estado3 =>
IF (x = '0') THEN estado_sg <=
END IF;
WHEN estado4 =>
IF (x = '1') THEN estado_sg <=
END IF;
END CASE;
END PROCESS COMB;
SAL: PROCESS(X, estado_pr)
BEGIN
CASE estado_pr IS
WHEN estado0 =>
IF (X = '0') THEN
Z <= "01"; ELSE Z <= "01";

estado1; ELSE estado_sg <= estado2;


estado3; ELSE estado_sg <= estado2;
estado3; ELSE estado_sg <= estado4;
estado_pr; ELSE estado_sg <= estado_pr;

END IF;
WHEN estado1 =>
IF (X = '0') THEN
z <= "01"; ELSE Z <= "10";
END IF;
WHEN estado2 =>
IF (x = '0') THEN
z <= "10"; ELSE z <= "10";
END IF;
WHEN estado3 =>
IF (X = '0') THEN
Z <= "10"; ELSE z <= "10";
END IF;
WHEN estado4 =>
IF (X = '0') THEN
Z<= "00"; ELSE z <= "00";
END IF;
END CASE;
END PROCESS SAL;
END detector;

8. Mquina de mealy
Library ieee;
Use ieee.std_logic_1164.all;
Entity mealy is
Port (clk, reset: in std_logic;
x : in std_logic_vector (1 downto 0);
z : out std_logic_vector(5 downto 0));
End mealy;
Architecture mealy1 of mealy is
Type estado is (s0, s1, s2, s3);
Signal s_pr, s_sg : estado;
Begin
seq: process (clk)
begin
if reset = '1' then s_pr <= s0;
elsif rising_edge(clk) then s_pr <= s_sg;
end if;
end process seq;

comb: process (x, s_pr)


begin
case s_pr is
when s0 =>
if (x = "00") then s_sg <= s1;
else s_sg <= s0;
end if;
when s1 =>
if (x = "01") then s_sg <= s2;
else s_sg <= s1;
end if;
when s2 =>
if (x = "10") then s_sg <= s3;
else s_sg <= s2;
end if;
when s3 =>
if (x = "11") then s_sg <= s0;
else s_sg <= s3;
end if;
end case;
end process comb;
sal: process (x, s_pr)
begin
case s_pr is
when s0 =>
if x= "00" then z <= "110110";
else z <= "110110";
end if;
when s1 =>
if x= "01" then z <= "000101";
else z <= "000101";
end if;
when s2 =>
if x= "10" then z <= "101100";
else z <= "101100";
end if;
when s3 =>
if x= "11" then z <= "000000";
else z <= "000000";
end if;
end case;
end process sal;
end mealy1;

9. Mquina de Moore
LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY moore IS
PORT( S: IN STD_LOGIC_VECTOR(1 DOWNTO 0);
Z: OUT STD_LOGIC_VECTOR (5 DOWNTO 0);
CLOCK: IN STD_LOGIC);
END ENTITY moore;
ARCHITECTURE mur OF moore IS
Type STATE_TYPE IS (A, B, C, D);
Signal CURRENT_STATE, NEXT_STATE: STATE_TYPE;
BEGIN
COMBIN: process (CURRENT_STATE, S)
BEGIN
CASE CURRENT_STATE IS
WHEN A =>
Z <= "110110";
if
(S= "00") THEN NEXT_STATE <= B;
else NEXT_STATE <= A;
end if;
WHEN B =>
Z<= "000101";
if (S= "01") THEN NEXT_STATE <= C;
else NEXT_STATE <= B;
end if;
WHEN C =>
Z<= "101100";
if (S= "10") THEN NEXT_STATE <= D;
else NEXT_STATE <= C;
end if;
WHEN D =>
Z<= "000000";
if (S= "11") THEN NEXT_STATE <= A;
else NEXT_STATE <= D;
end if;
end CASE;
End PROCESS;
SYNCH: PROCESS
BEGIN
WAIT UNTIL CLOCK' EVENT AND CLOCK = '1';
CURRENT_STATE <= NEXT_STATE;
END PROCESS;
END mur;

Teclado matricial 4x4


sbit
sbit
sbit
sbit
sbit
sbit

LCD_RS
LCD_EN
LCD_D4
LCD_D5
LCD_D6
LCD_D7

at
at
at
at
at
at

RA4_bit;
RA6_bit;
RA0_bit;
RA1_bit;
RA2_bit;
RA3_bit;

sbit
sbit
sbit
sbit
sbit
sbit

LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction

at
at
at
at
at
at

TRISA4_bit;
TRISA6_bit;
TRISA0_bit;
TRISA1_bit;
TRISA2_bit;
TRISA3_bit;

// Fin de declaracin de variables de conexin.


char kp, contador=0;
void main(){
OSCCON=0x40;
//Oscilador interno a 1MHz (TCI=4 us).
while (OSCCON.IOFS==0); //Esperar mientras el oscilador est inestable.
ANSEL=0x00;
//Bits AN6:AN0 como E/S digital.
Keypad_Init();
//Inicializa el teclado.
Lcd_Init();
//Inicializa el LCD.
Lcd_Cmd(_LCD_CLEAR);
//Borra el display.
Lcd_Cmd(_LCD_CURSOR_OFF);
//Apaga el cursor.
while (1){
kp=0;
do
//Espera por una tecla.
kp=Keypad_Key_Click(); //Lee el nmero de la tecla y lo guarda en kp.
while (!kp);
switch (kp){
case 1: kp = 49; break; //49 es el cdigo ASCII del nmero 1.
case 2: kp = 50; break; //50 es el cdigo ASCII del nmero 2.
case 3: kp = 51; break; //51 es el cdigo ASCII del nmero 3.
case 4: kp = 65; break; // A
case 5: kp = 52; break; // 4
case 6: kp = 53; break; // 5
case 7: kp = 54; break; // 6
case 8: kp = 66; break; // B
case 9: kp = 55; break; // 7
case 10: kp = 56; break; // 8
case 11: kp = 57; break; // 9
case 12: kp = 67; break; // C
case 13: kp = 42; break; // *
case 14: kp = 48; break; // 0
case 15: kp = 35; break; // #
case 16: kp = 68; break; // D
}
Lcd_Chr_CP(kp);
//Presenta el carcter en el LCD.
contador++;
//Cuenta el nmero de pulsaciones.
if (contador==16){
//Si se han efectuado 16 pulsaciones.
contador=0;
Delay_1sec();
//Espera 1 s.
Lcd_Cmd(_LCD_CLEAR);
//Borra la pantalla y retorna el cursor al
}
//origen.
}
}

Motor
//MotorDC_01.c
void main(){
OSCCON=0x60;
//Oscilador interno a 4MHz (TCI=1 us).
while (OSCCON.IOFS==0);
//Esperar mientras el oscilador est inestable.
PORTB=0x00;
//Inicializacin.
NOT_RBPU_bit=0;
//Habilitar las pull-up.
TRISB=0b11100011;
//RB<4:2> como salidas.
while (1){
if (RB0_bit==0) RB4_bit=0;
//Motor desconectado.
if (RB0_bit==1){
if (RB1_bit==0) PORTB=0b00011000; //Giro a la derecha.
if (RB1_bit==1) PORTB=0b00010100; //Giro a la izquierda.
}
}
}
CONTROL DE GRIRO EN AMBOS SENTIDOS DE UN MOTOR DC

Voltmetro LCD
// CONFIGURACION LCD
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
unsigned long value;
//se almacena el valor del canal0
unsigned char d1,d2,d3,d4,*text; //d1,d2,d3,d4: son para convertir el dato de entrada
void main() {
INTCON = 0;
ADCON1 = 0b10000010; // habilito la conversion A/D
TRISA = 1;
Lcd_Init();
Lcd_Cmd(_LCD_CURSOR_OFF); // Comando LCD (apagar el cursor)
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"Voltaje:");
while(1){
value=adc_read(0);
value=value*5000/1023;
d1=value/1000;
d2=(value/100)%10;
//"%" este operador devuelve el mdulo de la divisin
d3=(value/10)%10;
d4=value%10;
Lcd_chr(2,1,48+d1); // se imprime la lectura
Lcd_chr_CP(48+d2);
// 48 es el codigo ASCI del numero '0'
Lcd_chr_CP('.');
Lcd_chr_CP(48+d3);
Lcd_chr_CP(48+d4);
Lcd_chr_CP('V');
delay_ms(50);

}
}

Voltmetro DISPLAY
short numero[ ] = { 64,121,36,48,25,18,2,120,0,16 };
unsigned long value;
//se almacena el valor del canal0
unsigned char d1,d2,d3,d4,n=1; //d1,d2,d3,d4: digitos, n selecciona el display
void interrupt() {
switch (n){
//Selecciono que Display Activar y que valor cargar
case 1:
PORTC.F0 = 1;
PORTC.F1 = 0;
PORTC.F2 = 0;
PORTC.F3 = 0;
PORTB=numero[d1];
n=2;
break;
case 2:
PORTC.F0 = 0;
PORTC.F1 = 1;
PORTC.F2 = 0;
PORTC.F3 = 0;
PORTB=numero[d2];
n=3;
break;
case 3:
PORTC.F0 = 0;
PORTC.F1 = 0;
PORTC.F2 = 1;
PORTC.F3 = 0;
PORTB=numero[d3];
n=4;
break;
case 4:
PORTC.F0 = 0;
PORTC.F1 = 0;
PORTC.F2 = 0;
PORTC.F3 = 1;
PORTB=numero[d4];
n=1;
break;
}
INTCON = 0x20;
// Bit T0IE se pone a 1, el bit T0IF se pone a 0
TMR0=150;
// cargo valor en TMR0
}
void main() {

ADCON1 = 0b10000010; // habilito la conversion A/D


TRISA = 1;
// PORTA.0 como entrada
TRISB = 0;
// PORTB COMO SALIDA
TRISC = 0;
// PORTC COMO SALIDA
OPTION_REG = 5;
// configura prescaler
TMR0 = 150;
// CARGA inicial del timer0
INTCON = 0xA0;
// habilita interrupcion del timer0
while(1){
value=adc_read(0);
// lee el canal 0 del ADC
value=value*5000/1023; //"%" devuelve el mdulo de la divisin
d1=value/1000;
// DECENAS
d2=(value/100)%10;
// UNIDADES
d3=(value/10)%10;
// DECIMAS
d4=value%10;
// CENTESIMAS
delay_ms(100);
}
}

Calculadora
PULSADOR 1
0
0
1
1
const unsigned int DIGITOS[] =
{
0x3F, //Cdigo del dgito 0
0x06, //Cdigo del dgito 1
0x5B, //Cdigo del dgito 2
0x4F, //Cdigo del dgito 3
0x66, //Cdigo del dgito 4
0x6D, //Cdigo del dgito 5
0x7D, //Cdigo del dgito 6
0x07, //Cdigo del dgito 7
0x7F, //Cdigo del dgito 8
0x6F, //Cdigo del dgito 9
};
void numeros ();
void disp7 (int result);
int num1, num2, x;
void main()
{
int result;
ADCON1 = 7;
TRISA = 3;
TRISB=0xFF;
TRISC=0;
TRISD=0;
PORTD = 0;

PULSADOR 0
0
1
0
1

OPERACIN ARITMETICA
SUMA
RESTA
MULTIPLICACION
DIVISION

PORTC = 0;
while (1)
{
switch (PORTA)
{
case 0:
numeros ();
result=num1 + num2;
break;
case 1:
numeros ();
result=num1-num2;
break;
case 2:
numeros ();
result=num1*num2;
break;
case 3:
numeros ();
result= num1/num2;
break;
default:
PORTC = 0;
break;
}disp7(result);
}
}
void numeros ()
{
num1 = PORTB & 0x0F;
num2 =(PORTB>>4) & 0x0F;
}
void disp7 (int result)
{
int U, D, C, M;
M = result/1000;
C = (result-M*1000)/100;
D = (result-M*1000-C*100)/10;
U = (result-M*1000-C*100-D*10);
PORTC = DIGITOS [M];
PORTD = 7 ;
delay_ms(10);
PORTD = 15;
PORTC= DIGITOS [C];
PORTD = 11;
delay_ms(10);
PORTD = 15;
PORTC= DIGITOS [D];
PORTD = 13;
delay_ms(10);
PORTD = 15;
PORTC= DIGITOS [U];
PORTD = 14;
delay_ms(10);
PORTD = 15;
}

También podría gustarte