以下代码已编译并正在并行工作,请帮助我使这些代码按顺序工作,即在stage1计数器应自行重置并从stage2开始为0。以下代码具有Module1-stage1和module2-stage2。这是一个阶段在完成另一个阶段后发生的过程流程。例如,当阶段1完成时,计数器自身复位,然后阶段2从计数零开始。这里阶段1模块有计数器,计数到18,阶段2计数器计数8.
module stage1(
input Clk, //50 Hz clock
input x0,
input reset,
output reg y0,y1,y2,y3,y5,y7,y10,y15,
output reg stage1_done
);
reg [15:0] counter = 0;
parameter F = 50;
always@ (posedge Clk or posedge reset)
if(reset) begin
counter <= 0;
{y0,y1,y2,y3,y5,y7,y10,y15} <= 8'b00000000;
stage1_done <= 0;
end else begin
if(x0 == 1) begin
if(counter == 18*F)
stage1_done <= 1;
else begin
counter <= counter + 1;
stage1_done <= 0;
end
if(counter >= 1*F && counter < 10*F)
y0 <= 1;
else
y0 <= 0;
if(counter >= 1*F && counter < 17*F)
y1 <= 1;
else
y1 <= 0;
if(counter >= 1*F && counter < 9*F)
y2 <= 1;
else
y2 <= 0;
if(counter >= 11*F && counter < 16*F)
y3 <= 1;
else
y3 <= 0;
if(counter >= 1*F && counter < 18*F)
y5 <= 1;
else
y5 <= 0;
if(counter >= 1*F && counter < 5*F)
y7 <= 1;
else
y7 <= 0;
if(counter >= 1*F && counter < 5*F)
y10 <= 1;
else
y10 <= 0;
if((counter >= 2*F && counter < 9*F) || (counter >= 13*F && counter < 17*F))
y15 <= 1;
else
y15 <= 0;
end
end
endmodule
//阶段2的模块;
module stage2(
input x0,
input Clk, //50 Hz clock
input reset,
output reg y1,y3,y5,
output reg stage2_done
);
reg [15:0] counter = 0;
parameter F = 50;
always@ (posedge Clk or posedge reset)
if(reset) begin
counter <= 0;
{y1,y3,y5} <= 3'b000;
stage2_done <= 0;
end
else begin if(x0 == 1) begin
if(counter == 8*F)
stage2_done <= 1;
else begin
counter <= counter + 1;
stage2_done <= 0;
end
if(counter >= 1*F && counter < 8*F)
y1 <= 1;
else
y1 <= 0;
if(counter >= 1*F && counter < 8*F)
y3 <= 1;
else
y3 <= 0;
if(counter >= 1*F && counter < 8*F)
y5 <= 1;
else
y5 <= 0;
end
end
endmodule
答案 0 :(得分:0)
如果您希望来自stage2
模块的计数器在counter
完成stage1
后开始计数,那么您必须&#34;通知&#34;它是另一个完成计数。在您的情况下,您可以使用stage1_done
信号并将其提供给stage2
模块。使用此信号作为计数器最初开始计数的条件。另外,当您断言counter
时,是否应该将stage1
从0
重置回stage1_done
?
答案 1 :(得分:0)
将其视为状态机。具有2或3个状态,即reset
,stage1
,stage2
。你需要考虑从一个阶段到另一个阶段的条件。你提供了一个条件:stage1计数器溢出必须从stage1进入stage2。肯定没有什么问题:stage2运行时stage1会发生什么,第2阶段结束时会发生什么。重置期间会发生什么?
所以,我建议您创建另一个模块来实现状态机逻辑:
module control(clk, ...);
enum { reset, stage1, stage2} state, next_state;
always_ff @( posedge clk)
case (state)
reset:
if (!resetSig) next_state <= stage1;
else if (resetSig) next_state <= reset;
stage1:
if (stage1Done) next)state <= stage2;
...
endcase
assign state = next_state;
现在,在每个阶段,您只需使用state
作为启用条件。
module stage1(clk, state, stageDone, ...)
always_ff
if (state == reset)
do reset
else if (state == stage1)
do stage1
assign stageDone = counter == max_value;
等等。是的,您需要为状态机控件传递额外的端口,但是您将使代码更易于管理和可读,并确认符合行业惯例。