http://store.digilentinc.com/nexys-3-sp ... exys4-ddr/
Pero en plan barato. El dispositivo que enlazo tiene:
- 8 switches
- 5 pulsadores
- Display de 4 dígitos y 7 segmentos
- 8 leds
- 8 switches
- 4 pulsadores
- Display de 4 dígitos y 7 segmentos
- 6 leds
Para eso hay libros y bastantes recursos por internet. No creo que uno más aporte mucho.Hark0 escribió:Un curso de VHDL o Verilog estaría de perlas...
Si, claro. Tiene otro protocolo, son muy baratos, y más versátiles, si me apuras, que un display de 4 dígitos, pero también es un poquito más complejo de usar. Que Antonio decidaHark0 escribió:¿Y uno de éstos 16x2? ¿es posible?
Código: Seleccionar todo
module zxuno_leds_switches_and_display (
// Control
input wire clk, // reloj
input wire clke, // habilitación del reloj
input wire rst, //señal de reset externo del módulo
// Digitos que queremos mostrar en el display. El bit 4 vale 1 si queremos
// mostrar un puntito a la derecha del dígito. Los bits 3 a 0 definen un
// digito hexadecimal (0 - F)
input wire [4:0] d3,
input wire [4:0] d2,
input wire [4:0] d1,
input wire [4:0] d0,
// La matriz de pulsadores y switches
input wire [7:0] col,
output reg [1:0] row, // bit 0: selecciona pulsadores. bit 1: switches
// Valor de 8 bits a mostrar en los LEDs
input wire [7:0] v,
// Salidas al display (supongo display de anodo comun)
output reg [7:0] segm, // 7 segmentos + DP de los displays. Segmento A es el bit 6.
output reg [3:0] an, // anodos de los displays. Bit 0 corresponde al de más a la derecha
// Salidas a los 8 LEDs
output reg [7:0] leds,
// Valor actual de los pulsadores y switches
output reg [7:0] sw,
output reg [7:0] puls
);
reg [4:0] dig; // digito actual que estamos mostrando en el display
initial begin
an = 4'b1110;
leds = 8'b00000000;
sw = 8'b00000000;
puls = 8'b00000000;
row = 2'b10;
dig = 5'b00000;
end
always @(posedge clk) begin
if (rst == 1'b1) begin // valores iniciales tras un reset
an <= 4'b1110;
leds <= 8'b00000000;
sw <= 8'b00000000;
puls <= 8'b00000000;
row <= 2'b10;
dig <= 5'b00000;
end
else begin
if (clke == 1'b1) begin
// ------- Proceso secuencial -----------
// Leer pulsadores o switches
if (row == 2'b10) begin // si estamos seleccionando pulsadores...
puls <= col; // en el proximo flanco, guardalos
row <= 2'b01; // y pasa a leer switches
end
else begin // en otro caso
sw <= col; // guarda swiches
row <= 2'b10; // y pasa a leer pulsadores
end
// Actualizar LEDs (esta es trivial)
leds <= v;
// Multiplexar digitos dentro del display
an <= {an[2:0], an[3]}; // rotar an 1 bit a la izquierda
case (an) // segun el valor actual de an, se escoge el PROXIMO valor del digito a mostrar
4'b1110: dig <= d1; // se está mostrando el digito d0, por lo que cogemos el d1.
4'b1101: dig <= d2; // se está mostrando el digito d1, por lo que cogemos el d2.
4'b1011: dig <= d3; // se está mostrando el digito d2, por lo que cogemos el d3.
4'b0111: dig <= d0; // se está mostrando el digito d3, por lo que cogemos el d0.
endcase
end
end
end
reg [6:0] seg;
always @* begin // proceso combinacional para determinar qué dígito se muestra
case (dig[3:0]) // conversión a 7 segmentos
4'h0: seg = 6'b1111110;
4'h1: seg = 6'b0110000;
4'h2: seg = 6'b1101101;
4'h3: seg = 6'b1111001;
4'h4: seg = 6'b0110011;
4'h5: seg = 6'b1011011;
4'h6: seg = 6'b1011111;
4'h7: seg = 6'b1110000;
4'h8: seg = 6'b1111111;
4'h9: seg = 6'b1111011;
4'hA: seg = 6'b1110111;
4'hB: seg = 6'b0011111;
4'hC: seg = 6'b1001110;
4'hD: seg = 6'b0111101;
4'hE: seg = 6'b1001111;
4'hF: seg = 6'b1000111;
default: seg = 6'b0000000;
endcase
segm = ~{dig[4], seg}; // concatenamos el punto decimal y el valor de 7 seg y lo negamos todo.
end
endmodule