Verilog mux usando un reloj

0

Estoy intentando que funcione una lógica simple:

en el borde positivo del reloj, la salida siempre debe ser 1, en el borde negativo, la salida debe ser el valor de una entrada proporcionada.

He intentado media docena de formas de hacer esto, todas las cuales resultan en un error, ya sea en la etapa de síntesis o mapeo (errores relacionados con salidas con múltiples controladores, o relojes que se usan en pines que no son de reloj).

Supongo que esta debe ser una tarea muy fácil de realizar si sabes el truco.

Estoy usando ISE 13 y desarrollando para un Xilinx Spartan 6. actualización:

Place:1136 - This design contains a global buffer instance, <XLXI_3>, driving the net, <XLXN_45>, that is driving the following (first 30) non-clock load pins.
< PIN: XLXI_19/XLXI_3/XLXI_205/start_memory1.A5; >
This is not a recommended design practice in Spartan-6 due to limitations in the global routing that may cause excessive delay, skew or unroutable situations.      It is recommended to only use a BUFG resource to drive clock loads. If you wish to override this recommendation, you may use the CLOCK_DEDICATED_ROUTE constraint (given below) in the .ucf file to demote this message to a WARNING and allow your design to continue.
< PIN "XLXI_3.O" CLOCK_DEDICATED_ROUTE = FALSE; >
    
pregunta Zack Newsham

1 respuesta

1

Aunque no se recomienda estrictamente, la forma más sencilla de lograrlo es la siguiente:

wire out;
reg outReg;
always @ (negedge clock) begin
    outReg <= in;
end
assign out = outReg | clock;

Esto aseguraría que cuando el reloj se pone alto, la salida será de 1. Una vez que el reloj se agota, los datos se registran en el registro y aparecen activados (lo que ya no está siendo alto). El problema con este tipo de método es que hace que la señal del reloj tenga que salir de la red global de reloj para pasar a través de la compuerta OR, lo que puede llevar a problemas de tiempo debido a un sesgo excesivo, si estamos hablando de relojes lentos como el 10 Sin embargo, 50MHz probablemente no será un problema.

EDITAR:

Ahora recuerdo haber encontrado el error que esto causa en el pasado. Hay una solución alternativa para compilar esto (colocar el error en una advertencia), que se describe en Xilinx AR # 33025 . Básicamente, debe agregar la restricción del mensaje de error PIN "XLXI_3.O" CLOCK_DEDICATED_ROUTE = FALSE; a su archivo UCF y luego, también, asignar el reloj global a uno de los grupos superiores de BUFG (búferes de reloj) para permitir que la señal pueda ingresar a datos no globales. - enrutamiento de reloj también. La segunda parte se realiza con otra restricción en el archivo UCF: INST "name_of_bufg_instance" LOC = BUFGMUX_X*Y* donde BUFGMUX_X Y es uno de los BUFG del grupo superior: los detalles sobre cómo encontrar nombres válidos se pueden encontrar en el enlace de arriba.

Otra alternativa sería usar un bloque DCM para generar una señal de reloj 2x. Este reloj se usaría para controlar el registro: en un ciclo del reloj rápido que conduciría a 1, en el otro conduciría a su señal de entrada. Concedido, tendría que sincronizar los dos relojes para asegurarse de que el 1 aparezca en el flanco ascendente del reloj 1x, pero eso puede hacerse.

Sin embargo, mi sugerencia sería considerar por qué tu lógica requiere que hagas esto y ver si hay una forma alternativa de diseñar la lógica posterior. Hablando de la experiencia de hacer algunos sistemas bastante complejos con FPGA, encuentro que si llegas a una situación en la que se deben crear señales oscuras con periodos de medio reloj, las cosas tienden a ensuciarse rápidamente y el diseño se desmorona.

    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas