Uso De Display Y PS2
hreinking21 de Mayo de 2013
4.510 Palabras (19 Páginas)495 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] <= {ShiftRegSig1[0], ShiftRegSig2[10:2]};
end
end
// --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
Módulo Procesador:
module procesador(
input kbs,rst,sw0,sw1,sw2,
input [7:0] value,
output reg [15:0] k
);
initial k <= 0;
wire kbst;
assign kbst = ({sw2,sw1,sw0}==1)? kbs : 0; //solo si los switch's estan para display, k //adquirirá valor
always@(negedge kbst or posedge rst) begin
if(rst==1) k<=0;
else begin
case(value)
8'h45: k <= {k[11:0],4'h0}; //Asocia el valor de la tecla en formato
8'h16: k <= {k[11:0],4'h1}; //ASCii a hexadecimal
8'h1e: k <= {k[11:0],4'h2};
8'h26: k <= {k[11:0],4'h3}; //Esta lógica permite ir haciendo un
8'h25: k <= {k[11:0],4'h4}; //desplazamiento automático luego del
8'h2e: k <= {k[11:0],4'h5}; //ingreso de una nueva tecla.
8'h36: k <= {k[11:0],4'h6};
8'h3d: k <= {k[11:0],4'h7};
8'h3e: k <= {k[11:0],4'h8};
8'h46: k <= {k[11:0],4'h9};
8'h1c: k <= {k[11:0],4'ha};
8'h32: k <= {k[11:0],4'hb};
8'h21: k <= {k[11:0],4'hc};
8'h23: k <= {k[11:0],4'hd};
8'h24: k <= {k[11:0],4'he};
8'h2b: k <= {k[11:0],4'hf};
8'h76: k<=0; //Si se presiona la tecla "Del", esta borrará
8'h66: k <= {4'h0,k[15:4]}; //el último digito ingresado, mientras que si default k<=k; //se presiona "ESC" borra todo el número.
endcase
end
end
endmodule
Módulo Contador:
module counter(
input clk, rst, bx, bm, sw4,sw3,
input [15:0] setvalue,
output reg [15:0] count, x, m
);
reg [15:0] aux1;
initial begin count <= 0; aux1 <= 0; x <= 0; m <= 0; end
...