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

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

3天内不再提示

如何设计参数化数据选择器

FPGA自习室 来源:FPGA自习室 作者:FPGA自习室 2022-03-30 14:15 次阅读

需求:

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 @(*)begincasez(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;     endcaseend

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

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

19f53488-aff0-11ec-aa7f-dac502259ad0.png

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

1a0903a0-aff0-11ec-aa7f-dac502259ad0.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            for(j=0;j                dat[j] = din[j*DATA_SIZE+i];            end            mux_prio[i] = mux_prio_bit(dat,sel_prio(sel));        end    endendfunctionfunction [NUM-1:0] sel_prio ;    input [NUM-1:0] sel;    reg temp;    integer i,j;    begin        sel_prio[0] = sel[0];        for(i=1;i            begin                temp = 0;                for(j=0;j                    begin                        temp = temp | sel[j];                    end                sel_prio[i] = sel[i] && !temp;            end        endendfunctionfunctionmux_prio_bit;    input  [NUM-1:0]  din;    input  [NUM-1:0]  sel;    integer i;    begin        mux_prio_bit = din[0]&&sel[0];        for(i=1;i            mux_prio_bit = mux_prio_bit | (din[i]&sel[i]);        endendfunctionendmodule

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

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

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            if(temp && sel[i])begin                temp = 0;                mux_prio_a = din[i*DATA_SIZE+:DATA_SIZE];            end        end    endendfunctionendmodule

总结:

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

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

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


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

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

审核编辑:彭菁

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

    关注

    1603

    文章

    21331

    浏览量

    593307
  • 数据选择器
    +关注

    关注

    2

    文章

    114

    浏览量

    16333
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48637

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

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

收藏 人收藏

    评论

    相关推荐

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

    在FPGA设计中,大部分情况下我们都得使用到数据选择器。并且为了设计参数化,可调,通常情况下我们需要一个参数可调的数据
    的头像 发表于 11-20 10:27 570次阅读
    如何设计一个<b class='flag-5'>参数</b>化的<b class='flag-5'>数据</b><b class='flag-5'>选择器</b>

    8.5.1数据选择器介绍(1)#硬声创作季

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

    8.5.1数据选择器介绍(2)#硬声创作季

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

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

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

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

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

    9.7 数据选择器数据分配器-视频(1)#硬声创作季

    数据选择器
    学习硬声知识
    发布于 :2022年12月03日 17:09:32

    9.7 数据选择器数据分配器-视频(2)#硬声创作季

    数据选择器
    学习硬声知识
    发布于 :2022年12月03日 17:10:18

    数据选择器(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

    如何设计32选1数据选择器

    利用3-8译码,4-1数据选择器等芯片再配合各种门电路设计
    发表于 04-18 09:49

    译码器、数据选择器及应用

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

    数据选择器

    数据选择器     一、 实验目的     1. 掌握MSI组合逻辑电路数据选择器的实验分析方法。 &nbs
    发表于 03-28 09:55 3844次阅读

    二选一数据选择器的系统设计框架图分析

    数据选择器是指经过选择,把多个通道的数据传送到唯一的公共数据通道上去,实现数据
    的头像 发表于 11-20 07:10 1.2w次阅读

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

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