Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为Verilog中的reg分配一个可合成的初始值_Verilog - Fatal编程技术网

为Verilog中的reg分配一个可合成的初始值

为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

我是一个试图学习Verilog的新手。如何将值作为初始值或常量“分配”给always块中的reg。我正试图在下面的代码中执行类似的操作。我得到一个错误,因为8位常量不算作输入。我也不想触发总是不停的时钟。我只想给一个特定的值分配一个寄存器。因为我希望它是可合成的,所以不能使用初始块。非常感谢

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明确表示,全局复位线路不好(昂贵、耗时且不必要),复位电路只应在必要时使用。