50
LAB 5 Tarjeta de Desarrollo Spartan-3 Laboratorio de Sistemas Digitales ELO212 Primer Semestre de 2012

Reglas de Evaluación - Ramos Departamento de …ramos.elo.utfsm.cl/~elo212/labs/elo212-clase5-201201.pdf · para manejo de display de 7 segmentos. ... Permite conectar periféricos

  • Upload
    tranque

  • View
    214

  • Download
    0

Embed Size (px)

Citation preview

LAB 5

Tarjeta de Desarrollo Spartan-3 Laboratorio de Sistemas Digitales

ELO212

Primer Semestre de 2012

Objetivos Generales

Usar la interfaz serial sincrónica PS/2 como

dispositivo de entrada de datos.

Diseñar un multiplexor con división de tiempo

para manejo de display de 7 segmentos.

Desarrollar métodos de prueba para módulos

individuales y el circuito completo.

Interfaz PS/2

Permite conectar periféricos teclado y mouse.

Protocolo de comunicación serial bidireccional.

Para teclados se garantiza el conjunto 2 de los scan codes.

Responden a todos los comandos enviados, sin embargo no actúan en todos ellos.

Socket y Pinout

Pin 1: Data

Pin 2: Reservado

Pin 3: Ground

Pin 4: Vcc (+5V)

Pin 5: Clock

Pin 6: Reservado

Comunicación Bidireccional

Estado IDLE:

◦ Data y Clock en alto

Estado INHIBIT:

◦ Data en alto y Clock en bajo

Estado REQUEST TO SEND:

◦ Data en bajo y Clock en alto

PS/2 Frame (1)

1 bit de partida: siempre es 0.

8 bits de datos: LSB a MSB.

1 bit de paridad (impar)

1 bit de parada: siempre es 1.

1 bit de ack: sólo para comunicación host

teclado/mouse.

PS/2 Frame (2)

Scan Code (1)

Hay varios tipos de scan codes, el más

popular (por omisión) es el número 2.

Cada tecla tiene asociado un scan code

compuesto por:

◦ make code, que se emite al presionar una

tecla

◦ breake code, que se emite al soltar la tecla

Key Make Break ASCII

A 1C F0,1C 41

B 32 F0,32 42

C 21 F0,21 43

D 23 F0,23 44

E 24 F0,24 45

F 2B F0,2B 46

G 34 F0,34 47

H 33 F0,33 48

I 43 F0,43 49

Scan Code (2)

PS/2 Driver Verilog (1)

10 0

ShiftRegSig1

10 1

ShiftRegSig2

kd

kc

kbs

0 xxxxxxxx

value

PS/2 Driver Verilog (1)

0 x x x x x x x x x 10 0

ShiftRegSig1

x x x x x x x x x 10 1

ShiftRegSig2

kd

kc x x

kbs

0 xxxxxxxx

value

PS/2 Driver Verilog (1)

0 0 x x x x x x x x 10 0

ShiftRegSig1

x x x x x x x x x 10 1

ShiftRegSig2

kd

kc x x

kbs

0 xxxxxxxx

value

PS/2 Driver Verilog (1)

0 0 0 x x x x x x x 10 0

ShiftRegSig1

x x x x x x x x x 10 1

ShiftRegSig2

kd

kc x x

kbs

0 xxxxxxxx

value

PS/2 Driver Verilog (1)

0 0 0 0 x x x x x x 10 0

ShiftRegSig1

x x x x x x x x x 10 1

ShiftRegSig2

kd

kc x x

kbs

0 xxxxxxxx

value

PS/2 Driver Verilog (1)

0 0 0 0 0 x x x x x 10 0

ShiftRegSig1

x x x x x x x x x 10 1

ShiftRegSig2

kd

kc x x

kbs

0 xxxxxxxx

value

PS/2 Driver Verilog (1)

1 0 0 0 0 0 x x x x 10 0

ShiftRegSig1

x x x x x x x x x 10 1

