Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.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 vs Reg+;模块实例化的连线_Verilog_Fpga - Fatal编程技术网

Verilog综合:Reg vs Reg+;模块实例化的连线

Verilog综合:Reg vs Reg+;模块实例化的连线,verilog,fpga,Verilog,Fpga,我对Verilog和FPGA开发相当陌生,并且注意到在模拟和合成之间有很多不同之处。我正在使用Altera DE1板和Quartus II软件 有件事我想不出来。我有如下代码来实例化一个模块: reg [9:0] x0; initial begin x0 = 10'd200; end linepro linedrawer1 (.CLOCK(I_CLK), .RST(reset_drawer), .done(drawer_done), .x0(

我对Verilog和FPGA开发相当陌生,并且注意到在模拟和合成之间有很多不同之处。我正在使用Altera DE1板和Quartus II软件

有件事我想不出来。我有如下代码来实例化一个模块:

reg [9:0] x0;
initial begin
    x0 = 10'd200;
end

linepro linedrawer1 
     (.CLOCK(I_CLK),
     .RST(reset_drawer),
      .done(drawer_done),
     .x0(x0), 
     .y0(10'd200), 
     .x1(10'd500), 
     .y1(10'd100), 
     .outx(x), 
     .outy(y)); 
如您所见,我将初始化的reg直接挂接到linepro模块的端口。此代码似乎在模拟下工作,但未正确初始化fpga板上的x0

为了使此代码正常工作,并正确实例化linepro模块,我做了以下轻微修改:

reg [9:0] x0reg;
wire [9:0] x0;
assign x0=x0reg;
initial begin
    x0reg = 10'd200;
end

linepro linedrawer1 
     (.CLOCK(I_CLK),
     .RST(reset_drawer),
      .done(drawer_done),
     .x0(x0), 
     .y0(10'd200), 
     .x1(10'd500), 
     .y1(10'd100), 
     .outx(x), 
     .outy(y)); 
在本例中,我将reg指定给一根导线,并将导线挂接到linepro模块中

直接使用reg实例化模块将reg分配给导线并使用该导线实例化模块之间有什么区别(如果有)?一种方法有效而另一种方法无效的原因是什么


提前感谢您的帮助。

在编写综合RTL时,您应该记住您实际要实现的逻辑电路。虽然通常初始块是不可合成的,但一些FPGA供应商允许您指定触发器、锁存器和存储器等存储器元件的通电状态。在本例中,x0看起来并不是这些东西中的任何一个——它只是一个常量,应用于linepro模块的一个输入。在这种情况下,您可能只需在端口列表中指定该值,就像您对y0、y1和x1端口所做的那样,这是完全可合成的,而不是使用初始块

Quartus确实支持使用“initial”语句对寄存器和内存进行初始化。我怀疑这里的问题是你从来没有真正实现过注册

我想知道这是否有效:

reg [9:0] x0reg;
initial x0reg = 10'd200;
always @(posedge clk) begin
  x0reg <= x0reg;
end

上述措施应该有效。请注意,
always@*
在这种情况下不起作用,因为
always@*
always\u comb
之间的关键区别之一是,
always\u comb
块在模拟开始时被触发,而
always@*
块只有在输入发生变化时才会被触发(这可能不会发生在时间零点)。(通常,您应该始终使用
始终梳
,并且永远不要使用
始终*

linepro
上的
x0
端口的输入还是输出?它的输入声明如下:输入[9:0]x0您所说的“但没有正确初始化fpga板上的x0”是什么意思?如果你的意思是它没有初始化为
200
,那是因为
初始
块是不可合成的。虽然我不喜欢它,但是
初始
块是FPGA默认设置的一种可接受的方式。它们对于ASIC是不可合成的。第二个示例使用初始块,它进行合成。
reg [9:0] x0reg;
always_comb x0_reg = 10'd200;