Truncar y otras operaciones en la constante en Verilog

1

Ejemplo muy simple con el que estoy atascado. Quiero que el diseño escrito en Verilog devuelva un año definido en la fuente como formato de 16 bits al mundo exterior con dos bytes.

'define MY_YEAR 16'd2017

entonces necesito dividir de alguna manera esta constante en dos bytes para realizar algo como esto

wire [7:0] w_year_byte = w_current_byte ? ('MY_YEAR >> 8) : ('MY_YEAR & 8'hff);

Para mí, las expresiones anteriores con MY_YEAR no son correctas, ya que su resultado es de 16 bits. Y esta declaración no se compila en absoluto ...

Sé cómo hacerlo con vectores, pero nunca lo he hecho antes para las constantes; Vio varias respuestas para preguntas similares en Internet, pero aún no está claro cómo hacer las cosas correctamente . Puede parecer que mi enfoque es totalmente incorrecto, me alegraría enormemente educarme.

Actualización: mi fuente de Verilog es relativamente grande, y la idea principal era tener este año la definición al principio del archivo de origen, en la primera línea, porque se cambiará con frecuencia y No necesitaría bajar para encontrar el valor para cambiar.

Revisando la respuesta de Tom Carpenter, me di cuenta de que estaba cometiendo un error estúpido al declarar un parámetro, un parámetro local o un cable fuera del módulo (en la parte superior de la fuente, antes de la declaración del módulo), así que sigo su sugerencia de tener

'define MY_YEAR 16'd2017

en la primera línea de la fuente, y luego en algún lugar después de que haya una declaración del módulo

wire [15:0] c_MY_YEAR = 'MY_YEAR;

y luego use c_MY_YEAR[7:0] y c_MY_YEAR[15:8] como de costumbre. Gracias Tom!

    
pregunta Anonymous

1 respuesta

1

Es mejor utilizar localparam en lugar de 'define .

Por ejemplo:

module blah (

);

localparam MY_YEAR = 16'd2017; //This is a local parameter which cannot be seen or changed outside the module

wire [7:0] w_year_byte = w_current_byte ? MY_YEAR[15:8] : MY_YEAR[7:0];

...

endmodule

Recuerde que con Verilog no está trabajando con programas informáticos, no está haciendo las cosas de manera procesal, sino que describe hardware. Si desea acceder a los MSB o los LSB, puede simplemente describirlo: acceda a ellos directamente con el operador de selección de rango ( [MSB:LSB] ) o el operador de selección de parte ( [LSB+:WIDTH] ).

Los parámetros locales tienen la ventaja sobre ', ya que pueden tratarse como cables constantes; puede acceder a su valor de la misma manera que lo haría al valor de un cable.

Además, podría cambiar fácilmente su localparam a un parameter , lo que le permitiría cambiar el valor del parámetro cuando cree una instancia del módulo. Este es uno de los componentes básicos de los módulos parametrizados reutilizables. Si su objetivo es tener los parámetros en la parte superior del archivo, esto se puede lograr con las declaraciones del módulo de estilo ANSI de Verilog 2001:

module blah #(
    parameter MY_YEAR = 16'd2017
)(
    input whatever,
    output bob,
    input cheese
);
...

Si tienes tu corazón configurado en una 'definición, puedes acceder a él convirtiéndolo en un cable. Por ejemplo:

wire [15:0] my_year_wire = 'MY_YEAR;

Una vez asignado a un cable, puede acceder a él de la misma manera que la versión del parámetro anterior:

wire [7:0] w_year_byte = w_current_byte ? my_year_wire[15:8] : my_year_wire[7:0];
    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas