22

我是一个尝试学习 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
4

5 回答 5

34

您可以将寄存器声明与初始化结合起来。

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

或者你可以使用一个initial

reg [7:0] data_reg;
initial data_reg = 8'b10101011;
于 2012-04-04T17:48:56.417 回答
6

The other answers are all good. For Xilinx FPGA designs, it is best not to use global reset lines, and use initial blocks for reset conditions for most logic. Here is the white paper from Ken Chapman (Xilinx FPGA guru)

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

于 2014-03-18T17:32:53.633 回答
5

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

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

希望这可以帮助

于 2012-04-04T07:05:51.747 回答
5

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

于 2012-04-04T20:47:56.633 回答
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
于 2012-04-04T07:08:18.367 回答