Uso De Display Y PS2
Enviado por hreinking • 21 de Mayo de 2013 • 4.510 Palabras (19 Páginas) • 474 Visitas
Laboratorio 2
“Uso de Display e Interfaz PS/2”
IPD432 Sistemas Digitales Avanzados
Diego Hinojosa C. 2821019-1
Heinrich Reinking E. 2821070-1
Diseño de Módulos
Modulo Principal:
module Main(
input clk, kd, kc, //reloj 50 Mhz, ingreso de dato y reloj del teclado
input [7:0] sw, //switch's
input pul0, pul2, pul3, //pulsadores
output [7:0] Led, //Led's
output [3:0] dctl, //control de display
output [7:0] ssg //control de segmentos
);
wire [7:0] value; //valor ASCii de la tecla
wire kbs; //señal de palabra leida de tecla
wire clkd,clk0,clk1,clk2,clk3,clkf; //señales de reloj
wire [15:0] k, x, m, cont; //k=valor numerico de tecla; x y m= valores a asignar; //cont = cuenta parcial
wire [15:0] num_final; //numera que será desplegado por display
wire rst;
assign bx = pul3; //asocia el 4° pulsador a bx
assign bm = pul2; //asocia el 3° pulsador a bm
assign rst = pul0; //asocia el 1° pulsador a reset
assign clkf = (sw[7]==1)? 0 : //Aplicación de lógica de ALU para realizar
({sw[6],sw[5]}==0)? clk0 : //cambio de velocidades de conteo; la primera
({sw[6],sw[5]}==1)? clk1 : //velocidad es un hz, la segunda 2, la tercera
({sw[6],sw[5]}==2)? clk2 : //5 y la cuarta 10 hz
clk3;
assign Led[0] = pul0; //asociación del 1° led al primer pulsador
assign Led[1] = pul2; //asociación del 2° led al primer pulsador
assign Led[2] = pul3; //asociación del 3° led al primer pulsador
assign Led[7] = clkf; //asociación del 8° led al primer pulsador
clkdspl clk1Khz (clk, clkd); //reloj para el display (1Khz)
clkv0 clk1hz (clk, clk0); //reloj 1, corre a 1 hz
clkv1 clk2hz (clk, clk1); //reloj 2, corre a 2 hz
clkv2 clk5hz (clk, clk2); //reloj 3, corre a 5 hz
clkv3 clk10z (clk, clk3); //reloj 4, corre a 10 hz
kbd driver (rst, clk, kd, kc, kbs, value); //controlador de teclado
procesador brain (kbs, rst, sw[0], sw[1], sw[2], value, k); //procesa el valor ASCii al valor //numerico
counter count (clkf, rst, bx, bm, sw[4], sw[3], k, cont, x, m); //contador de x a x+m
dspl_man ctrl_dspl (clk, sw[0], sw[1], sw[2], k, cont, x, m, //Módulo de control de
Led[3], Led[4], Led[5], Led[6], num_final); //display, controla
//lo que se mostrará por el //display
display dspl (clkd, num_final, ssg, dctl); //controlador de display con conversor
//hexadecimal a BCD 7 segmentos
Endmodule
Módulo clkdspl:
module clkdspl( input clk, output reg clk1Khz );
reg [15:0] count;
always@(posedge clk)begin //De acuerdo a la velocidad del reloj
count <= count + 1; //(50 Mhz), es necesario que cuente 25000
if(count == 25000)begin //cantos de subida para generar un reloj
clk1Khz <= clk1Khz + 1; //de 1 Khz
count <= 0;
end
end
endmodule
Módulo clk1hz:
module clkv0( input clk, output reg clk0 );
reg [24:0] count;
always@(posedge clk)begin
count <= count +1; //De acuerdo a la velocidad del reloj
if(count == 25000000)begin //(50 Mhz), es necesario que cuente clk0 <= clk0 +1; //25000000 cantos de subida para count <= 0; //generar un de 1 hz reloj
end
end
endmodule
Módulo clk2hz:
module clkv1( input clk, output reg clk1 );
reg [23:0] count;
always@(posedge clk)begin
count <= count +1; //De acuerdo a la velocidad del reloj
if(count == 12500000)begin //(50 Mhz), es necesario que cuente clk1 <= clk1 +1; //12500000 cantos de subida para count <= 0; // generar un de 2 hz reloj
end
end
endmodule
Módulo clk5hz:
module clkv2( input clk, output reg clk2 );
reg [22:0] count;
always@(posedge clk)begin
count <= count +1; //De acuerdo a la velocidad del reloj
if(count == 5000000)begin //(50 Mhz), es necesario que cuente clk2 <= clk2 +1; //5000000 cantos de subida para count <= 0; // generar un de 5 hz reloj
end
end
endmodule
Módulo clk10hz:
module clkv3( input clk, output reg clk3 );
reg [21:0] count;
always@(posedge clk)begin
count <= count +1; //De acuerdo a la velocidad del reloj
if(count == 2500000)begin //(50 Mhz), es necesario que cuente clk3 <= clk3 +1; //2500000 cantos de subida para count <= 0; // generar un de 10 hz reloj
end
end
endmodule
Módulo driver teclado:
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
reg kdi, kci;
reg dff1, dff2; //
reg [10:0] ShiftRegSig1; // Signal
reg [10:1] ShiftRegSig2; // Declaration
reg kbs_tmp; //
// 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
// --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]
...