Lucid (Verilog) intermitente generado señal de reloj

1

Estoy empezando en el mundo de los FPGA. Recogí un Mojo con un Spartan-6 de Xilinx y estoy intentando crear un reloj arbitrario para usar con un periférico ENVIADO. En este punto, no lo he hecho más allá de intentar generar un reloj de tick (eventualmente 1.2us) del reloj base (50MHz). Estoy usando el divisor de abajo para tomar el reloj de 50MHz como una entrada y actualmente lo estoy dividiendo por 500, lo que debería proporcionar una salida de 100kHz que estoy alimentando directamente a un pin conectado a mi analizador lógico.

Archivo: divider.v

module divider (
    input clk,  // clock
    input rst,  // reset
    output reg out
  );

    parameter DIVIDER = 500;

    reg [15:0] count = 0;

    always @(posedge clk) begin

        if (rst == 1) begin
            out <= 0;
            count <= 0;
        end
        else begin
            if (count == (DIVIDER - 1)) begin
                out <= 1;
                count <= 0;
            end else begin
        out <= 0;
                count <= count + 1'b1;
            end
        end
    end

endmodule

Archivo: mojo_top.luc

module mojo_top (
    input clk,              // 50MHz clock
    input rst_n,            // reset button (active low)
    output led [8],         // 8 user controllable LEDs
    input cclk,             // configuration clock, AVR ready when high
    output spi_miso,        // AVR SPI MISO
    input spi_ss,           // AVR SPI Slave Select
    input spi_mosi,         // AVR SPI MOSI
    input spi_sck,          // AVR SPI Clock
    output spi_channel [4], // AVR general purpose pins (used by default to select ADC channel)
    input avr_tx,           // AVR TX (FPGA RX)
    output avr_rx,          // AVR RX (FPGA TX)
    input avr_rx_busy,      // AVR RX buffer full
    inout sent0
  ) {

  sig rst;                  // reset signal
  sig data[12];

  .clk(clk) {
    // The reset conditioner is used to synchronize the reset signal to the FPGA
    // clock. This ensures the entire FPGA comes out of reset at the same time.
    reset_conditioner reset_cond;
  }

  divider tick_clock(.clk(clk), .rst(rst));

  always {
    sent0.enable = 1;
    sent0.write = tick_clock.out;

    reset_cond.in = ~rst_n; // input raw inverted reset signal
    rst = reset_cond.out;   // conditioned reset

    led = 8h00;             // turn LEDs off
    spi_miso = bz;          // not using SPI
    spi_channel = bzzzz;    // not using flags
    avr_rx = bz;            // not using serial port
  }
}

Sin embargo, lo que estoy viendo es que, si bien la señal del reloj emite una forma de onda de 100 MHz como se esperaba, se interrumpe periódicamente. No he podido sacar ninguna conclusión sobre por qué sucede esto.

Estoy esperando una forma de onda de 100 kHz semi-limpia con el código suministrado.

He estado golpeando mi cabeza con fuerza contra esto por un tiempo, pero solo puedo asumir que es mi falta de experiencia Verilog lo que me afecta y no tiene nada que ver con el hardware que estoy intentando usar. Esto parece ser similar a los ejemplos existentes para los módulos maestros UART e I2C. Pero debe haber un pequeño detalle que falta.

¿Puede alguien ofrecer algún consejo sobre la producción de una señal de reloj limpia para impulsar un pin de salida?

    
pregunta julienj

1 respuesta

0

Su salida solo sube a 1 ciclo de cada 500.

Es probable que la pantalla gráfica no tenga la resolución para mostrar esto correctamente. Si hace zoom en una de las regiones que parece no tener transiciones, probablemente podrá ver los pulsos altos que faltan.

Si desea crear un reloj de salida con un ciclo de trabajo del 50%, debe configurar out <= ~out cuando se alcanza el recuento de terminales, y no cambiar out de lo contrario. Necesitará reducir a la mitad el valor del recuento del terminal para tener el mismo período.

    
respondido por el The Photon

Lea otras preguntas en las etiquetas