数字IC前端学习笔记:仲裁轮询(三)

这篇具有很好参考价值的文章主要介绍了数字IC前端学习笔记:仲裁轮询(三)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

相关文章

数字IC前端专栏https://blog.csdn.net/weixin_45791458/category_12173698.html?spm=1001.2014.3001.5482


5.无死周期的公平轮询

        在前面公平轮询仲裁器的Verilog RTL代码中,每个用户有三个信号:request(请求)、grant(授权)、end_access(结束访问)。在总线使用时,我们能观察到总线上存在不能进行数据传输的死周期。当传输的数据包较长或每个突发较长时,其对传输效率影响不大。然而,当数据包很短时,死周期会影响到总线的使用效率。如下图所示为没有间隔的公平轮询仲裁波形。下面给出了一些方法,用于减少甚至消除死周期。

数字IC前端学习笔记:仲裁轮询(三),数字IC前端,前端,硬件工程,fpga开发,数字IC,Verilog HDL

  • 第一种方案是当grant信号有效时,该用户的第一个数据已经准备好并且有效输出。原来的方案中,在用户的grant有效后,它在下一个周期输出数据,现在改为当grant采样为高时,在同一个周期就开始输出数据。此时需要用户提前从内部电路中读出第一个数据。采用这种方案时,仲裁器的设计不变,用户部分需要进行修改。
  • 第二种方法是增加额外的信号start_access,它和end_access一起使用。一个用户获得总线使用权并开始操作后,仲裁器通过将start_access置为有效表示开始新的仲裁过程,而不是等待end_access信号变高来开始新的仲裁过程,这样就减少了转换期间的死周期。当下一个用户被授权时,当前用户仍在使用总线,此时新的用户不能立即使用总线。仲裁器在当前用户完成操作时会给出end_access_out信号,新的授权用户此后就可以开始操作了。仲裁器在没有用户使用公共资源时,将resource_idle置为1。当resource_idle为1时,获得授权的用户不需要查看end_access_out信号就可以开始数据操作。

        没有死周期的公平轮询代码及仿真结果如下。

