首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Verilog同步4位计数器停留在最大值直到给定信号

Verilog同步4位计数器停留在最大值直到给定信号
EN

Stack Overflow用户
提问于 2018-03-04 04:49:24
回答 1查看 2.1K关注 0票数 0

所以我有我的计数器在verilog,这是4位,我希望它保持在最大值,1111,直到我给它一个信号开始计数从0000开始。

到目前为止,我已经想出了以下几点:

代码语言:javascript
复制
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,下面是我所拥有的:

代码语言:javascript
复制
`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

(谢谢你的帮助:)

EN

回答 1

Stack Overflow用户

发布于 2018-03-04 10:07:40

您已经将代码拆分到寄存器和组合部分中。虽然对于复杂的逻辑来说,这是一个好主意,但是对于一个简单的4位计数器来说,它有点过了头。

为了解决你的问题,你是亲密的。像这样的代码的诀窍是使用‘编程’语言来定义。然后代码就会从那里流出来。

我想要一个从1111到0000的计数器,当信号出现的时候,,我想要它计数起来。

这将导致:

代码语言:javascript
复制
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。然后,总数变成:

代码语言:javascript
复制
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’。因此,您必须在某个地方更改信号名。最好在你的系统中有一个明确的信号。如果是这样的话,你可以在综合后的定时报告或大门中找到。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49092081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档