Verilog综合:Reg vs Reg+;模块实例化的连线
我对Verilog和FPGA开发相当陌生,并且注意到在模拟和合成之间有很多不同之处。我正在使用Altera DE1板和Quartus II软件 有件事我想不出来。我有如下代码来实例化一个模块: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(
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;