为Verilog中的reg分配一个可合成的初始值
我是一个试图学习Verilog的新手。如何将值作为初始值或常量“分配”给always块中的reg。我正试图在下面的代码中执行类似的操作。我得到一个错误,因为8位常量不算作输入。我也不想触发总是不停的时钟。我只想给一个特定的值分配一个寄存器。因为我希望它是可合成的,所以不能使用初始块。非常感谢为Verilog中的reg分配一个可合成的初始值,verilog,Verilog,我是一个试图学习Verilog的新手。如何将值作为初始值或常量“分配”给always块中的reg。我正试图在下面的代码中执行类似的操作。我得到一个错误,因为8位常量不算作输入。我也不想触发总是不停的时钟。我只想给一个特定的值分配一个寄存器。因为我希望它是可合成的,所以不能使用初始块。非常感谢 module top ( input wire clk, output wire [7:0] led ); reg [7:0] data_reg ; always @* beg
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
始终@*将永远不会触发,因为右侧参数不会改变。为什么不使用带有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
如果您确实想要一个可以更改值的触发器,那么默认值将出现在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
模块顶部
(
输入时钟,
输入rst\n,
输入[7:0]数据,
输出[7:0]发光二极管
);
reg[7:0]数据\u reg;
始终@(posedge clk或negedge rst_n)开始
如果(!rst_n)
data_reg当芯片通电时,其所有寄存器都包含随机值。不可能有一个初始值。它总是随机的
这就是为什么我们有重置信号,将寄存器重置为已知值。复位是由芯片外的东西控制的,我们编写代码来使用它
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
您可以将寄存器声明与初始化结合起来
reg [7:0] data_reg = 8'b10101011;
或者您可以使用初始
块
reg [7:0] data_reg;
initial data_reg = 8'b10101011;
您应该使用您的FPGA文档推荐的方法。除了使用重置网络外,没有任何可移植的方法来初始化寄存器值。这与大多数合成目标的硬件成本有关。其他答案都很好。对于Xilinx FPGA设计,最好不要使用全局复位线,对于大多数逻辑,使用初始
块作为复位条件。这是Ken Chapman(Xilinx FPGA专家)的白皮书
您所说的一般适用于ASIC,但不适用于FPGA。下载位文件时,所有存储单元都将初始化。对于基于FPGA的设计,重置通常不需要或没有帮助,并且导致更大的面积和可能更低的Fmax。最好的重置是再次下载位文件。@NathanFarrington谢谢。我有一个类似的问题,我正在努力理解。我有一个FSM的状态寄存器,它似乎不会初始化,除非我指定它来驱动输出线。我打开了另一个帖子。这种行为似乎与我们在这里讨论的有关。也许你可以看看,告诉我你的想法。它是针对Xilinx FPGA的Verilog编码。Thanks@Tim也适用于Altera旋风II的Quartus合成。@NathanFarrington是否可以使用变量(例如模块的输入参数)初始化reg。我试着像上面那样直接做,但不起作用。@anonymous可以用参数初始化一个reg,但不是常规输入。这会合成吗?这取决于你的合成工具供应商、版本和设置。传统上,合成工具忽略了初始条件,但现在有些工具支持它们。KC的论文并不是这样说的。他只是说,重置行可能很昂贵,您应该考虑设计的每个部分是否确实需要重置,因为它可能会很快从未知状态中退出,或者可能无法通过重置实现(例如,SRL16)。这绝对是一个错误的结论,你应该避免显式重置行。我更新了我的答案,使用全球这个词。KC明确表示,全局复位线路不好(昂贵、耗时且不必要),复位电路只应在必要时使用。