在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 12320|回复: 8

[讨论] 请大家一起来分析一下这个Verilog轮转优先级仲裁器的代码

[复制链接]
发表于 2013-4-6 22:19:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
原文地址:http://www.asic-world.com/examples/verilog/arbiter.html



  1. //----------------------------------------------------
  2. // A four level, round-robin arbiter. This was
  3. // orginally coded by WD Peterson in VHDL.
  4. //----------------------------------------------------
  5. module arbiter (
  6.   clk,   
  7.   rst,   
  8.   req3,   
  9.   req2,   
  10.   req1,   
  11.   req0,   
  12.   gnt3,   
  13.   gnt2,   
  14.   gnt1,   
  15.   gnt0   
  16. );
  17. // --------------Port Declaration-----------------------
  18. input           clk;   
  19. input           rst;   
  20. input           req3;   
  21. input           req2;   
  22. input           req1;   
  23. input           req0;   
  24. output          gnt3;   
  25. output          gnt2;   
  26. output          gnt1;   
  27. output          gnt0;   

  28. //--------------Internal Registers----------------------
  29. wire    [1:0]   gnt       ;   
  30. wire            comreq    ;
  31. wire            beg       ;
  32. wire   [1:0]    lgnt      ;
  33. wire            lcomreq   ;
  34. reg             lgnt0     ;
  35. reg             lgnt1     ;
  36. reg             lgnt2     ;
  37. reg             lgnt3     ;
  38. reg             lasmask   ;
  39. reg             lmask0    ;
  40. reg             lmask1    ;
  41. reg             ledge     ;

  42. //--------------Code Starts Here-----------------------
  43. always @ (posedge clk)
  44. if (rst) begin
  45.   lgnt0 <= 0;
  46.   lgnt1 <= 0;
  47.   lgnt2 <= 0;
  48.   lgnt3 <= 0;
  49. end else begin                                    
  50.   lgnt0 <=(~lcomreq & ~lmask1 & ~lmask0 & ~req3 & ~req2 & ~req1 & req0)
  51.         | (~lcomreq & ~lmask1 &  lmask0 & ~req3 & ~req2 &  req0)
  52.         | (~lcomreq &  lmask1 & ~lmask0 & ~req3 &  req0)
  53.         | (~lcomreq &  lmask1 &  lmask0 & req0  )
  54.         | ( lcomreq & lgnt0 );
  55.   lgnt1 <=(~lcomreq & ~lmask1 & ~lmask0 &  req1)
  56.         | (~lcomreq & ~lmask1 &  lmask0 & ~req3 & ~req2 &  req1 & ~req0)
  57.         | (~lcomreq &  lmask1 & ~lmask0 & ~req3 &  req1 & ~req0)
  58.         | (~lcomreq &  lmask1 &  lmask0 &  req1 & ~req0)
  59.         | ( lcomreq &  lgnt1);
  60.   lgnt2 <=(~lcomreq & ~lmask1 & ~lmask0 &  req2  & ~req1)
  61.         | (~lcomreq & ~lmask1 &  lmask0 &  req2)
  62.         | (~lcomreq &  lmask1 & ~lmask0 & ~req3 &  req2  & ~req1 & ~req0)
  63.         | (~lcomreq &  lmask1 &  lmask0 &  req2 & ~req1 & ~req0)
  64.         | ( lcomreq &  lgnt2);
  65.   lgnt3 <=(~lcomreq & ~lmask1 & ~lmask0 & req3  & ~req2 & ~req1)
  66.         | (~lcomreq & ~lmask1 &  lmask0 & req3  & ~req2)
  67.         | (~lcomreq &  lmask1 & ~lmask0 & req3)
  68.         | (~lcomreq &  lmask1 &  lmask0 & req3  & ~req2 & ~req1 & ~req0)
  69.         | ( lcomreq & lgnt3);
  70. end

  71. //----------------------------------------------------
  72. // lasmask state machine.
  73. //----------------------------------------------------
  74. assign beg = (req3 | req2 | req1 | req0) & ~lcomreq;
  75. always @ (posedge clk)
  76. begin                                    
  77.   lasmask <= (beg & ~ledge & ~lasmask);
  78.   ledge   <= (beg & ~ledge &  lasmask)
  79.           |  (beg &  ledge & ~lasmask);
  80. end

  81. //----------------------------------------------------
  82. // comreq logic.
  83. //----------------------------------------------------
  84. assign lcomreq = ( req3 & lgnt3 )
  85.                 | ( req2 & lgnt2 )
  86.                 | ( req1 & lgnt1 )
  87.                 | ( req0 & lgnt0 );

  88. //----------------------------------------------------
  89. // Encoder logic.
  90. //----------------------------------------------------
  91. assign  lgnt =  {(lgnt3 | lgnt2),(lgnt3 | lgnt1)};

  92. //----------------------------------------------------
  93. // lmask register.
  94. //----------------------------------------------------
  95. always @ (posedge clk )
  96. if( rst ) begin
  97.   lmask1 <= 0;
  98.   lmask0 <= 0;
  99. end else if(lasmask) begin
  100.   lmask1 <= lgnt[1];
  101.   lmask0 <= lgnt[0];
  102. end else begin
  103.   lmask1 <= lmask1;
  104.   lmask0 <= lmask0;
  105. end

  106. assign comreq = lcomreq;
  107. assign gnt    = lgnt;
  108. //----------------------------------------------------
  109. // Drive the outputs
  110. //----------------------------------------------------
  111. assign gnt3   = lgnt3;
  112. assign gnt2   = lgnt2;
  113. assign gnt1   = lgnt1;
  114. assign gnt0   = lgnt0;

  115. endmodule


