【数字IC手撕代码】Verilog轮询仲裁器|题目|原理|设计|仿真

简介: 【数字IC手撕代码】Verilog轮询仲裁器|题目|原理|设计|仿真

cb39282b8fb147aaa3a300f70d43c278.png


一、前言


本系列旨在提供100%准确的数字IC设计/验证手撕代码环节的题目,原理,RTL设计,Testbench和参考仿真波形,每篇文章的内容都经过仿真核对。快速导航链接如下:


1.奇数分频

2.偶数分频

3.半整数分批

4.小数/分数分频

5.序列检测器

6.模三检测器

7.饮料机

8.异步复位,同步释放

9.边沿检测(上升沿,下降沿,双边沿)

10.全加器,半加器

11.格雷码转二进制

12.单bit跨时钟域(打两拍,边沿同步,脉冲同步)

13.奇偶校验

14.伪随机数生成器[线性反馈移位寄存器]

15.同步FIFO

16.无毛刺时钟切换电路

17.固定优先级仲裁器

18.轮询仲裁器


应当说,手撕代码环节是面试流程中既重要又简单的一个环节,跟软件类的岗位相比起来,数字IC的手撕代码题目固定,数量有限,属于整个面试中必得分的一个环节,在这个系列以外,笔者同样推荐数字IC求职者使用“HdlBits”进行代码的训练

链接如下

HDLBits — Verilog Practice


二、题目


数字IC工程师在使用多主设备的总线过程中,需要考虑到不同主设备申请总线控制权的优先级问题,使用Verilog语言,完成轮询仲裁器,其中输入端为4bit的request,输出端为4bit的独热码grant(独热码意味着只存在4种grant的结果如下1000,0100,0010,0001),默认时总线优先级为A>B>C>D,其中的ABCD分别代表request[0],request[1],request[2],request[3],即从低到高依次排列,根据轮询算法,当其中的某一位被选中后,它在下一次request到来时它的优先级最低(3),而它左边的相邻位优先级变为最高(0),从左边相邻位至最高位,优先级依次降低,回旋至最低位,此为轮询算法,举例如下:

image.png


该设计的输入输出端口如下

image.png


三、原理


为了解释轮询仲裁其的设计思路,我们首先需要注意的是,针对于固定优先级的仲裁器,纯组合逻辑电路就可以完成功能,而针对于轮询仲裁器而言,我们需要引入时钟信号了,即时序逻辑电路的部分,这是因为,此时的优先级排序,不仅与初态有关,也与前一个状态的响应有关(前后状态相互影响,即时序电路,引入clk信号与dff)

其次,对于举例中,我们对于相应情况四位独热码的grant的分析,我们可以发现它和下一个周期优先级排序之间的关系:即若abcd为grant,c为1,即grant为0010,下次的优先级为1032,若b为1,即grant为0321。

在固定优先级仲裁器的第三种方法中,我们介绍了补码相与法,这其实是轮询仲裁器的一个特殊case,即不管grant实际输出为多少,前一个状态始终按照a为1来记录(1000),即下次的优先级为3210的顺序来进行。

我们在相与的过程中grant减去了0b0001,即“0b1000,左移一位的结果”。根据相同的原理,我们将前态的grant做记录,再左移,使用相似的补码相与法,是否可以得到所需值呢?答案是可以的,而这个操作的原理与前一篇文章中所说的借位相似,不再赘述。


四、RTL设计


module round_robin_arb(clk,rst_n,request,grant);
input clk;
input rst_n;
input  [3:0] request;
output [3:0] grant;
reg  [3:0] pre_state;
wire [3:0] pre_grant;
always@(posedge clk or negedge rst_n) begin
  if(!rst_n)
  pre_state <= 4'h1;
  else
  pre_state <= {pre_grant[2],pre_grant[1],pre_grant[0],pre_grant[3]};
  end
assign pre_grant = {1'b1,request} & ~({1'b1,request} - 1'b1);
assign grant = {1'b1,request} & ~({1'b1,request} - pre_state);
endmodule


五、Testbench仿真


`timescale 1ns / 1ps
module round_robin_arb_tb();
reg clk;
reg rst_n;
reg [3:0] request;
wire [3:0] grant;
round_robin_arb u1(clk,rst_n,request,grant);
initial clk = 0;
always #5 clk = !clk;
initial begin
rst_n= 0;
request = 4'h0;
#19 rst_n = 1;
request = 4'b1101;
#10
request = 4'b0101;
#10
request = 4'b0010;
#10
request = 4'b0000;
#100;
$stop;
end
endmodule


六、仿真分析


5134f3a9f345474fb745185bbf029e40.png

仿真后的grant值为所需输出值,0001,0100,0010,0000符合下面的预期,证明设计正确。

image.png

相关文章
【期末不挂科-单片机考前速过系列P6】(第六章:10题速过定时计数器的结构和工作方式例题)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P6】(第六章:10题速过定时计数器的结构和工作方式例题)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P7】(第七章:11题速过串行口基本概念/结构/工作方式/双机通信例题)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P7】(第七章:11题速过串行口基本概念/结构/工作方式/双机通信例题)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P10】(第十章:11题中断系统的工作原理及应用)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P10】(第十章:11题中断系统的工作原理及应用)经典例题盘点(带图解析)
【数字IC手撕代码】Verilog小数分频|题目|原理|设计|仿真
【数字IC手撕代码】Verilog小数分频|题目|原理|设计|仿真
【数字IC手撕代码】Verilog小数分频|题目|原理|设计|仿真
|
自然语言处理 算法
【数字IC手撕代码】Verilog固定优先级仲裁器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog固定优先级仲裁器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog固定优先级仲裁器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog同步FIFO|题目|原理|设计|仿真
【数字IC手撕代码】Verilog同步FIFO|题目|原理|设计|仿真
【数字IC手撕代码】Verilog同步FIFO|题目|原理|设计|仿真
【数字IC手撕代码】Verilog异步复位同步释放|题目|原理|设计|仿真
【数字IC手撕代码】Verilog异步复位同步释放|题目|原理|设计|仿真
【数字IC手撕代码】Verilog异步复位同步释放|题目|原理|设计|仿真
【数字IC手撕代码】Verilog自动售卖饮料机|题目|原理|设计|仿真
【数字IC手撕代码】Verilog自动售卖饮料机|题目|原理|设计|仿真
【数字IC手撕代码】Verilog自动售卖饮料机|题目|原理|设计|仿真
【数字IC手撕代码】Verilog奇偶校验|题目|原理|设计|仿真
【数字IC手撕代码】Verilog奇偶校验|题目|原理|设计|仿真
【数字IC手撕代码】Verilog奇偶校验|题目|原理|设计|仿真
【数字IC手撕代码】Verilog无毛刺时钟切换电路|题目|原理|设计|仿真
【数字IC手撕代码】Verilog无毛刺时钟切换电路|题目|原理|设计|仿真
【数字IC手撕代码】Verilog无毛刺时钟切换电路|题目|原理|设计|仿真