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.
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)
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.
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};
...