当前位置: 首页 > news >正文

Verilog的奇技淫巧[更新中]

1.Verilog常用的数据选择语句vect[a +: b]或vect [a -: b]

转载自:MDY常用的数据选择语句Verilog明德扬论坛 - Powered by Discuz!

vect为变量名字,a为起始位置,加号或者减号代表着升序或者降序,b是进行升序或者降序的宽度。

因此,vect[a +: b]等同于vect[a : a+b-1],vect [a -: b]等同于vect[a : a-b+1]

例如:

vect[7 +: 3]

其中,起始位置为7,+代表着升序,宽度为3。即从7开始往比7大的方向数3个数。其等价形式为:vect[7 +: 3]==vect[7 : 9]

vect[9 -: 4]

其中,起始位置为9,-代表着降序,宽度为4。即从9开始往比9小的方向数4个数。其等价形式为:vect[9 -: 4]==vect[9 : 6]

  • 关于片选的一些补充
    • 片选多个比特的正确语法有两种:
assign out = in[sel*4 +: 4];// 从 sel*4 开始,选择比特序号大于sel*4 的 4 位比特,相当于[sel*4+3:sel*4]
assign out = in[sel*4+3 -: 4];  // 从 sel*4+3 开始,选择比特序号小于 sel*4+3 的 4 位比特,相当于[sel*4+3:sel*4]
    但是assign out = in[ sel*4+3 : sel*4 ],这个表达式不符合 Verilog 片选操作符的语法。

2.integer变量不要放在for循环中,要提前定义integer变量。 

3.重复次数必须是一个常量,而且请特别注意重复操作符有两对 { }.外层的 {} 不能少。

    wire [24:0]in0 = {{5{a}},{5{b}},{5{c}},{5{d}},{5{e}}};
    wire [24:0]in1 = {{5{a,b,c,d,e}}};
    //类似这种,花括号也不能少

 4.模块信号连接的两种方式

一般都采用第二种,按端口名称连接模块信号

在实例化模块时,有两种常用的方式来进行模块端口的信号连接:按端口顺序以及按端口名称连接端口。

按端口顺序mod_a instance1 ( wa, wb, wc ); wa, wb, wc 分别连接到模块的 第一个端口(in1),第二个端口(in2)以及第三个端口(out)。这里所谓的端口顺序指的是模块端口的定义顺序。这种方式的弊端在于,一旦端口列表发生改变,所有模块实例化中的端口连接都需要改变。

按端口名称mod_a instance2 ( .out(wc), .in1(wa), .in2(wb) ); 在这种方式中根据端口名称指定外部信号的连接。这样一来就和端口声明的顺序完全没有关系。一旦模块出现改动,只要修改相应的部分即可。实际上,一般都使用这种方式来进行模块实例化。

在instance的时候,尽量每个端口对应一行,例如:

module top_module ( input a, input b, output out );
        mod_a U_mod_a(
          .in1(a)
        , .in2(b)
        , .out(out));
    //NVIDIA的开源代码就是这么写的
endmodule

5.卡诺图化简

(1)最大项和最小项

  • 最小项:n个变量的逻辑乘,即与形式,每个变量以原变量或者反变量的形式出现一次。n个变量共有2n个最小项。用m表示,如ABC,表示为m0。
  • 最大项:n个变量的逻辑和,即或形式,每个变量以原变量或者反变量的形式出现一次。n个变量共有2n个最大项。用M表示,如A+B+C,表示为M0。
  • 最小项的反是最大项,最大项的反是最小项。例如:~m0=~(~A&~B&~C)=A|B|C;

(2)卡诺图

  • 在这个方格图中,每一个方格代表逻辑函数的一个最小项,而且几何相邻(在几何位置上,上下或左右相邻)的小方格具有逻辑相邻性,即两相邻小方格所代表的最小项只有一个变量取值不同

  •  卡诺图一般用最小项之和表示,也可以用最大项之积表示

        例如

最小项表示:F = m1+m5

最大项就是:F = M0*M2*M3*M4*M6*M7

相关文章:

  • 被CTO推荐的SQL总结
  • 第八章 时序检查(下)
  • Android 10 低内存应用白名单和应用保活
  • 攻防演练中攻击队需要的安全技能第二篇
  • C#的File 类使用说明
  • 零基础能学大数据技术吗?学完能找到工作吗?
  • 实时即未来,车联网项目之远程诊断实时故障分析【七】
  • 《SpringBoot篇》10.JPQL超详细介绍与JPA命名规则
  • 【Android-实战】1、Room 使用 Flow 和 collect() 监听数据库的变化、动态更新页面
  • python字符串应用
  • asp.net高校网上评教信息系统VS开发sqlserver数据库web结构c#编程计算机网页项目
  • 暂退法dropout----详解与分析(多层感知机)
  • Android Tablayout样式修改
  • 朋友圈那位隐藏大佬的单片机学习心得
  • Android系统启动流程全解析--你知道Android系统启动都干了啥吗
  • $translatePartialLoader加载失败及解决方式
  • axios 和 cookie 的那些事
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Javascript设计模式学习之Observer(观察者)模式
  • Java深入 - 深入理解Java集合
  • log4j2输出到kafka
  • Shell编程
  • spring-boot List转Page
  • Vim 折腾记
  • 从零开始在ubuntu上搭建node开发环境
  • 多线程事务回滚
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 开源SQL-on-Hadoop系统一览
  • 前端学习笔记之观察者模式
  • 浅谈Golang中select的用法
  • 设计模式 开闭原则
  • 深入浅出Node.js
  • 使用docker-compose进行多节点部署
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 追踪解析 FutureTask 源码
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​linux启动进程的方式
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #13 yum、编译安装与sed命令的使用
  • #define,static,const,三种常量的区别
  • $$$$GB2312-80区位编码表$$$$
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (剑指Offer)面试题34:丑数
  • (转)scrum常见工具列表
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .axf 转化 .bin文件 的方法
  • .Net Core与存储过程(一)
  • .NET成年了,然后呢?
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .skip() 和 .only() 的使用