0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何设计一个参数化的数据选择器

ZYNQ 来源:ZYNQ 2023-11-20 10:27 次阅读

需求:

FPGA设计中,大部分情况下我们都得使用到数据选择器。并且为了设计参数化,可调,通常情况下我们需要一个参数可调的数据选择器,比如M选1,M是可调的参数。

如果,数据选择器是不带优先级的,我们可以使用verilog VHDL中的二维数组进行设计 例如,这样综合编译器也是可以正确生成对应的电路。

reg[7:0]din[1:0];
assign dout = din[sel];

当我们,需要设计一个参数化的数据选择器时呢?我们该如何设计呢?以下罗列三种实现方式

方式一:嵌套if来实现:

假设我们的多路选择器,在某些情况下最多位M路,那么我们可以嵌套M个if,这样,我们就设计出了参数可调 2~M的多路选择器。

always@(*)begin
    if(sel[0])//1
        dout = din[0*DATA_SIZE+:DATA_SIZE];
    else if(sel[1])//2
        dout = din[1*DATA_SIZE+:DATA_SIZE];
    else if(sel[2])//3
        dout = din[2*DATA_SIZE+:DATA_SIZE];
    else if(sel[3])//4
        dout = din[3*DATA_SIZE+:DATA_SIZE];
    else if(sel[4])//5
        dout = din[4*DATA_SIZE+:DATA_SIZE];
    else if(sel[5])//6
        dout = din[5*DATA_SIZE+:DATA_SIZE];
    else if(sel[6])//7
        dout = din[6*DATA_SIZE+:DATA_SIZE];
    else if(sel[7])//8
        dout = din[7*DATA_SIZE+:DATA_SIZE];
    else//0
        dout = 0;
en

方式二:casez实现:

always @(*)begin
casez(sel)
8'b0000_0001:dout=din[0*DATA_SIZE+:DATA_SIZE];
8'b0000_001?:dout=din[1*DATA_SIZE+:DATA_SIZE];
8'b0000_01??:dout=din[2*DATA_SIZE+:DATA_SIZE];
8'b0000_1???:dout=din[3*DATA_SIZE+:DATA_SIZE];
8'b0001_????:dout=din[4*DATA_SIZE+:DATA_SIZE];
8'b001?_????:dout=din[5*DATA_SIZE+:DATA_SIZE];
8'b01??_????:dout=din[6*DATA_SIZE+:DATA_SIZE];
8'b1???_????:dout=din[7*DATA_SIZE+:DATA_SIZE];
default:dout=0;
     endcase
end

方式三:采用与门或门搭建。

比如一个二选一的数据选择器应该,这样一个结构:

7ab09c6c-8745-11ee-939d-92fbcf53809c.png

一个三选一,带优先级的电路结构:

7abdaef2-8745-11ee-939d-92fbcf53809c.png

也就是说,我们可以通过代码,描述出这样一个电路结构,通过逻辑复制的语句完成参数化的设计。

具体思路是这样的,先把地址信号sel 变成只是优先级高的那位为1,其他信号为0。例如,低位高优先级,sel=1100,变换后sel_prio=0100。然后,将sel_prio与上对应的数据,可以看出来只有1的那个数据才会被选通,其他为0

module mux
#(
    parameter DATA_SIZE = 8,
    parameter NUM  = 8
)
(
    input  [NUM*DATA_SIZE-1:0]  din,
input[NUM-1:0]sel,
output[DATA_SIZE-1:0]dout
);


