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
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;
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
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
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.
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