Verilog同步4位计数器保持最大值,直到给出信号
所以我的计数器是4位的verilog,我希望它保持在最大值1111,直到我给它一个信号,再次从0000开始计数 以下是我到目前为止所能想到的:Verilog同步4位计数器保持最大值,直到给出信号,verilog,counter,synchronous,test-bench,Verilog,Counter,Synchronous,Test Bench,所以我的计数器是4位的verilog,我希望它保持在最大值1111,直到我给它一个信号,再次从0000开始计数 以下是我到目前为止所能想到的: module contadorAscMax ( input iClk, input iRst, output oQ, input iCE, input iSignal, output [3:0] orCnt ); reg[3:0] rvCnt_d; reg[3:0] rvCnt_q; assign or
module contadorAscMax
(
input iClk,
input iRst,
output oQ,
input iCE,
input iSignal,
output [3:0] orCnt
);
reg[3:0] rvCnt_d;
reg[3:0] rvCnt_q;
assign orCnt = rvCnt_q;
always @(posedge iClk or posedge iRst)
begin
if(iRst)
begin
rvCnt_q<=4'b0;
end
else
begin
if(iCE)
begin
rvCnt_q<=rvCnt_d;
end
else
begin
rvCnt_q<=rvCnt_q;
end
end
end
always @*
begin
rvCnt_d=rvCnt_q+4'b1;
if(rvCnt_d == 4'b1111)
begin
rvCnt_d = rvCnt_d;
end
else if(rvCnt_d == 4'b1111 & iSignal)
begin
rvCnt_d = 4'b0;
end
end
endmodule
感谢您的帮助:)您已将代码拆分为寄存器和组合部分。虽然这对于复杂逻辑来说是一个好主意,但对于一个简单的4位计数器来说,这有点过头了 为了解决你的问题,你很接近。这样的代码的诀窍是使用“编程”语言进行定义。然后代码就从那里流出来。
我想要一个计数器,当信号出现时,它从1111到0000,否则我想要它计数。
这将导致:
always @(clk or posedge reset)
begin
if (reset)
count <= 4'b1111;
else
begin
if (count==4'b1111 && start_signal)
count <= 4'b0000;
else
count <= count + 4'b0001
end
end
始终@(clk或posedge重置)
开始
如果(重置)
计数
always @(clk or posedge reset)
begin
if (reset)
count <= 4'b1111;
else
begin
if (count==4'b1111 && start_signal)
count <= 4'b0000;
else
count <= count + 4'b0001
end
end
module contadorAscMax
(
input iClk,
input iRst,
// output oQ,
input iCE,
input iSignal,
output reg [3:0] orCnt
);
always @(iClk or posedge iRst)
begin
if (iRst)
orCnt <= 4'b0000; // or should that be 4'b1111
// Is this really what you want?
// It will start counting after a reset!
else
begin
if (iCE)
begin
if (orCnt==4'b1111 && iSignal)
orCnt <= 4'b0000;
else
orCnt <= orCnt+ 4'b0001;
end
end
end
endmodule