当前位置: 首页 > news >正文

循环优先级仲裁~位屏蔽仲裁算法

参考了FPGA奇哥(下列视频中UP主)的讲解。

        应该可以对多路读写DDR3进行操作,仅仲裁,不涉及DMA和Uibuf等。

2023年11月所写,暂未进行测试,日后补上。

第二天已完成测试,功能可行。

深入FPGA底层设计系列-循环优先级仲裁器算法:位屏蔽仲裁算法与Verilog代码编写_哔哩哔哩_bilibili

位屏蔽算法:

        描述:对输入的多通道请求进行仲裁。

        步骤:

        (1)原码减去对应位数(优先级最高的位次)

        (2)求得(1)中输出的反码

        (3)通过(2)中输出与原码进行相与,留下优先级最高的请求。 

举例:

        【1】

        四通道输入请求,ABCD。破解后为:4‘b1000,此时D通道优先级最高。

        4'b1000-4’b1 =4'b0111 ~4'b0111 = 4'b1000

        1000 & 1000 == 1000

        仲裁完成,准许A通道请求。 

        【2】

          四通道输入请求,ABCD。破解后为:4‘b1110,此时B通道优先级最高。

        1110 - 0100 = 1010

        ~1010 = 0101

        1110 & 0101 = 0100

        仲裁完成,准许B通道请求。 

Trick:

        此外,为了仲裁A通道,需要对输入的请求进行拼接操作,实现向高位借位的过程。

        每次完仲裁以后,都需要改变优先级最高的那一位的位次,完成循环。

自写代码参考:

module Fast_Aritbier_LoopPrior #(parameter In_Channel_Num = 8
)(input   wire                            Aritbier_Clk    ,input   wire                            Aritbier_Rst_n  ,input   wire    [In_Channel_Num-1:0]    I_req           ,input   wire                            I_Busy          ,output  wire    [In_Channel_Num-1:0]    O_Aritbier_Req 
);//Aritbier Valuereg             Aritbier_Value      ;//Aritbier Flagwire            Aritbier_Begin      ;reg             Aritbier_Flag       ;reg     [3:0]   Aritbier_Flag_delay ; //Busyreg             I_Busy_0;reg             I_Busy_1;//reqreg     [(In_Channel_Num<<1)-1:0]   I_req_Double    ;reg     [In_Channel_Num-1:0]        r_O_Aritbier_Req;assign  Aritbier_Begin = |I_req;assign  O_Aritbier_Req = r_O_Aritbier_Req;assign  I_req_Double   = {I_req,I_req};always @(posedge Aritbier_Clk) begin{I_Busy_0, I_Busy_1} <= {I_Busy,I_Busy_0};end//Aritbier_Flagalways @(posedge Aritbier_Clk or negedge Aritbier_Rst_n) beginif(Aritbier_Rst_n == 'd0) beginAritbier_Flag <= 1'b0;end else if(Aritbier_Begin == 1'b1 && Aritbier_Flag == 1'b0) beginAritbier_Flag <= 1'b1;end else if(!I_Busy_0 && I_Busy_1) beginAritbier_Flag <= 1'b0;endendalways @(posedge Aritbier_Clk) beginAritbier_Flag_delay <= {Aritbier_Flag_delay[2:0],Aritbier_Flag};endalways @(posedge Aritbier_Clk or negedge Aritbier_Rst_n) beginif(Aritbier_Rst_n == 'd0) beginAritbier_Value <= {{(In_Channel_Num - 1){1'b0}},1'b1};end else if((!I_Busy_0 && I_Busy_1) && Aritbier_Value[In_Channel_Num - 1] == 1'b1) beginAritbier_Value <= {{(In_Channel_Num - 1){1'b0}},1'b1};end else if(!I_Busy_0 && I_Busy_1)  beginAritbier_Value <= Aritbier_Value << 1;end else beginAritbier_Value <= Aritbier_Value;endendalways @(posedge Aritbier_Clk or negedge Aritbier_Rst_n) beginif(Aritbier_Rst_n == 'd0) beginr_O_Aritbier_Req <= {(In_Channel_Num){1'b0}};end else if(Aritbier_Flag == 1'b1 && Aritbier_Flag_delay[0] == 1'b0) beginr_O_Aritbier_Req <= ((~(I_req_Double - {(In_Channel_Num){1'b0},Aritbier_Value}))&I_req);endend
endmodule

http://www.lryc.cn/news/234189.html

相关文章:

  • 千年版本修改小技巧
  • 教学过程中可以实施哪些考核评价方式?
  • MyBatis查询数据库(全是精髓)
  • elementPlus+vue3引入icon图标
  • Spring框架中的bean管理(XML和注解及属性的注入)
  • MySQL 存储过程提高数据库效率和可维护性
  • JAXB的XmlElement注解
  • 竞赛选题 深度学习驾驶行为状态检测系统(疲劳 抽烟 喝水 玩手机) - opencv python
  • 59 权限提升-Win溢出漏洞及ATSCPS提权
  • 【新闻稿】Solv 与 zCloak 联合开发跨境贸易场景下可编程数字凭证项目,获得新加坡、加纳两国央行支持...
  • requests库进行爬虫ip请求时遇到的错误解决方法
  • 目标检测—YOLO系列(二 ) 全面解读论文与复现代码YOLOv1 PyTorch
  • Redis维护缓存的方案选择
  • LeetCode236. Lowest Common Ancestor of a Binary Tree
  • 基于Gin+Gorm框架搭建MVC模式的Go语言企业级后端系统
  • 【开源】基于Vue和SpringBoot的固始鹅块销售系统
  • Windows11怎样投屏到电视上?
  • ubuntu中用docker部署jenkins,并和码云实现自动化部署
  • for,while,do-while,死循环,嵌套循环,跳转关键字,随机数
  • 【六袆 - MySQL】SQL优化;Explain SQL执行计划分析;
  • 【AI视野·今日NLP 自然语言处理论文速览 第六十二期】Wed, 25 Oct 2023
  • 各种符号地址,可以直接复制粘贴使用
  • C语言测试题:用冒泡法对输入的10个字符由小到大排序 ,要求数组做为函数参数。
  • uni-app开发微信小程序 vue3写法添加pinia
  • centos三台主机配置互信ssh登录
  • 验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
  • js/jQuery 的一些常用操作(js/jQuery获取表单元素值 以及 清空元素值的各种实现方式)——附测试例子,拿来即能实现效果
  • h5(react ts 适配)
  • 计算机视觉:驾驶员疲劳检测
  • Vue向pdf文件中添加二维码