module arbiter_roundrobin(
            clk,resetb,
            req_vec,
            end_access_vec,
            gnt_vec,
            end_access_out);
    
    input clk, resetb;
    input [2:0] req_vec, end_access_vec;
    output [2:0] gnt_vec;
    output end_access_out;
    reg [1:0] arbiter_state, arbiter_state_nxt;
    reg [2:0] gnt_vec, gnt_vec_nxt;
    reg [2:0] relative_req_vec;
    wire any_req_asserted;
    reg [1:0] grant_posn, grant_posn_nxt;
    reg resource_idle_nxt, resource_idle;
    reg [2:0] start_access_vec, start_access_vec_nxt;
    parameter IDLE = 2'b00;
    parameter END_ACCESS = 2'b01;
    
    assign any_req_asserted = (req_vec != 0);
    assign end_access_out = |end_access_vec;
 
    always@(*) begin
        relative_req_vec = req_vec;
        case(grant_posn)
            2'd0: relative_req_vec = {req_vec[0], req_vec[2:1]};
            2'd1: relative_req_vec = {req_vec[1:0], req_vec[2]};
            2'd2: relative_req_vec = {req_vec[2:0]};
        endcase
    end
    always@(*) begin
        arbiter_state_nxt = arbiter_state;
        grant_posn_nxt = grant_posn;
        gnt_vec_nxt = gnt_vec;
        resource_idle_nxt = 1'b0;
        start_access_vec_nxt = 3'b0;
        case(arbiter_state)
            IDLE:begin
                    if(any_req_asserted)
                        arbiter_state_nxt = END_ACCESS;
                        resource_idle_nxt = 1'b1;
                    if(relative_req_vec[0])
                        case(grant_posn)
                            2'd0: begin gnt_vec_nxt = 3'b010; grant_posn_nxt = 3'd1; end
                            2'd1: begin gnt_vec_nxt = 3'b100; grant_posn_nxt = 3'd2; end
                            2'd2: begin gnt_vec_nxt = 3'b001; grant_posn_nxt = 3'd0; end
                        endcase
                    else if(relative_req_vec[1])
                        case(grant_posn)
                            2'd0: begin gnt_vec_nxt = 3'b100; grant_posn_nxt = 3'd2; end
                            2'd1: begin gnt_vec_nxt = 3'b001; grant_posn_nxt = 3'd0; end
                            2'd2: begin gnt_vec_nxt = 3'b010; grant_posn_nxt = 3'd1; end
                        endcase
                    else if(relative_req_vec[2])
                        case(grant_posn)
                            2'd0: begin gnt_vec_nxt = 3'b001; grant_posn_nxt = 3'd0; end
                            2'd1: begin gnt_vec_nxt = 3'b010; grant_posn_nxt = 3'd1; end
                            2'd2: begin gnt_vec_nxt = 3'b100; grant_posn_nxt = 3'd2; end
                        endcase
                    else
                        gnt_vec_nxt = 3'b000;
            end
            END_ACCESS:begin  
                if((resource_idle == 1'b1) || (end_access_out == 1'b1))
                    start_access_vec_nxt = gnt_vec;
                if(start_access_vec != 0)begin
                    if(relative_req_vec[0])
                        case(grant_posn)
                            2'd0: begin gnt_vec_nxt = 3'b010; grant_posn_nxt = 3'd1; end
                            2'd1: begin gnt_vec_nxt = 3'b100; grant_posn_nxt = 3'd2; end
                            2'd2: begin gnt_vec_nxt = 3'b001; grant_posn_nxt = 3'd0; end
                        endcase
                    else if(relative_req_vec[1])
                        case(grant_posn)
                            2'd0: begin gnt_vec_nxt = 3'b100; grant_posn_nxt = 3'd2; end
                            2'd1: begin gnt_vec_nxt = 3'b001; grant_posn_nxt = 3'd0; end
                            2'd2: begin gnt_vec_nxt = 3'b010; grant_posn_nxt = 3'd1; end
                        endcase
                    else if(relative_req_vec[2])
                        case(grant_posn)
                            2'd0: begin gnt_vec_nxt = 3'b001; grant_posn_nxt = 3'd0; end
                            2'd1: begin gnt_vec_nxt = 3'b010; grant_posn_nxt = 3'd1; end
                            2'd2: begin gnt_vec_nxt = 3'b100; grant_posn_nxt = 3'd2; end
                        endcase
                    else begin
                        gnt_vec_nxt = 3'b000;   
                        arbiter_state_nxt = IDLE;
                    end         
                end
            end
        endcase
    end
    
    always@(posedge clk or negedge resetb)begin
        if(!resetb) begin
            arbiter_state <= IDLE;
            gnt_vec <= 0;
            grant_posn <= 0;
            resource_idle <= 0;
            start_access_vec <= 0;
        end  
        else begin
            arbiter_state <= arbiter_state_nxt;
            gnt_vec <= gnt_vec_nxt;
            grant_posn <= grant_posn_nxt;
            resource_idle <= resource_idle_nxt;
            start_access_vec <= start_access_vec_nxt;
        end
    end
endmodule

        在Verilog实现过程中,使用了两个状态IDLE和END_ACCESS,分别表示仲裁器处于无请求和仲裁器授权的状态。在IDLE状态时,任何请求信号能使状态转移至END_ACCESS状态,并将resource_idle信号置1(这是为了IDLE状态下start_access的置位而设计的信号),并根据请求信号给出相应授权。在END_ACCESS状态,会根据resource_idle或end_access_out信号使用gnt_vec对start_access置位。当start_access信号有效时,根据请求信号进行下一次授权。若此时没有请求信号,则状态回到IDLE等待。

数字IC前端学习笔记:仲裁轮询(三),数字IC前端,前端,硬件工程,fpga开发,数字IC,Verilog HDL

数字IC前端学习笔记:仲裁轮询(四)https://mp.csdn.net/mp_blog/creation/editor/131376265

以上内容来源于《Verilog高级数字系统设计技术和实例分析》,有删改文章来源地址https://www.toymoban.com/news/detail-527558.html

