Verilog 输出仅为一个时钟周期,而不是三个时钟周期
我写了这段代码。当输入B为1时,输出必须为3个时钟周期,但当我尝试测试它时,输出仅为1个时钟周期。我不知道如何更改代码以获得所需的输出Verilog 输出仅为一个时钟周期,而不是三个时钟周期,verilog,Verilog,我写了这段代码。当输入B为1时,输出必须为3个时钟周期,但当我尝试测试它时,输出仅为1个时钟周期。我不知道如何更改代码以获得所需的输出 module LaserTimerTopDown ( B,X,Clk,Rst); input B; output reg X; input Clk,Rst; parameter S_OFF =0, S_ON=1; // shared variable reg Cnt_Sel, Cnt_Eq_0, Cn
module LaserTimerTopDown (
B,X,Clk,Rst);
input B;
output reg X;
input Clk,Rst;
parameter S_OFF =0, S_ON=1;
// shared variable
reg Cnt_Sel, Cnt_Eq_0, Cnt_Ld;
// datapath variable
reg [1:0] Cnt, CntNext;
// controller variable
reg [0:0] State, StateNext;
// Datapath Procedures
always @(Cnt, Cnt_Sel) begin
if (Cnt_Sel == 1)
CntNext <= 2'b10;
else
CntNext <= Cnt -1;
Cnt_Eq_0 <= (Cnt ==0)? 1:0;
end
always @ (posedge Clk) begin
if (Rst ==1)
Cnt <= 0;
else if (Cnt_Ld ==1)
CntNext <= Cnt;
end
// Controler Procedures
always @(Cnt_Eq_0, B, State)begin
case(State)
S_OFF :begin
X<= 0; Cnt_Sel <= 1; Cnt_Ld <= 1;
if (B==0)
StateNext <= S_OFF;
else
StateNext <= S_ON;
end
S_ON : begin
X<= 1; Cnt_Sel <= 0; Cnt_Ld <= 1;
if(Cnt_Eq_0 ==0)
StateNext <= S_ON;
else
StateNext <= S_OFF;
end
endcase
end
always @(posedge Clk) begin
if (Rst ==1)
State <= S_OFF;
else
State<= StateNext;
end
endmodule
模块激光自顶向下(
B、 X、Clk、Rst);
输入B;
输出寄存器X;
输入时钟,Rst;
参数S_OFF=0,S_ON=1;
//共享变量
注册Cnt_Sel,Cnt_Eq_0,Cnt_Ld;
//数据路径变量
reg[1:0]Cnt,CntNext;
//控制器变量
reg[0:0]状态,StateNext;
//数据路径过程
始终@(Cnt,Cnt_Sel)开始
如果(Cnt_Sel==1)
CntNext模块激光自顶向下(
B、 X、Clk、Rst);
输入B;
输出寄存器X;
输入时钟,Rst;
参数S_OFF=0,S_ON=1;
//共享变量
注册Cnt_Sel,Cnt_Eq_0,Cnt_Ld;
//数据路径变量
reg[1:0]Cnt,CntNext;
//控制器变量
reg[0:0]状态,StateNext;
//数据路径过程
始终@(Cnt,Cnt_Sel)开始
如果(Cnt_Sel==1)
CntNext可能应该是这一行:CntNext我看到Cnt_next是通过多个always块分配的。接下来Cnt_的确切逻辑是什么。另外,您还没有在“始终块”的敏感度列表中添加Rst。谢谢Mattew Taylor,我完成了您的所有要点。就像我期望的那样,谢谢你,卡兰·沙阿。当我注意到下一步的确切逻辑并修改它时。它就像我期望的那样工作。
module LaserTimerTopDown (
B,X,Clk,Rst);
input B;
output reg X;
input Clk,Rst;
parameter S_OFF =0, S_ON=1;
// shared variable
reg Cnt_Sel, Cnt_Eq_0, Cnt_Ld;
// datapath variable
reg [1:0] Cnt, CntNext;
// controller variable
reg [0:0] State, StateNext;
// Datapath Procedures
always @(Cnt, Cnt_Sel) begin
if (Cnt_Sel == 1)
CntNext <= 2'b10;
else
CntNext <= Cnt -1;
Cnt_Eq_0 <= (Cnt ==0)? 1:0;
end
always @ (posedge Clk) begin
if (Rst ==1)
Cnt <= 0;
else if (Cnt_Ld ==1)
Cnt <= CntNext;
end
// Controler Procedures
always @(Cnt_Eq_0, B, State)begin
case(State)
S_OFF :begin
X<= 0; Cnt_Sel <= 1; Cnt_Ld <= 1;
if (B==0)
StateNext <= S_OFF;
else
StateNext <= S_ON;
end
S_ON : begin
X<= 1; Cnt_Sel <= 0; Cnt_Ld <= 1;
if(Cnt_Eq_0 ==0)
StateNext <= S_ON;
else
StateNext <= S_OFF;
end
endcase
end
always @(posedge Clk) begin
if (Rst ==1)
State <= S_OFF;
else
State<= StateNext;
end
endmodule