web-dev-qa-db-fra.com

Attribuer une valeur initiale synthétisable à un reg dans Verilog

Je suis un noob FPGA essayant d'apprendre Verilog. Comment puis-je "assigner" une valeur à un reg dans un bloc toujours, soit comme valeur initiale, soit comme constante. J'essaie de faire quelque chose comme ça dans le code ci-dessous. J'obtiens une erreur car la constante 8 bits ne compte pas comme entrée. Je ne veux pas non plus déclencher l'arrêt permanent d'une horloge. Je veux juste assigner un registre à une valeur spécifique. Comme je veux qu'il soit synthétisable, je ne peux pas utiliser un bloc initial. Merci beaucoup.

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
17
Frank Dejay

Vous pouvez combiner la déclaration de registre avec l'initialisation.

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

Ou vous pouvez utiliser un bloc initial

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

Les autres réponses sont toutes bonnes. Pour les conceptions FPGA Xilinx, il est préférable de ne pas utiliser des lignes de réinitialisation globale et d'utiliser des blocs initial pour les conditions de réinitialisation de la plupart des logiques. Voici le livre blanc de Ken Chapman (gourou Xilinx FPGA)

http://japan.xilinx.com/support/documentation/white_papers/wp272.pdf

6
Mark Lakata

Le toujours @ * ne se déclencherait jamais car aucun argument de droite ne change. Pourquoi ne pas utiliser un fil avec 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 vous voulez réellement un flop où vous pouvez changer la valeur, la valeur par défaut serait dans la clause reset.

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

J'espère que cela t'aides

4
Morgan

Vous devez utiliser ce que votre documentation FPGA recommande. Il n'existe aucun moyen portable d'initialiser les valeurs de registre autre que l'utilisation d'un réseau de réinitialisation. Cela a un coût matériel qui lui est associé sur la plupart des cibles de synthèse.

4
user597225

Lorsqu'une puce est alimentée, tous ses registres contiennent des valeurs aléatoires. Il n'est pas possible d'avoir une valeur initiale. Ce sera toujours aléatoire.

C'est pourquoi nous avons réinitialisé les signaux, pour réinitialiser les registres à une valeur connue. La réinitialisation est contrôlée par quelque chose hors puce, et nous écrivons notre code pour l'utiliser.

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
3
Paul S