复制代码



这里面这些lmask、lcomreq、lgnt还有ledge都有什么目的?希望能有人来解答,多谢!
 楼主| 发表于 2013-4-7 13:47:41 | 显示全部楼层
咋没人讨论呢。。。。
发表于 2013-4-7 16:43:30 | 显示全部楼层
粗略看了下,一知半解吧- -
lmast0和lmast1用来表示当前4个设备的优先级高低。比如当两者都为1时,设备0的优先级最高。
lcomreq表示当前总线是否被占用。
lgnt0为1时表示总线被设备1占用,以此类推。
至于ledge可能是主要配合lasmast,lasmast为一个脉冲信号,在它为高的cycle重新计算优先级。
不一定完全正确,希望对你的理解有点帮助....
 楼主| 发表于 2013-4-7 18:57:46 | 显示全部楼层
回复 3# syqkjz

恩,非常感谢你的回复,在您的解答下,我能够理解这个代码中的大部分了。可是还有几点不是很明白,希望能继续和你探讨:1、有个位宽为2位的wire型变量lgnt,



  1. //----------------------------------------------------// Encoder logic.
  2. //----------------------------------------------------
  3. assign  lgnt =  {(lgnt3 | lgnt2),(lgnt3 | lgnt1)};


复制代码

这个持续赋值语句不是很明白它的意思。
2、关于lasmask,



  1. //----------------------------------------------------
  2. // lasmask state machine.
  3. //----------------------------------------------------
  4. assign beg = (req3 | req2 | req1 | req0) & ~lcomreq;
  5. always @ (posedge clk)
  6. begin                                    
  7.   lasmask <= (beg & ~ledge & ~lasmask);
  8.   ledge   <= (beg & ~ledge &  lasmask)
  9.           |  (beg &  ledge & ~lasmask);
  10. end


复制代码

这个状态机没怎么看懂呀,beg在有请求且总线没有被占用的时候为1,可是那个lasmask和ledge都是嵌套定义的,这个怎么理解?
发表于 2013-4-7 20:15:40 | 显示全部楼层
仿真验证一把吧,给激励。。。你就完全清楚了
 楼主| 发表于 2013-4-7 20:41:04 | 显示全部楼层
回复 5# chen.terry


   原文地址里有testbench,我也仿真了,但还是不太明白。。
发表于 2014-6-17 09:54:09 | 显示全部楼层
大神,求教如何仿真的?老是很多错误啊,这课程设计压根搜不到!求帮助
发表于 2018-8-12 18:53:51 | 显示全部楼层
这段代码还是看不懂,有大佬能解释下吗?
发表于 2020-3-7 10:59:32 | 显示全部楼层
谢谢分享~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-22 13:38 , Processed in 0.024411 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表