Error al pasar un cable de diferente tamaño a la entrada del módulo

3

Tengo un módulo para mostrar un número base 10 en mi pantalla de 7 segmentos.

module displayN(input [13:0] n, input clk, input [3:0] an, input [6:0] seg);

    wire [3:0] d1 = n % 10;
    wire [3:0] d2 = (n / 10) % 10;
    wire [3:0] d3 = (n / 100) % 10;
    wire [3:0] d4 = (n / 1000) % 10;

    display4(d4, d3, d2, d1, clk, an, seg);

endmodule

Toma un número de 14 bits y calcula los dígitos y lo entrega a otro módulo que realmente lo muestra.

Ahora mismo estoy trabajando en un programa que usa una conexión USB-UART y muestra el valor del último byte enviado en mi 7-Seg. Aquí está mi módulo de nivel superior.

module uart_top(input clk,
                input rx,
                output tx,
                output [3:0] an,
                output [6:0] seg);

    wire [63:0] count;
    wire [7:0] out;

    uart_receive r(clk, rx, count, out);

    reg [7:0] oreg;
    always @(out) oreg = out;
    displayN d4(oreg, clk, an, seg);

    ila_0 i(clk, rx, out);
endmodule

Este código está trabajando actualmente. Cuando la salida de mi receptor uart cambia, copio la salida a un registro y luego la envío a mi módulo de pantalla. Esto parece funcionar correctamente cuando lo intento en mi tarjeta. Supongo que, aunque el módulo espera 14 bits, solo llena 0 para los 14 superiores. Sin embargo, cuando trato de "salir" directamente al módulo como displayN d4(oreg, clk, an, seg); , obtengo algún error acerca de una caja negra. ¿Por qué puedo hacer esto para un registro pero no un cable?

Aquí está el mensaje de error exacto que recibí durante la síntesis.

 [Project 1-486] Could not resolve non-primitive black box cell 'displayN' instantiated as 'd4' [/home/chase/vivado-workspace/UART/UART.srcs/sources_1/new/uart_top.v:37]

Aquí está el esquema.

También aquí está el uart_receive.

module uart_receive#(parameter BAUD_RATE = 9600,
                     parameter CLOCK_SPEED_MHZ = 100)
                    (input clk,
                     input rx,
                     output reg [63:0] read_count = 0,
                     output reg [7:0] data);

    localparam SAMPLE_BAUD_RATE = BAUD_RATE * 8;

    reg reading = 0;
    reg [8:0] bit_stream = 0;
    reg [3:0] bit_index = 0;

    wire sample_tick;
    baud_gen#(SAMPLE_BAUD_RATE, CLOCK_SPEED_MHZ) s(clk,, sample_tick);

    wire baud_tick;
    baud_gen#(BAUD_RATE, CLOCK_SPEED_MHZ) b(clk, !reading, baud_tick);


    always @(posedge clk) begin
        if(sample_tick && !reading && !rx) begin
            reading <= 1;
            bit_index <= 0;
        end
        else if(baud_tick) begin
            bit_index <= bit_index + 1;
            bit_stream[bit_index] <= rx;

            if(bit_index == 8) begin
                reading <= 0;
                read_count <= read_count + 1;
                data <= bit_stream[7:0];
            end
        end
    end
endmodule

Parece que funciona si elimino el ila_0 i(clk, rx, out); que es el analizador lógico integrado que estaba usando para la depuración. Siempre me enganché directamente, incluso cuando estaba usando el registro en displayN. Me pregunto por qué no se podría conectar a ambos a la vez.

    
pregunta chasep255

1 respuesta

2

¿Has visto lo que se está sintetizando? Está realizando algunas operaciones matemáticas (módulo) en la salida. Dentro de su módulo UART RX, el byte recibido probablemente se encuentre en un búfer de algún tipo. Si no tiene un elemento de almacenamiento / declarado de algún tipo, le está pidiendo a su código FPGA que opere de manera combinatoria en sus datos de recepción y complete todas las operaciones antes de que ingrese el siguiente byte. El uso de 'out' pasa los 8 bits de datos en bruto a su módulo de pantalla y probablemente infiere algunos pestillos.

Al registrar sus datos (observo que utilizó la palabra "copiar". ¿Supongo que es un programador informático que se ramifica en FPGA?), está aumentando ligeramente la latencia pero ahora ha almacenado los datos de manera continua y está disponible un sistema sincronizado y sincronizado durante el cual se pueden hacer las cosas.

    
respondido por el Krunal Desai

Lea otras preguntas en las etiquetas