|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
原文地址:http://www.asic-world.com/examples/verilog/arbiter.html
- //----------------------------------------------------
- // A four level, round-robin arbiter. This was
- // orginally coded by WD Peterson in VHDL.
- //----------------------------------------------------
- module arbiter (
- clk,
- rst,
- req3,
- req2,
- req1,
- req0,
- gnt3,
- gnt2,
- gnt1,
- gnt0
- );
- // --------------Port Declaration-----------------------
- input clk;
- input rst;
- input req3;
- input req2;
- input req1;
- input req0;
- output gnt3;
- output gnt2;
- output gnt1;
- output gnt0;
- //--------------Internal Registers----------------------
- wire [1:0] gnt ;
- wire comreq ;
- wire beg ;
- wire [1:0] lgnt ;
- wire lcomreq ;
- reg lgnt0 ;
- reg lgnt1 ;
- reg lgnt2 ;
- reg lgnt3 ;
- reg lasmask ;
- reg lmask0 ;
- reg lmask1 ;
- reg ledge ;
- //--------------Code Starts Here-----------------------
- always @ (posedge clk)
- if (rst) begin
- lgnt0 <= 0;
- lgnt1 <= 0;
- lgnt2 <= 0;
- lgnt3 <= 0;
- end else begin
- lgnt0 <=(~lcomreq & ~lmask1 & ~lmask0 & ~req3 & ~req2 & ~req1 & req0)
- | (~lcomreq & ~lmask1 & lmask0 & ~req3 & ~req2 & req0)
- | (~lcomreq & lmask1 & ~lmask0 & ~req3 & req0)
- | (~lcomreq & lmask1 & lmask0 & req0 )
- | ( lcomreq & lgnt0 );
- lgnt1 <=(~lcomreq & ~lmask1 & ~lmask0 & req1)
- | (~lcomreq & ~lmask1 & lmask0 & ~req3 & ~req2 & req1 & ~req0)
- | (~lcomreq & lmask1 & ~lmask0 & ~req3 & req1 & ~req0)
- | (~lcomreq & lmask1 & lmask0 & req1 & ~req0)
- | ( lcomreq & lgnt1);
- lgnt2 <=(~lcomreq & ~lmask1 & ~lmask0 & req2 & ~req1)
- | (~lcomreq & ~lmask1 & lmask0 & req2)
- | (~lcomreq & lmask1 & ~lmask0 & ~req3 & req2 & ~req1 & ~req0)
- | (~lcomreq & lmask1 & lmask0 & req2 & ~req1 & ~req0)
- | ( lcomreq & lgnt2);
- lgnt3 <=(~lcomreq & ~lmask1 & ~lmask0 & req3 & ~req2 & ~req1)
- | (~lcomreq & ~lmask1 & lmask0 & req3 & ~req2)
- | (~lcomreq & lmask1 & ~lmask0 & req3)
- | (~lcomreq & lmask1 & lmask0 & req3 & ~req2 & ~req1 & ~req0)
- | ( lcomreq & lgnt3);
- end
- //----------------------------------------------------
- // lasmask state machine.
- //----------------------------------------------------
- assign beg = (req3 | req2 | req1 | req0) & ~lcomreq;
- always @ (posedge clk)
- begin
- lasmask <= (beg & ~ledge & ~lasmask);
- ledge <= (beg & ~ledge & lasmask)
- | (beg & ledge & ~lasmask);
- end
- //----------------------------------------------------
- // comreq logic.
- //----------------------------------------------------
- assign lcomreq = ( req3 & lgnt3 )
- | ( req2 & lgnt2 )
- | ( req1 & lgnt1 )
- | ( req0 & lgnt0 );
- //----------------------------------------------------
- // Encoder logic.
- //----------------------------------------------------
- assign lgnt = {(lgnt3 | lgnt2),(lgnt3 | lgnt1)};
- //----------------------------------------------------
- // lmask register.
- //----------------------------------------------------
- always @ (posedge clk )
- if( rst ) begin
- lmask1 <= 0;
- lmask0 <= 0;
- end else if(lasmask) begin
- lmask1 <= lgnt[1];
- lmask0 <= lgnt[0];
- end else begin
- lmask1 <= lmask1;
- lmask0 <= lmask0;
- end
- assign comreq = lcomreq;
- assign gnt = lgnt;
- //----------------------------------------------------
- // Drive the outputs
- //----------------------------------------------------
- assign gnt3 = lgnt3;
- assign gnt2 = lgnt2;
- assign gnt1 = lgnt1;
- assign gnt0 = lgnt0;
- endmodule
复制代码
这里面这些lmask、lcomreq、lgnt还有ledge都有什么目的?希望能有人来解答,多谢! |
|