assigndout=mux_prio(din,sel);
function[DATA_SIZE-1:0]mux_prio;
    input  [NUM*DATA_SIZE-1:0]  din;
    input  [NUM-1:0]        sel;
    
    reg [NUM-1:0] dat;
    integer i,j;
    begin
        for(i=0;i

方式四:基于行为级描述。

在前面的设计中我们是根据数据选择器的电路结构,用硬件语言描述出了这样的电路,那么我们能不能只描述其功能,然后让编译器帮我们理解呢?

module mux
#(
    parameter DATA_SIZE = 8,
    parameter NUM  = 8
)
(
    input  [NUM*DATA_SIZE-1:0]  din,
    input  [NUM-1:0]            sel,
    
    output  [DATA_SIZE-1:0]      dout
    
);
assign dout = mux_prio_a(din,sel);
//基于功能,行为级的描述
function  [DATA_SIZE-1:0]      mux_prio_a ;
    input  [NUM*DATA_SIZE-1:0]  din;
    input  [NUM-1:0]        sel;
    reg temp;
    integer i;
    begin
        temp = 1;
        mux_prio_a = 0;
        for(i=0;i

总结:

1、首先,这里提供了了四种描述参数可配的带优先级的多路选择器的描述方法。第一种和第二种是常规的描述方法推荐if-else结构,第三种是根据电路结构使用HDL描述,第四种是使用代码描述了其功能。

2、第三种方法从功能描述,看起来描述简单,好理解,不过这样的描述方式是看综合软件的“智能化程度”的,因为FPGA是基于查找表LUT结构的,这样的描述方式在描述比较简单的电路功能,综合器是可以正确理解的。如果比较复杂的电路,不推荐用这样的描述方式。

3、值得注意的是,FPGA设计最重要的是理解低层的电路结构,实现过程最好是 功能--》电路--》HDL描述该电路,这才是最好的设计。使用类似第三种描述方式最好还是掌握理解底层电路结构,然后看综合出来的是不是你需要的电路

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA设计
    +关注

    关注

    9

    文章

    428

    浏览量

    26470
  • Verilog
    +关注

    关注

    28

    文章

    1343

    浏览量

    109939
  • 数据选择器
    +关注

    关注

    2

    文章

    116

    浏览量

    16421
  • 编译器
    +关注

    关注

    1

    文章

    1617

    浏览量

    49021

原文标题:Verilog实现可参数化的带优先级的数据选择器

文章出处:【微信号:ZYNQ,微信公众号:ZYNQ】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    8.5.2数据选择器的应用(1)#硬声创作季

    数据选择器
    学习硬声知识
    发布于 :2022年12月03日 16:30:13

    8.5.2数据选择器的应用(2)#硬声创作季

    数据选择器
    学习硬声知识
    发布于 :2022年12月03日 16:31:02

    数据选择器(MUX,Multiplexer)

    数据选择器(MUX,Multiplexer)1.  数据选择器的构成2.  数据选择
    发表于 10-20 09:42

    数据选择器

    浮尘的天气,风大到可以吹走人了。空中也有不少小沙子和泥土,只能减少外出了。今天咱们来看看数据选择器,本来想分享模拟开关的,时找不全相关知识。还是来看看数据
    发表于 05-30 17:38

    关于数据选择器的问题。

    我给4选1数据选择器的输入端C3 C2 C1 C0分别输入 4V 3V 2V 1V的电压,选择端给1V和0.1V的电压,按理说根据数据选择器
    发表于 12-10 10:52

    译码数据选择器及应用

      译码数据选择器及应用  
    发表于 12-20 23:13 84次下载

    数据选择器

    数据选择器     、 实验目的     1. 掌握MSI组合逻辑电路数据选择器
    发表于 03-28 09:55 3963次阅读

    数据选择器

    数据选择器 数据选择器的定义及功能   数据选择
    发表于 04-07 10:27 2w次阅读
    <b class='flag-5'>数据</b><b class='flag-5'>选择器</b>

    数据选择器的定义及功能

    数据选择器的定义及功能   数据选择是指经过选择,把多个通道的数据传送到唯
    发表于 04-07 10:29 2.2w次阅读
    <b class='flag-5'>数据</b><b class='flag-5'>选择器</b>的定义及功能

    jquery选择器的实现原理(jquery选择器总结)

    jquery原型里面有init初始的方法,将传入的值进行解析,比如传入的id还是class还是标签名。然后通过相应的方法返回数组型对象。既可以通过对象直接调用方法,也可以使用数组的length。jQuery 的
    发表于 12-03 10:10 2678次阅读
    jquery<b class='flag-5'>选择器</b>的实现原理(jquery<b class='flag-5'>选择器</b>总结)

    FPGA学习系列:二选一数据选择器的设计

    常重要,在 FPGA内部的逻辑实现中都是通过数据选择器实现的, 数据选择器的应用使我们的代码和设计更加人性,多元
    的头像 发表于 05-31 11:40 3.2w次阅读
    FPGA学习系列:二选<b class='flag-5'>一数据</b><b class='flag-5'>选择器</b>的设计

    什么是选择器 CSS选择器有哪些

    什么是选择器呢?每条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/code] 在{}之前的部分就是“选择器”。 “选择
    的头像 发表于 07-31 15:31 7413次阅读

    如何设计参数数据选择器

    在FPGA设计中,大部分情况下我们都得使用到数据选择器。并且为了设计参数,可调,通常情况下我们需要
    的头像 发表于 03-30 14:15 2712次阅读

    数据选择器是组合逻辑电路吗

    数据选择器(Data Selector)是种常见的组合逻辑电路,用于根据输入的选择信号,从多个输入信号中选择
    的头像 发表于 08-01 14:28 384次阅读

    数据选择器是时序逻辑电路吗

    数据选择器(Data Selector)是种数字电路,用于从多个输入信号中选择或多个信号,
    的头像 发表于 08-01 14:39 493次阅读