ShiftRegSig2

kd

kc x x

kbs

0 xxxxxxxx

value

PS/2 Driver Verilog (1)

1 1 0 0 0 0 0 x x x 10 0

ShiftRegSig1

x x x x x x x x x 10 1

ShiftRegSig2

kd

kc x x

kbs

0 xxxxxxxx

value

PS/2 Driver Verilog (1)

1 1 1 0 0 0 0 0 x x 10 0

ShiftRegSig1

x x x x x x x x x 10 1

ShiftRegSig2

kd

kc x x

kbs

0 xxxxxxxx

value

PS/2 Driver Verilog (1)

1 1 1 1 0 0 0 0 0 x 10 0

ShiftRegSig1

x x x x x x x x x 10 1

ShiftRegSig2

kd

kc x x

kbs

0 xxxxxxxx

value

PS/2 Driver Verilog (1)

1 1 1 1 1 0 0 0 0 x 10 0

ShiftRegSig1

x x x x x x x x x 10 1

ShiftRegSig2

kd

kc 0 x

kbs

0 xxxxxxxx

value

PS/2 Driver Verilog (1)

1 1 1 1 1 1 0 0 0 0

10 0

ShiftRegSig1

x x x x x x x x x 10 1

ShiftRegSig2

kd

kc 0 x

kbs

0 xxxxxxxx

value

PS/2 Driver Verilog (1)

0 1 1 1 1 1 1 0 0 0 10 0

ShiftRegSig1

0 x x x x x x x x 10 1

ShiftRegSig2

kd

kc 0 x

kbs

0 xxxxxxxx

value

PS/2 Driver Verilog (1)

0 0 1 1 1 1 1 1 0 0 10 0

ShiftRegSig1

0 0 x x x x x x x 10 1

ShiftRegSig2

kd

kc 0 x

kbs

0 xxxxxxxx

value

PS/2 Driver Verilog (1)

0 0 0 1 1 1 1 1 1 0 10 0

ShiftRegSig1

0 0 0 x x x x x x 10 1

ShiftRegSig2

kd

kc 0 x

kbs

0 xxxxxxxx

value

PS/2 Driver Verilog (1)

1 0 0 0 1 1 1 1 1 0 10 0

ShiftRegSig1

0 0 0 0 x x x x x 10 1

ShiftRegSig2

kd

kc 1 x

kbs

0 xxxxxxxx

value

PS/2 Driver Verilog (1)

1 1 0 0 0 1 1 1 1 1 10 0

ShiftRegSig1

0 0 0 0 0 x x x x 10 1

ShiftRegSig2

kd

kc 1 x

kbs

0 xxxxxxxx

value

PS/2 Driver Verilog (1)

1 1 1 0 0 0 1 1 1 1 10 0

ShiftRegSig1

1 0 0 0 0 0 x x x 10 1

ShiftRegSig2

kd

kc 1 x

kbs

0 xxxxxxxx

value

PS/2 Driver Verilog (1)

0 1 1 1 0 0 0 1 1 1 10 0

ShiftRegSig1

1 1 0 0 0 0 0 x x 10 1

ShiftRegSig2

kd

kc 1 x

kbs

0 xxxxxxxx

value

PS/2 Driver Verilog (1)

0 0 1 1 1 0 0 0 1 1 10 0

ShiftRegSig1

1 1 1 0 0 0 0 0 x 10 1

ShiftRegSig2

kd

kc 1 x

kbs

0 xxxxxxxx

value

PS/2 Driver Verilog (1)

0 0 0 1 1 1 0 0 0 1 10 0

ShiftRegSig1

1 1 1 1 0 0 0 0 0 10 1

ShiftRegSig2

kd

kc 1 x

kbs

0 xxxxxxxx

value

PS/2 Driver Verilog (1)

0 0 0 0 1 1 1 0 0 1 10 0

ShiftRegSig1

1 1 1 1 1 0 0 0 0 10 1

