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

    文章

    425

    浏览量

    26273
  • Verilog
    +关注

    关注

    28

    文章

    1326

    浏览量

    109302
  • 数据选择器
    +关注

    关注

    2

    文章

    114

    浏览量

    16332
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48617

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

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

收藏 人收藏

    评论

    相关推荐

    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

    EDA四选多路选择器的设计

    多路选择器(又称为数据选择器)①功能在选择变量控制下,从多路输入数据中选中某一路数据送至输出端。
    发表于 04-12 09:17

    熟悉中规模集成电路数据选择器的工作原理和逻辑功能

    中规模集成电路加法器的工作原理及其逻辑功能。二、 实验原理① 数据选择器数据选择器又称多路选择器,是
    发表于 07-29 07:53

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

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

    基于FPGA的多路选择器设计(附代码)

    开关。 · 二选多路选择器 二选多路选择器数据输入有两,分别为dataa和datab。
    发表于 03-01 17:10

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

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

    如何设计参数数据选择器

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