ich versuche, in VerilogHerstellung Zähler in Verilog, Modelsim
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 0
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
end
end
else
begin
grant0 <= ~grant2 * grant3;
grant1 <= grant0;
grant2 <= grant1;
grant3 <= grant2;
//counter
end
end
end
end
endmodule
wie Sie sehen können Round-Robin-Zähler zu machen, ich versuche, Round-Robin-Zähler zu machen. jeden Fall ist es wie (Zuschuss).., .. 0, 0112301123 .., .. 0122301223,...
** Error: (vlog-13069) C:/Modeltech_pe_edu_10.4a/examples/rr_arbiter.v(17): near "always": syntax error, unexpected always, expecting ';' or ','.
** Error: (vlog-13069) C:/Modeltech_pe_edu_10.4a/examples/rr_arbiter.v(22): near "<=": syntax error, unexpected <=.
** Error: C:/Modeltech_pe_edu_10.4a/examples/rr_arbiter.v(22): (vlog-13205) Syntax error found in the scope following 'grant0'. Is there a missing '::'?
Thx. Ich habe es gefunden und repariert, aber was ich wirklich machen will, ist ein RR-Counter und es funktioniert überhaupt nicht. Würdest du mir helfen? –
es soll wie folgt sein: wenn Reset-== 1 alle Zuschüsse = 0 Priorität == 0 Zähler: 0 1 2 3 0 1 2 3 ... Priorität == 1 und priority_req == 0 Zähler: 0 0 1 2 3 0 0 1 2 3 ... Priorität == 1 und priority_req == 1 Zähler: 0 1 1 2 3 0 1 1 2 3 ... Priorität = 1 und priority_req == 2 Zähler: 0 1 2 2 3 0 1 2 2 3 ... Priorität = 1 und Priorität_req = 3 Zähler: 0 1 2 3 3 0 1 2 3 3 ... Wie kann Ich mache dieses Gegensystem ..! –
Sie müssen das Problem lösen und überlegen, welche Blöcke Sie benötigen. eine FSM mit zwei Zuständen, um die Doppelzählung zu verfolgen; ein Zähler, der 0-3 zählt, aber mit der FSM interagiert, um die Doppelzählung durchzuführen; ein 4-2-Encoder, um req0-req3 in eine 2-Bit-Binärzahl umzuwandeln, um sie mit dem Zählerausgang zu vergleichen (Sie müssen überlegen, was zu tun ist, wenn mehr als ein req 1 ist); ein 2-4 Decoder, um den Zählerausgang in grant0-grant3 zu konvertieren. Wenn Sie das Problem so lösen, könnten Sie es einfacher finden, es in einem massiven "Immer" -Block zu programmieren. –