【问题标题】:making counter in verilog, Modelsim在 Verilog 中制作计数器,Modelsim
【发布时间】:2017-12-06 12:56:07
【问题描述】:

我正在尝试在 verilog 中制作循环计数器

module rr_arbiter (
clk, // positive edge trigger
reset,  // negative edge trigger
req0, req1, req2, req3, 
grant0, grant1, grant2, grant3,
priority, priority_req);

input clk, reset;
input req0, req1, req2, req3;
input priority;
input [1:0] priority_req;

output grant0, grant1, grant2, grant3;  

reg x 

always(posedge clk or negedge reset) begin
pirority_req = priority;

if (reset) begin
    grant0 <= 1'b0;
    grant1 <= 1'b0;
    grant2 <= 1'b0;
    grant3 <= 1'b0;
   end
else
begin
    if(priority == 1)
        if (priority req == 2b'00)
            begin
            x=1;
            grant0 <= (grant0*(~x))+(grant1*x);     
            x=0;
            grant0 <= (grant0*(~x))+(grant1*x);
            grant1 <= grant2;
            grant2 <= grant3;
            grant3 <= grant1;
            //  counter 0012300123
            end
        else if (priority req == 2b'01)
            begin
            grant0 <= grant1;
            x=1;
            grant1 <= (grant1*(~x))+(grant2*x);
            x=0;
            grant1 <= (grant1*(~x))+(grant2*x);
            grant2 <= grant3;
            grant3 <= grant1;
            //  counter 0112301123
            end
        else if (priority req == 2b'10)
            begin
            grant0 <= grant1;
            grant1 <= grant2;
            x=1;
            grant2 <= (grant2*(~x))+(grant3*x);
            x=0;
            grant2 <= (grant2*(~x))+(grant3*x);
            grant3 <= grant1;
            //  counter 0122301223
            end
        else if (priority req == 2b'11)
            begin
            grant0 <= grant1;
            grant1 <= grant2;
            grant2 <= grant3;
            x=1;
            grant3 <= (grant3*(~x))+(grant1*x);
            x=0;
            grant3 <= (grant3*(~x))+(grant1*x);
            //  counter 0123301233
            end
    end

    else 
    begin
        grant0 <= ~grant2 * grant3;
        grant1 <= grant0;
        grant2 <= grant1;
        grant3 <= grant2;
        //counter 01230123
    end
end
end

end

endmodule 

如您所见,我正在尝试制作循环计数器。 每个案例都像 (grant)01230123.., 0012300123.., 0112301123.., 0122301223.., 0123301233...

** 错误:(vlog-13069) C:/Modeltech_pe_edu_10.4a/examples/rr_arbiter.v(17):接近“总是”:语法错误,总是意外,期待 ';'或','。

** 错误:(vlog-13069) C:/Modeltech_pe_edu_10.4a/examples/rr_arbiter.v(22): near "

** 错误:C:/Modeltech_pe_edu_10.4a/examples/rr_arbiter.v(22): (vlog-13205) 在“grant0”之后的范围内发现语法错误。是否缺少'::'?

【问题讨论】:

    标签: verilog counter modelsim


    【解决方案1】:

    第 17 行的错误消息是不言自明的。它期待一个';'。你错过了一个';'在第 15 行。

    如果错误消息似乎没有意义,请始终将视线向上看,看看问题是否出在前一行。

    【讨论】:

    • 谢谢。我找到并修复了它,但我真正想做的是一个 RR 计数器,它根本不起作用。你能帮帮我吗?
    • 应该是这样的:当 Reset == 1 all grant = 0 priority==0 counter: 0 1 2 3 0 1 2 3 … priority==1 and priority_req ==0 counter: 0 0 1 2 3 0 0 1 2 3 ... priority==1 和 priority_req ==1 计数器:0 1 1 2 3 0 1 1 2 3... priority=1 和 priority_req ==2 计数器:0 1 2 2 3 0 1 2 2 3 ... priority=1 和 priority_req =3 计数器:0 1 2 3 3 0 1 2 3 3... 我怎样才能使那个计数器系统..!
    • 您需要分解问题并思考您需要哪些块。具有两种状态的 FSM 以跟踪重复计数;一个计数 0-3 但与 FSM 交互以进行双重计数的计数器;一个 4-2 编码器,用于将 req0-req3 转换为两位二进制数以与计数器输出进行比较(您需要考虑如果多个 req 为 1 时该怎么办);一个 2-4 解码器,用于将计数器输出转换为 grant0-grant3。如果您像这样分解问题,您可能会发现比尝试将其编码在一个巨大的always 块中更容易。
    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 2017-09-29
    相关资源
    最近更新 更多