首页 > 其他分享 >写Verilog通用模块的小技巧----持续更新

写Verilog通用模块的小技巧----持续更新

时间:2023-08-20 18:34:11浏览次数:41  
标签:begin 通用 代码 ---- WIDTH Verilog 模块 log2 data

  在编写代码为了能够方便移植或者说为了一劳永逸,往往会考虑把模块代码写得更加的通用。比如可以进行传参配置,这里主要是通过位宽传参。笔者写过不少的代码,觉得写通用模块代码需要思考挺长的时间去处理数据赋值之类的,需要总结出公式才能使代码通用,为了方便查找,这里就总结下笔者常用到的一些写法,大部分的通用代码都使用了for循环进行遍历。

  1.位宽计数

  在节省资源的情况下会使用,能够精准计算出当前计数器需要的位宽,或者FIFO的位宽。不过这也只能对parameter或者localparam参数进行计算,否则vivado貌似会编译不过。这里把功能封装成一个函数,纯组合逻辑实现。功能就是计算当前数值需要的位宽,就是log2。假设要算DATA_WIDTH= 10;则log2(DATA_WIDTH)结果就为4。

1     function integer log2;
2         input    [WIDTH-1:0]    i_data;
3         begin
4             for(log2 = 0; i_data >0; log2 = log2 + 1)
5             begin
6                 i_data = i_data >> 1;
7             end
8         end
9     endfunction

  2.通用的译码器编码器

  正常译码解码器会使用case,这样就能够遍历所有情况。不过case没办法对通用的情况进行赋值。

  2.1编码:

1 integer        i;
2 always@(*)
3 begin
4     for(i = 0; i <= WIDTH - 1; i = i + 1)//WIDTH是i_din位宽
5     begin
6         if(i_din[i])
7             o_encode = i;                 //o_encode位宽是2^(WIDTH-1)
8     end
9 end

  例如3-8译码以下是网上其他博主写的代码截图,笔者的编码器把对应的位宽传进去,再把判断条件改成if(i_din[i] == 0)即可。

   2.2 解码:

 1 integer        j;
 2 always@(*)
 3 begin
 4     o_decode = 'd0;
 5     for(j = 0; j <= WIDTH - 1; j = j + 1)//WIDTH是i_din位宽
 6     begin
 7         if(i_din == j)
 8             o_decode[j] = 1'b1;             //o_decode位宽是log2(WIDTH)
 9     end
10 end

  例如3-8译码以下是网上其他博主写的代码截图

标签:begin,通用,代码,----,WIDTH,Verilog,模块,log2,data
From: https://www.cnblogs.com/WenGalois123/p/17644269.html

相关文章

  • 扩展欧几里得算法
    裴蜀定理对于任意正整数\(a,b\),记\(g=(a,b)\),一定存在整数\(x,y\),使得\(ax+by=g\),且能凑出的数一定是\(g\)的倍数。首先由于\(a,b\)都是\(g\)的倍数,所以能凑出的数必定是\(g\)的倍数。关键在于怎么证明一定存在整数\(x,y\),使得\(ax+by=g\)。下面我们就抛出这个......
  • 如何解决docker 一直转圈圈而不start
    今天在进行启动docker的时候出现了一直转圈圈而不能启动的问题我的电脑是windows10,解决步骤是:首先右击右下角任务栏中的小图标docker,有个Switchtowindowscontainers选择后,打开WindowsPowerShell以管理员的身份运行然后输入Enable-WindowsOptionalFeature-Online-Feat......
  • 分布式布隆过滤器
    1.分布式布隆过滤器的价值集群环境太浪费系统资源、集群环境也不容易对布隆过滤器进行维护,所以采用Redisson框架的分布式布隆过滤器。2.Redisson提供的分布式布隆过滤器的使用//获取一个分布式的布隆过滤器(RedissonClient)RBloomFilter<V>getBloomFilter(Stringname);......
  • 多仓库手机端erp进销存pc/h5开源版开发
    多仓库手机端erp进销存pc/h5开源版开发以下是多仓库手机端ERP进销存PC/H5的功能列表:仓库管理:包括仓库的新增、编辑、删除、查询等功能,可以管理多个仓库的库存情况。商品管理:可以对商品进行新增、编辑、删除、查询等操作,包括商品的基本信息、库存信息、价格信息等。进货管理:可以进......
  • 设备管理
    1.路由器的内部组件处理器、存储器2.常见的存储器1>RAM:随机访问储存器2>ROM:只读内存3>Flash:闪存4>NVRAM:非易失性随机访问存储器3.路由器的启动过程1>加电自检并装载引导代码2>发现和装载IOS软件3>发现和应用配置文件或进入Setup模式4.常见基础命令:1>show running-config ......
  • link.ld手册备份
    设定入口点在程序中执行的第一条指令称为入口点。您可以使用ENTRY链接器脚本命令来设置入口点。ENTRY(symbol)也可以通过其它方式设定入口点:‘-e’输入命令行选项;‘.text’部段的第一个字节的地址;其它命令命令1部分INCLUDEfilenameINPUT(file,file,…)/......
  • 无涯教程-PHP - 简介
    PHP(全称:PHP:HypertextPreprocessor,即“PHP:超文本预处理器”)是一种开源的通用计算机脚本语言,尤其适用于网络开发并可嵌入HTML中使用。PHP的语法借鉴吸收C语言、Java和Perl等流行计算机语言的特点,易于一般程序员学习。PHP的主要目标是允许网络开发人员快速编写动态页面,但PHP也......
  • 网站老域名跳转到新域名有哪些方法?内网穿透内网主机让外网访问
    在网站服务器变更及本地主机搭建时,我们经常会遇到老域名地址跳转到新URL的配置,一些朋友还会面对无公网IP让外网访问的问题。今天我们来了解下网站老域名跳转到新域名有哪些方法,以及如何通过内网穿透实现内网主机让外网访问。网站老域名跳转到新域名有哪些方法?1.域名解析URL转跳。可......
  • 蠕虫bd应急响应
    0x00前言勒bd,是一种新型电脑bd,主要以邮件、程序webshell、网页挂马的形式进行传播。该bd性质恶劣、危害极大,一旦感染将给用户带来无法估量的损失。这种bd利用各种加密算法对文件进行加密,被感染者一般无法解密,必须拿到解密的私钥才有可能解开。自WannaCry勒索bd在全球爆发之后,各种......
  • sql执行异常怎样捕获
    在处理SQL执行异常时,可以使用try-catch块来捕获和处理异常。具体步骤如下:在执行SQL语句的代码块前添加try关键字,然后将可能引发异常的代码放在try块内。使用catch块捕获异常,并在catch块中处理异常情况。下面是一个示例代码片段,展示了如何捕获和处理SQL执行异常:impo......