Addon para aprender VHDL o Verilog

Todo aquello que acompaña a la placa del ZX-Uno (carcasas, alimentadores, pegatinas para el teclado, etc) / Everything that goes with the ZX-Uno board (cases, AC adapters, stickers for keyboard, etc)
Avatar de Usuario
antoniovillena
Mensajes: 2621
Registrado: 27 Sep 2015, 20:41

Addon para aprender VHDL o Verilog

Mensaje por antoniovillena » 27 Jul 2016, 18:12

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?

Avatar de Usuario
Hark0
Mensajes: 683
Registrado: 27 Sep 2015, 00:31
Ubicación: Cornellà de Llobregat - BCN
Contactar:

Re: Addon para aprender VHDL o Verilog

Mensaje por Hark0 » 27 Jul 2016, 18:27

Un curso de VHDL o Verilog estaría de perlas... ;)
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

Avatar de Usuario
antoniovillena
Mensajes: 2621
Registrado: 27 Sep 2015, 20:41

Re: Addon para aprender VHDL o Verilog

Mensaje por antoniovillena » 27 Jul 2016, 18:32

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.

Avatar de Usuario
antoniovillena
Mensajes: 2621
Registrado: 27 Sep 2015, 20:41

Re: Addon para aprender VHDL o Verilog

Mensaje por antoniovillena » 27 Jul 2016, 18:36

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.

Avatar de Usuario
Hark0
Mensajes: 683
Registrado: 27 Sep 2015, 00:31
Ubicación: Cornellà de Llobregat - BCN
Contactar:

Re: Addon para aprender VHDL o Verilog

Mensaje por Hark0 » 27 Jul 2016, 18:46

hmmm interesante... ;)
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

Avatar de Usuario
mcleod_ideafix
Mensajes: 831
Registrado: 27 Sep 2015, 00:14
Ubicación: Jerez de la Frontera
Contactar:

Re: Addon para aprender VHDL o Verilog

Mensaje por mcleod_ideafix » 28 Jul 2016, 08:47

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 :)
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Avatar de Usuario
Hark0
Mensajes: 683
Registrado: 27 Sep 2015, 00:31
Ubicación: Cornellà de Llobregat - BCN
Contactar:

Re: Addon para aprender VHDL o Verilog

Mensaje por Hark0 » 28 Jul 2016, 09:26

¿Y uno de éstos 16x2? ¿es posible?

Imagen

:P
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

Avatar de Usuario
mcleod_ideafix
Mensajes: 831
Registrado: 27 Sep 2015, 00:14
Ubicación: Jerez de la Frontera
Contactar:

Re: Addon para aprender VHDL o Verilog

Mensaje por mcleod_ideafix » 28 Jul 2016, 10:10

Hark0 escribió:¿Y uno de éstos 16x2? ¿es posible?

Imagen

:P
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
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Avatar de Usuario
mcleod_ideafix
Mensajes: 831
Registrado: 27 Sep 2015, 00:14
Ubicación: Jerez de la Frontera
Contactar:

Re: Addon para aprender VHDL o Verilog

Mensaje por mcleod_ideafix » 28 Jul 2016, 10:14

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)
7seg_disp.png

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
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Avatar de Usuario
Hark0
Mensajes: 683
Registrado: 27 Sep 2015, 00:31
Ubicación: Cornellà de Llobregat - BCN
Contactar:

Re: Addon para aprender VHDL o Verilog

Mensaje por Hark0 » 28 Jul 2016, 10:47

Gracias por el link... ciertamente los que tengo van a 5V.
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

Responder