所以我有我的计数器在verilog,这是4位,我希望它保持在最大值,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 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但它不会等信号的。我对verilog非常陌生,所以我的代码可能对硬件人员没有多大意义,因为我是一个软件工程师,如果这里有一些新手错误,我很抱歉。
至于testbench,下面是我所拥有的:
`timescale 1ns / 1ps
module vtfContMax;
// Inputs
reg iClk;
reg iRst;
reg iCE;
reg iSignal;
// Outputs
wire oQ;
wire [3:0] orCnt;
// Instantiate the Unit Under Test (UUT)
contadorAscMax uut (
.iClk(iClk),
.iRst(iRst),
.oQ(oQ),
.iCE(iCE),
.iSignal(iSignal),
.orCnt(orCnt)
);
initial begin
// Initialize Inputs
iClk = 1;
iRst = 1;
iCE = 1;
iSignal = 0;
// Wait 100 ns for global reset to finish
#10;
iRst = 0;
repeat(10)
begin
repeat(10)
begin
wait(iClk);
wait(!iClk);
end
end
$stop();
// Add stimulus here
end
always
begin
#5;
iClk = ~iClk;
#10
iSignal = ~iSignal;
end
endmodule(谢谢你的帮助:)
发布于 2018-03-04 10:07:40
您已经将代码拆分到寄存器和组合部分中。虽然对于复杂的逻辑来说,这是一个好主意,但是对于一个简单的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您没有提到的内容,但我从您的代码中看到的是,您还有一个启用(iCE)和一个未使用的输出oQ。然后,总数变成:
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还有一些评论:
你的重置条件在我看来是有缺陷的,但你必须解决这个问题。
给计数器启用信号一个合适的名称:“count_enable”而不是“signal”。
最后:我不会使用所有的'i's和'o's。来自一个模块的'o‘信号将是另一个模块的'i’。因此,您必须在某个地方更改信号名。最好在你的系统中有一个明确的信号。如果是这样的话,你可以在综合后的定时报告或大门中找到。
https://stackoverflow.com/questions/49092081
复制相似问题