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

需求:
在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  
方式三:采用与门或门搭建。
比如一个二选一的数据选择器应该,这样一个结构:
一个三选一,带优先级的电路结构:
也就是说,我们可以通过代码,描述出这样一个电路结构,通过逻辑复制的语句完成参数化的设计。
具体思路是这样的,先把地址信号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);assign dout = 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描述该电路,这才是最好的设计。使用类似第三种描述方式最好还是掌握理解底层电路结构,然后看综合出来的是不是你需要的电路


超级电池是什么_超级电池的制造
长安汽车悦翔v7怎么样?配1.0T,油耗仅5L!售价5万起
低压进线断路器的设计选型
残酷春天里的中国科技(四):跨越地方保护主义 破除地方保护藩篱
控道智能在中国智能制造的发展
如何设计一个参数化的数据选择器
浅谈汇川技术通用型变频器MD600的核心散热技术
东方日升规划Titan系列3GW高效产能,三季度实现大规模出货
编程语言首推Python,掌握了Python就是掌握了未来
晶体管正确电压加载方法注意事项
零线滤波器哪个好一点?
为什么我的显示器上会出现模糊的水平线?
多家上市公司加速布局精密减速器,为什么“这块铁”成为机器人产业链中的香饽饽?
意法半导体开发出世界上最大的影像传感器
台积电董事长否认苹果削减 5nm A14 芯片代工订单
20nm高性能开发套件现已发售!
鸿蒙 TabList 配合 Fraction 实现顶部切换效果演示
同步加速器光源可用于新世代电池开发
新基建浪潮下,AI的下一次突破何时到来?
浅谈C语言与C++的前世今生