ShiftRegSig2

kd

kc 0 0

kbs

1 xxxxxxxx

value

PS/2 Driver Verilog (1)

1 0 0 0 0 1 1 1 0 0 10 0

ShiftRegSig1

1 1 1 1 1 1 0 0 0 10 1

ShiftRegSig2

kd

kc 0 0

kbs

0 1C

value

PS/2 Driver Verilog (2a)

module kbd(rst, clk, kd, kc, kbs, value);

input rst, clk, kd, kc; // reset, clock, k-data, k-clock

output reg kbs; // keyboard stroke (negedge)

output reg [7:0] value; // scan code

// ------------------------------------------------------------------

// -- Signal Declarations

// ------------------------------------------------------------------

reg kdi, kci;

reg dff1, dff2;

reg [10:0] ShiftRegSig1;

reg [10:1] ShiftRegSig2;

reg kbs_tmp;

PS/2 Driver Verilog (2b)

// ------------------------------------------------------------------

// -- Module Implementation

// ------------------------------------------------------------------

// --Flip Flops used to condition signals coming from PS2--

always @ (posedge clk or posedge rst)

begin

if (rst == 1) begin

dff1 <= 0; dff2 <= 0; kdi <= 0; kci <= 0;

end else begin

dff1 <= kd; kdi <= dff1; dff2 <= kc; kci <= dff2;

end

end

PS/2 Driver Verilog (2c)

// --Shift Registers used to clock in scan codes from PS2--

always @(negedge kci or posedge rst)

begin

if (rst == 1) begin

ShiftRegSig1 <= 11'b00000000000;

ShiftRegSig2 <= 10'b0000000000;

end else begin

ShiftRegSig1[10:0] <= {kdi, ShiftRegSig1[10:1]};

ShiftRegSig2[10:1] <= {ShiftRegSig1[0], ShiftRegSig2[10:2]};

end

end

PS/2 Driver Verilog (2d) // --Wait for scan code

always @(posedge rst or posedge kci)

begin

if (rst == 1) begin

value <= 8'b00000000; kbs_tmp <= 0;

