请大家一起来分析一下这个Verilog轮转优先级仲裁器的代码
时间:10-02
整理:3721RD
点击:
原文地址:http://www.asic-world.com/examples/verilog/arbiter.html
这里面这些lmask、lcomreq、lgnt还有ledge都有什么目的?希望能有人来解答,多谢!
这个持续赋值语句不是很明白它的意思。
2、关于lasmask,
这个状态机没怎么看懂呀,beg在有请求且总线没有被占用的时候为1,可是那个lasmask和ledge都是嵌套定义的,这个怎么理解?
- //----------------------------------------------------
- // 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都有什么目的?希望能有人来解答,多谢!
咋没人讨论呢。
粗略看了下,一知半解吧- -
lmast0和lmast1用来表示当前4个设备的优先级高低。比如当两者都为1时,设备0的优先级最高。
lcomreq表示当前总线是否被占用。
lgnt0为1时表示总线被设备1占用,以此类推。
至于ledge可能是主要配合lasmast,lasmast为一个脉冲信号,在它为高的cycle重新计算优先级。
不一定完全正确,希望对你的理解有点帮助....
恩,非常感谢你的回复,在您的解答下,我能够理解这个代码中的大部分了。可是还有几点不是很明白,希望能继续和你探讨:1、有个位宽为2位的wire型变量lgnt,
- //----------------------------------------------------// Encoder logic.
- //----------------------------------------------------
- assign lgnt = {(lgnt3 | lgnt2),(lgnt3 | lgnt1)};
这个持续赋值语句不是很明白它的意思。
2、关于lasmask,
- //----------------------------------------------------
- // 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
这个状态机没怎么看懂呀,beg在有请求且总线没有被占用的时候为1,可是那个lasmask和ledge都是嵌套定义的,这个怎么理解?
仿真验证一把吧,给激励。你就完全清楚了
原文地址里有testbench,我也仿真了,但还是不太明白。
大神,求教如何仿真的?老是很多错误啊,这课程设计压根搜不到!求帮助
