码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【数字IC手撕代码】Verilog轮询仲裁器|题目|原理|设计|仿真


    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球
    四社区联合力荐!近500篇数字IC精品文章收录!
    【数字IC精品文章收录】学习路线·基础知识·总线·脚本语言·芯片求职·EDA工具·低功耗设计Verilog·STA·设计·验证·FPGA·架构·AMBA·书籍

    在这里插入图片描述

    Verilog固定优先级仲裁器

      • 一、前言
      • 二、题目
      • 三、原理
      • 四、RTL设计
      • 五、Testbench仿真
      • 六、仿真分析

    一、前言

    本系列旨在提供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),从左边相邻位至最高位,优先级依次降低,回旋至最低位,此为轮询算法,举例如下:

    周期请求情况(request)优先级排序响应情况(grant)
    1101032100010(B)
    2000110320001(A)
    3111121030010(B)
    4101110321000(D)

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

    端口类型名称
    inputclk
    inputrst_n
    input[3:0]request
    output[3:0]grant

    三、原理

    为了解释轮询仲裁其的设计思路,我们首先需要注意的是,针对于固定优先级的仲裁器,纯组合逻辑电路就可以完成功能,而针对于轮询仲裁器而言,我们需要引入时钟信号了,即时序逻辑电路的部分,这是因为,此时的优先级排序,不仅与初态有关,也与前一个状态的响应有关(前后状态相互影响,即时序电路,引入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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    五、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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    六、仿真分析

    在这里插入图片描述
    仿真后的grant值为所需输出值,0001,0100,0010,0000符合下面的预期,证明设计正确。

    复位后的周期request优先级排序相应情况
    1110132100001
    2010121030100
    3001003210010
    4000010320000
  • 相关阅读:
    【Vue-Element-Admin】table排序
    笔试强训第十九天 (最长公共子串+汽水瓶)
    ffplay源码之serial变量
    《Java基础知识》Java transient关键字详解
    【Flutter组件】路由与导航
    Linux操作系统的基础IO
    Kubernetes Dashboard部署ImagePullBackOff问题处理
    猫头虎分享已解决Bug || SyntaxError: Unexpected token < in JSON at position 0
    低代码平台 JNPF快速开发平台 框架源码
    Mac搭建Java开发环境最佳指南
  • 原文地址:https://blog.csdn.net/weixin_43698385/article/details/126112076
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号