Página 1 de 3
Addon para aprender VHDL o Verilog
Publicado: 27 Jul 2016, 18:12
por antoniovillena
La idea es tener lo mismo que una entrenadora comercial:
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
Como tenemos 30 líneas disponibles en el puerto de expansión, y el display se lleva 12 líneas, el addon tendría una pequeña reducción:
- 8 switches
- 4 pulsadores
- Display de 4 dígitos y 7 segmentos
- 6 leds
¿Qué os parece la idea? ¿Me pongo a diseñar?
Re: Addon para aprender VHDL o Verilog
Publicado: 27 Jul 2016, 18:27
por Hark0
Un curso de VHDL o Verilog estaría de perlas...
Re: Addon para aprender VHDL o Verilog
Publicado: 27 Jul 2016, 18:32
por antoniovillena
Hark0 escribió:Un curso de VHDL o Verilog estaría de perlas...
Para eso hay libros y bastantes recursos por internet. No creo que uno más aporte mucho.
Re: Addon para aprender VHDL o Verilog
Publicado: 27 Jul 2016, 18:36
por antoniovillena
También se puede aprender sin este addon. O incluso que alguien se curre un módulo que muestre los segmentos y los leds en video compuesto o VGA, y meter las entradas por teclado o joystick.
Re: Addon para aprender VHDL o Verilog
Publicado: 27 Jul 2016, 18:46
por Hark0
hmmm interesante...
Re: Addon para aprender VHDL o Verilog
Publicado: 28 Jul 2016, 08:47
por mcleod_ideafix
No sólamente para aprender HDL, sino también sirve para depuración y testeo de cores. Yo sugiero, si es posible, sacrificar dos pulsadores o dos interruptores (o uno y uno) para poder tener 8 LEDs. Poder ver de un vistazo el contenido de un registro o lo que sea, que son de 8 bits, de forma rápida y gastando poco código, es muy conveniente.
O llegar a tener 8 pulsadores y 8 interruptores usando una matriz de 8x2, que serían 10 pines en lugar de 16.
- Display de 4 dígitos, 7 segmentos: 4 ánodos + 8 cátodos = 12 pines
- 8 LEDs: 8 pines
- Matriz de 8x2 para pulsadores e interruptores: 10 pines
Total: 30 pines
Re: Addon para aprender VHDL o Verilog
Publicado: 28 Jul 2016, 09:26
por Hark0
¿Y uno de éstos 16x2? ¿es posible?
Re: Addon para aprender VHDL o Verilog
Publicado: 28 Jul 2016, 10:10
por mcleod_ideafix
Hark0 escribió:¿Y uno de éstos 16x2? ¿es posible?
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 decida
EDITO: alto ahí. que la cosa no es tán sencilla: estos módulos van a 5V, por lo que habría que intercalar convertidores de nivel, al menos en las líneas del bus de datos, que son bidireccionales, encareciendo el asunto. Si los hay de 3.3V sí que merece la pena
EDITO 2: Ah, pues mira: los hay
https://www.sparkfun.com/products/9053
Re: Addon para aprender VHDL o Verilog
Publicado: 28 Jul 2016, 10:14
por mcleod_ideafix
Aqui os dejo un ejemplo de módulo que sería capaz de "hablar" con este addon, leyendo pulsadores y switches (usando el método de la matriz que expuse antes para ahorrar pines) y enviando 4 dígitos al display.
Para el display, asumo en el módulo una configuración tal como ésta (ánodo común, transistor PNP inversor como driver)
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
Re: Addon para aprender VHDL o Verilog
Publicado: 28 Jul 2016, 10:47
por Hark0
Gracias por el link... ciertamente los que tengo van a 5V.