arbiter設計部分代碼注釋 verilog代寫

<标题>module top_to_bottom(

input? wire??????? clk,

input? wire??????? rst_n,

<标题>input? wire [15:0] req, //request信號入口? 0~15號分別對應

<标题>output reg? [15:0] grt? //grant 信號出口

);

 

reg [4:0] i;

reg [15:0] grt_tmp;? //定義一個中間變量 方便進行非阻塞賦值 注意這里并沒有產生

//register

 

always @ (*) begin

grt_tmp = 16’b0;? //進行初始賦值 注意不要在posedge clk下賦值 要不然會產生寄存器

for (i=0;i<5’d16;i=i+1) begin

if (req[i] == 1’b1)

begin

<标题>grt_tmp[i] = 1’b1;? //如果對應的node號申請就按照top bottom的優先級放權

i????? = 5’d15;?? //一旦放權后就退出循環,方法是把i打到最大

end

end

end

 

always @ (posedge clk) begin //進行寄存器賦值操作

<标题>if (!rst_n)

grt <= 16’b0;

else

grt <= grt_tmp;? //

end

endmodule

 

 

<标题>module round_robin(

<标题>input wire??????? clk,

input wire??????? rst_n,

<标题>input wire [15:0] req,

output reg [15:0] grt

);

reg [3:0] cnt;//一個計數器,相當于一個指針,每當上一次node申請成功后,就指向與此//node相鄰的下一個node,這個信息需要跨時鐘沿,so we need some registers!

reg [3:0] i;

reg [15:0] grt_tmp;//注意i和grt_tmp在綜合時其實都不是寄存器,雖然他們是reg類型J

 

<标题>always @ (*) begin

i = cnt;

grt_tmp = 16’b0;

while (rst_

Leave a Reply

Your email address will not be published. Required fields are marked *