end else if (ShiftRegSig2[9:2] == 8'b11110000) begin

value <= value; kbs_tmp <= 1;

end else if (ShiftRegSig2[8:1] == 8'b11110000) begin

value <= ShiftRegSig1[8:1]; kbs_tmp <= 0;

end

end

always @(negedge clk) kbs <= kbs_tmp;

endmodule

Ejemplo Uso Driver PS/2

module kbdUse(rst, clk, kd, kc, led);

input rst, clk, kd, kc;

output reg [7:0] led;

wire [7:0] value;

kbd kbd0(rst, clk, kd, kc, kbs, value);

always @ (negedge rst or negedge kbs)

if (rst == 0) led <= 0; else led <= led + 1;

endmodule

Display 7 segmentos

4 dígitos (7 segmentos).

No dispone de conversores BCD / 7

segmentos.

Ánodo común.

12 salidas para controlar el display.

Se debe multiplexar en el tiempo para

poder ver números de más de 1 dígito.

Configuración del Display

Conexiones

Driver Verilog BCD/7Seg. module ssdec(val, pt, type, ssg);

input [3:0] val; // binary value

input pt, type; // point, display type (0: anode, 1: cathode)

output [7:0] ssg; // segments

assign ssg = ((type == 1) ? 8'h0 : 8'hff) ^ (

(val == 0) ? {pt, 7'b0111111} :

(val == 1) ? {pt, 7'b0000110} :

(val == 2) ? {pt, 7'b1011011} :

(val == 3) ? {pt, 7'b1001111} :

// ……

(val == 11) ? {pt, 7'b1111100} :

(val == 12) ? {pt, 7'b1011000} :

(val == 13) ? {pt, 7'b1011110} :

(val == 14) ? {pt, 7'b1111001} :

{pt, 7'b1110001});

endmodule

Driver Verilog Display 7Seg. (1)

module display(clk, num, ssg, dctl);

input clk;

input [15:0] num;

output [7:0] ssg;

output reg [3:0] dctl;

// fill in ….

endmodule

Contador BCD module bcdcounter(rst, clk, value);

input rst, clk; // reset, clock

output reg [15:0] value; // 4 bcd digits

always @(negedge clk or posedge rst) begin

if (rst == 1)

value <= 0;

else begin

if (value[3:0] == 9) begin

value[3:0] <= 0;

if (value[7:4] == 9) begin

value[7:4] <= 0;

if (value[11:8] == 9) begin

value[11:8] <= 0;

if (value[15:12] == 9) value[15:12] <= 0;

else value[15:12] <= value[15:12] + 1;

end else value[11:8] <= value[11:8] + 1;

end else value[7:4] <= value[7:4] + 1;

end else value <= value + 1;

end

end

endmodule

Pulsadores, Interruptores y leds

module (btn, swt, led);

input [0:3] btn;

input [0:7] swt;

output [0:7] led;

assign led[0:3] = btn;

assign led[4:7] = swt[0:3];

endmodule

Trabajo Previo (1)

Diseño de un módulo para visualizar una cuenta en el display ◦ Completar diseño del módulo display.

◦ Usar display para mostrar tiempo MM.SS.

◦ Hacer simulación funcional y temporal.

◦ Ayuda: Use un contador bcd para segundos y otro contador bcd para minutos Señal de reset para segundos : cuentaSeg == ‘h60

Señal de reloj para minutos: cuentaSeg == ‘h60

Trabajo Previo (2)

Módulo para uso de leds, interruptores y pulsadores. ◦ Leds reflejan el estado del interruptor.

◦ Pulsador 0: enciende todos los leds.

◦ Pulsador 1: apaga todos los leds.

◦ Pulsador 2: invierte estado de los leds.

◦ Pulsador 3: rotación hacia la derecha según cantidad de interruptores activos, ej. swt = 0x15 0xA2

◦ Ayuda: construya un multiplexor, de 5 entradas (de 8 bit) a una salida (de 8

bit)

para una rotación de X bit hacia la derecha de un bus Y, puede usar: {Y,Y} >> X

Trabajo Previo (2)

Diseño de un módulo que permita: ◦ Visualizar scan codes de teclado en display 7

segmentos, dígitos menos significativos.

◦ Visualizar la interpretación de la tecla en los dígitos más significativos.

◦ Ejemplo tecla 1muestra 0116 en el display.

◦ Ayuda: reg [7:0] k;

kbd kbd0(rst, clk, kd, kc, kbs, value);

display dsp0(clk1Khz, {k, value}, ssg, dctl);

always @ (negedge kbs)

case(value)

‘h16: k <= ‘h01;

….

En el Laboratorio

Revisión actividades previas.

Sintetizar y demostrar el funcionamiento del módulo reloj en formato MM.SS.

Sintetizar el módulo para uso de pulsadores, interruptores y leds.

Demostrar el funcionamiento del módulo que despliega scan codes del teclado PS/2.

Diseño de calculadora básica de notación postfija

◦ Uso de pulsadores, interruptores y leds

Calculadora Básica (1)

Ingreso de Números

op1: Número bcd

0,1,2 …. a, .., f

kbs’ && tecla es enter

op2: Número bcdº

(Si tecla es hexadecimal)

aux: Número bcd kbs’

kbs’ && tecla es enter

reg [15:0] op1, op2, aux;

always@(posedge rst or negedge kbs) begin

if (rst == 1) begin

...

end else begin

case (value)

...

8'h2e: if (clr) aux <= 0; // C ó CE

else aux <= {aux[11:0], 4'h5};

...

Calculadora Básica (2)

Operaciones

op1: Número bcd kbs’ && tecla es +, -, *

aux: Número bcd kbs’ && tecla es +, -, *

Op1 op op2

(tecla (op) es: +, -, *)