到了这里,关于数字IC前端学习笔记:仲裁轮询(三)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • round robin arbiter 轮询仲裁器设计

    前言 仲裁器Arbiter 是数字设计中非常常见的模块,应用也非常广泛。定义就是当有两个或两个以上的模块 需要占用同一个资源 的时候,我们需要由仲裁器arbiter来决定哪一个模块来占有这个资源。一般来说,提出占有资源的模块要产生一个请求(request),所有的请求送给仲裁器

    2024年02月12日
    浏览(25)
  • IC设计----仲裁器

    #为了方便以后自己查询和复习,写了一个简短的总结;代码部分是参考其他博主 假设request低bit优先级更高,那么低位到高位,最先出现1的那一位被对应的request被grant,那问题就变成了如何从一个01串中寻找最先出现bit 为1的那一位,这里最经典的方法就是: equest和它的2的补

    2024年04月14日
    浏览(22)
  • 数字IC设计工程师是做什么的?

    随着我国半导体产业的发展,近几年的新入行的从业人员,除了微电子相关专业的,还有就是物理、机械、数学、计算机等专业,很多人对这一高薪行业充满了好奇,那么数字IC设计工程师到底是做什么的? 1、熟悉数字电路设计 2、熟悉Verilog或VHDL 3、熟悉异步电路设计; 4、

    2024年02月07日
    浏览(37)
  • 数字IC设计工程师一般都干什么

    简单来说,数字IC设计工程师一般就是负责写verilog代码(当然,不是仅仅写个代码)。本文主要对数字IC设计的工作流程进行简单的介绍,也算是对我从业一年来的总结。 一般来说,数字IC设计的工作流程如下: 算法文档学习(搞清楚你负责的功能):先由算法的同事给出详

    2024年02月05日
    浏览(36)
  • Verilog权重轮询仲裁器设计——Weighted Round Robin Arbiter

    前两篇讲了固定优先级仲裁器的设计、轮询仲裁器的设计 Verilog固定优先级仲裁器——Fixed Priority Arbiter_weixin_42330305的博客-CSDN博客 Verilog轮询仲裁器设计——Round Robin Arbiter_weixin_42330305的博客-CSDN博客 权重轮询仲裁器就是在轮询仲裁器的基础上,当grant次数等于weight时,再切换

    2024年02月14日
    浏览(30)
  • 【AHB接口协议】固定优先级和轮询仲裁器的Verilog实现

    目录 一、 实验目的 1 二、 实验工具及环境 1 三、 实验内容及步骤 1 1、 实验2.1:16位可参数化仲裁器的设计 1 (1)补码相与法 1 (2)可变参数设计 1 2、 实验2.2:AHB总线仲裁器的设计 2 (1)设计目标 2 (2)状态机实现 3 ①状态定义 3 ②增量控制寄存器cnt 4 ③轮询数计数器

    2024年02月10日
    浏览(31)
  • 数字IC前端设计流程及详细解释

    数字前端以设计架构为起点,以生成可以布局布线的网表为终点。 使用设计的电路实现想法,主要包括:基本的RTL编程和仿真。前端设计还可以包括 IC系统设计、前仿真波形验证、综合、STA、FM验证。其中 IC系统设计最难掌握,它需要多年的IC设计经验和熟悉那个应用领域,

    2024年02月06日
    浏览(34)
  • 数字IC实践项目(2)——高速SDRAM控制器的设计与综合(入门级工程项目)

    这个实践项目来源于研究生电子设计竞赛,在涉及到视频图像处理时需要用到DRAM存储数据 ;整个项目过程中先后学习了 小梅哥(AC620开发板资料) 、 开源骚客SDRAM控制器 、 正点原子FPGA教程 、 野火FPGA开发教程 等网络资料。 在此对上述提供学习资料的前辈表示真诚的感谢。

    2024年02月13日
    浏览(52)
  • Javaweb基础-前端工程化学习笔记

    变量与模版字符串 let 和var的差别: const和var的差异 1、新增const和let类似,只是const定义的变量不能修改 2、并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。 模板字符串(template string)是增强版的字符串,用反引号(`)标识 1、字符串中可以

    2024年02月20日
    浏览(40)
  • 数字IC学习01

    在正式开始前,我必须要交代一下,我写这些博客的原因:主要是想记录和梳理一下自己如何学习数字IC这个我也许余身都要从事的行业,如果能给读者带来帮助,那便是更好不过的事情了。 作为一个经历过千万人高考,百万人考研的人来说,学习并不是一件轻松的事,更可

    2024年02月03日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包