参数例化时自动计算位宽的解决办法
参数例化时自动计算位宽的解决办法作者:小黑同学本文为明德扬原创,转载请标明来源!在工程中,参数化设计是非常常见的。模块接口的位宽,常见的有8位、16位、32位、64位和128位等;虽然功能相同,仅因为位宽不同,就要另外写一个模块,那设计工作就很繁复了。为此,我们可以采用参数化来实现,即用parameter来定义常数。但是参数化会遇到一个问题,就是某些信号的位宽跟此参数有着密切的关系。例如,我们可以使用parameter来定义FIFO的深度,但是表示FIFO深度的信号usedw,其位宽是跟参数相关的。如果深度为512,usedw位宽是9位,如果深度为1024,其位宽是10位。这时如果此模块可以自己计算位宽那就再好不过了。 我这边会设计一个计算位宽的函数:clogb2,其代码如下:其实位宽的计算就是求以2为底的对数,那我们可以写一个实现此功能的函数。把这个函数命名为clogb2,输入的参数命名为depth,这个函数的输入输出都是整型的数据。当输入depth为0时,clogb2输出1,FPGA中最小的位宽就是1bit,一般这种情况就不需要定义位宽了,所以可能这个函数的输入就是0。如果depth不为0,那么如果depth不等于0,那么会让depth不断除以2,每除以2一次,clogb2就会自增1,直到depth除不动为止,这个时候clogb2输出的就是这个数以2为底的对数。
注意一下,该函数要求depth必须是2的N次方,否则会计算不正确。
下面我们以参数化FIFO来看一下。FIFO是我们工程中常用的IP核,但是可能在不同的模块代码中,需要用到FIFO的深度以及位宽都不一样,那是否需要每次都生成一个对应的IP核呢?其实使用ALTERA平台的话,是不需要的,这个完全可以通过参数化的方法来解决。如下图所示是一个已经生成的FIFO的文件,这里面我们把FIFO的深度以及输入输出的位宽参数化为DEPT_W和_DATA_W,而下面对应深度的位宽,我们则调用上面设计的函数clogb2来计算,注意这里需要先把这个函数的代码写进来。
那后面我用到这个FIFO的时候,就不需要重新生成了,这个文件也不需要改,如果FIFO的位宽以及深度需要改变的时候,我们只需要在例化此FIFO的时候,进行参数例化就可以了。例如我要例化的一个FIFO,输入输出位宽是36bit,深度是1024,那么只需要通过下面的写法,FIFO里面的DATA_W和DEPT_W这两参数就会变为36和1024,而深度对应的位宽又会被clogb2这个函数计算出来,完全不需要对FIFO的文件做什么修改。
上面例化的FIFO综合之后的结果如下图所示,可以看到数据的位宽,以及usedw的位宽已经发生了对应的改变。
下面将这个FIFO的输入输出位宽DATA_W例化为1bit,存储深度DEPT_W例化为32。
从下面综合之后的结果可以看出,输入输出位宽变为了1bit,usedw信号的位宽变为了5bit。
通过以上验证可以看出,这个自动计算位宽的函数可以解决我们参数化例化一些模块的时候位宽变化的问题。此FIFO代码可以免费分享给大家,需要的可以联系我qq:1817866119。
页:
[1]