2012-04-04 132 views
9

Soy un novato de FPGA que intenta aprender Verilog. ¿Cómo puedo "asignar" un valor a un registro en un bloque siempre, ya sea como un valor inicial, o como una constante. Intento hacer algo como esto en el siguiente código. Me sale un error porque la constante de 8 bits no cuenta como entrada. Tampoco quiero activar siempre el reloj. Solo quiero asignar un registro a un valor específico. Como quiero que sea sintetizable, no puedo usar un bloque inicial. Muchas gracias.Asignar un valor inicial sintetizable a un registro en Verilog

module top 
(
    input wire clk, 
    output wire [7:0] led 
); 


reg [7:0] data_reg ; 
always @* 
begin 
    data_reg = 8'b10101011; 
end 

assign led = data_reg; 

endmodule 

Respuesta

15

Puede combinar la declaración de registro con la inicialización.

reg [7:0] data_reg = 8'b10101011; 

O puede utilizar un bloque de initial

reg [7:0] data_reg; 
initial data_reg = 8'b10101011; 
+0

Me funciona con Xilinx XST. –

+0

@Tim También funciona en Quartus sintetizando para Altera's Cyclone II. –

+0

@NathanFarrington es posible inicializar el registro con una variable (digamos un parámetro de entrada del módulo). Intenté hacerlo directamente como se indicó anteriormente, pero no funciona .. – ishan3243

4

El siempre @ * nunca se disparará ya que no cambian los argumentos de la mano derecha. ¿Por qué no usar un cable con assign?

module top (
    input wire clk, 
    output wire [7:0] led 
); 

wire [7:0] data_reg ; 
assign data_reg = 8'b10101011; 
assign led  = data_reg; 

endmodule 

Si realmente desea un flop donde puede cambiar el valor, el valor predeterminado sería en la cláusula de reinicio.

module top 
(
    input  clk, 
    input  rst_n, 
    input [7:0] data, 
    output [7:0] led 
); 

reg [7:0] data_reg ; 
always @(posedge clk or negedge rst_n) begin 
    if (!rst_n) 
    data_reg <= 8'b10101011; 
    else 
    data_reg <= data ; 
end 

assign led = data_reg; 

endmodule 

Esperanza esto ayuda

3

Cuando se pone un chip de potencia todos Es registros contienen valores aleatorios. No es posible tener un valor inicial. Siempre será aleatorio.

Es por eso que tenemos señales de reinicio, para restablecer los registros a un valor conocido. El reinicio está controlado por algo fuera de chip, y escribimos nuestro código para usarlo.

always @(posedge clk) begin 
    if (reset == 1) begin // For an active high reset 
     data_reg = 8'b10101011; 
    end else begin 
     data_reg = next_data_reg; 
    end 
end 
+5

Lo que usted dice es cierto para los ASIC en general, pero no para FPGAs específicamente. Cuando descarga el archivo de bits, todas las celdas de memoria se inicializan. Los reinicios a menudo no son necesarios o no son útiles para diseños basados ​​en FPGA, y conducen a un área más grande y posiblemente menor Fmax. El mejor reinicio es descargar el archivo de bits nuevamente. –

+0

@NathanFarrington Gracias. Tengo un problema similar que trato de entender. Tengo un registro de estado para un FSM que no parece inicializarse a menos que lo asigne para conducir un cable de salida. Abrí otra publicación [enlace] (http://stackoverflow.com/questions/10033459/verilog-fpga-use-of-an-unitialized-register). El comportamiento parece estar relacionado con lo que estamos discutiendo aquí. Quizás podrías echarle un vistazo y decirme lo que piensas. Es un código Verilog dirigido a Xilinx FPGA. Gracias –

5

Debe utilizar lo recomienda la documentación de FPGA. No hay una forma portátil de inicializar valores de registro que no sea el uso de una red de reinicio. Esto tiene un costo de hardware asociado en la mayoría de los objetivos de síntesis.

Cuestiones relacionadas