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 *