将可合成的初始值分配给Verilog中的reg

Fra*_*jay 17 verilog

我是一个试图学习Verilog的FPGA菜鸟.如何将值分配给始终块中的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
Run Code Online (Sandbox Code Playgroud)

Nat*_*ton 24

您可以将注册声明与初始化相结合.

reg [7:0] data_reg = 8'b10101011;
Run Code Online (Sandbox Code Playgroud)

或者你可以使用一个initial

reg [7:0] data_reg;
initial data_reg = 8'b10101011;
Run Code Online (Sandbox Code Playgroud)


Mar*_*ata 6

其他答案都很好.对于Xilinx FPGA设计,最好不要使用显式复位线,并使用initial复位条件块.以下是Ken Chapman(Xilinx FPGA大师)的白皮书

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


Mor*_*gan 5

always @* 永远不会触发,因为右手参数没有改变。为什么不使用带有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
Run Code Online (Sandbox Code Playgroud)

如果您确实想要一个可以更改值的触发器,默认值将在 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
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助


Pau*_*l S 5

当芯片通电时,它的所有寄存器都包含随机值。不可能有初始值。它永远是随机的。

这就是为什么我们有重置信号,将寄存器重置为已知值。复位是由片外的东西控制的,我们编写代码来使用它。

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
Run Code Online (Sandbox Code Playgroud)

  • 您所说的一般适用于 ASIC,但不适用于 FPGA。当您下载位文件时,所有存储单元都会被初始化。对于基于 FPGA 的设计,复位通常是不需要的或没有帮助,并且会导致更大的面积和可能更低的 Fmax。最好的重置是再次下载位文件。 (8认同)

小智 5

您应该使用 FPGA 文档推荐的内容。除了使用复位网络之外,没有其他可移植的方法来初始化寄存器值。在大多数综合目标上,这会产生与之相关的硬件成本。