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

时间:2012-04-04 05:30:22

标签: 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

5 个答案:

答案 0 :(得分:23)

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

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

或者您可以使用initial

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

答案 1 :(得分:6)

其他答案都很好。对于Xilinx FPGA设计,最好使用全局复位线,并使用initial块用于大多数逻辑的复位条件。以下是Ken Chapman(Xilinx FPGA大师)的白皮书

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

答案 2 :(得分:4)

始终@ *永远不会触发,因为没有右手参数改变。为什么不使用带有分配的电线?

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

希望这有帮助

答案 3 :(得分:4)

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

答案 4 :(得分:3)

当芯片获得电源时,它的所有寄存器都包含随机值。不可能有一个初始值。它总是随机的。

这就是我们复位信号,将寄存器复位到已知值的原因。复位由片外控件控制,我们编写代码使用它。

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