ASIC-WORLD Verilog(5)基础语法下篇

news2024/11/25 0:22:24

写在前面

        在自己准备写一些简单的verilog教程之前,参考了许多资料----asic-world网站的这套verilog教程即是其一。这套教程写得极好,奈何没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。

        这是网站原文:http://asic-world.com/verilog/veritut.html

        这是系列导航:Verilog教程系列文章导航

模块(Modules)

  • 模块是verilog设计的基本组成形式
  • 你可以在模块中调用别的模块来实现层次化设计

        

        在下面的图片中可以看到:

  • 顶层模块分别由左、右上、右下三个子模块构成
  • 左边的模块由4个子模块组成;而右边的两个模块又分别由两个更小子模块组成

端口(Ports) 

  • 端口是不同模块间实现通讯的渠道
  • 除了顶层模块外的所有层级的模块都有端口(其实最顶层的模块也有端口,不过由于其一般连接到FPGA的管脚,所以一般叫Pins)
  • 端口间的例化有两种方式:顺序端口例化、命名端口例化

       

        像下面示例这种一行只声明一个端口的方式是个不错的编码习惯。

input              clk       ; // 时钟输入
input  [15:0]      data_in   ; // 16位数据输入总线
output [7:0]       count     ; // 8位计数器输出
inout              data_bi   ; // 双向数据总线

        下面请看一个全加器的示例代码:

//这是一个加法器示例
module addbit (
	a      , // 输入a
	b      , // 输入b
	ci     , // 进位输入
	sum    , // 加法结果输出
	co       // 进位输出
);

//输入声明
input a;
input b;
input ci;

//输出声明
output sum;
output co;

//端口的数据类型
wire  a;
wire  b;
wire  ci;
wire  sum;
wire  co;

//主代码部分
assign {co,sum} = a + b + ci;

endmodule // End of Module addbit

端口例化方法

        前面说了模块的例化有两种方法:顺序端口例化与命名端口例化。接下来分别看下这两种方法是如何使用的:

(1)顺序端口例化

        这种方法将需要例化的模块端口按照模块声明时端口的顺序与外部信号进行匹配连接,位置要严格保持一致。这种方法在增加或减少端口时会特别容易导致BUG,所以我个人不建议使用该方法。

        这是对上面提到的全加器模块的例化:

module adder_implicit (
result        , // Output of the adder
carry         , // Carry output of adder
r1            , // first input
r2            , // second input
ci              // carry input
);

// 输入端口声明      
input    [3:0]   r1         ;
input    [3:0]   r2         ;
input            ci         ;

// 输出端口声明
output   [3:0]  result      ;
output          carry       ;

// Wires端口
wire     [3:0]    r1        ;
wire     [3:0]    r2        ;
wire              ci        ;
wire     [3:0]    result    ;
wire              carry     ;

// 内部变量
wire              c1        ;
wire              c2        ;
wire              c3        ;

// 多次例化,按顺序
addbit u0 (
r1[0]           ,
r2[0]           ,
ci              ,
result[0]       ,
c1
);
//按顺序例化
addbit u1 (
r1[1]          ,
r2[1]          ,
c1             ,
result[1]      ,
c2
);
//按顺序例化
addbit u2 (
r1[2]          ,
r2[2]          ,
c2             ,
result[2]      ,
c3
);
//按顺序例化
addbit u3 (
r1[3]          ,
r2[3]          ,
c3             ,
result[3]      ,
carry
); 

endmodule // End Of Module adder 

(2)命名端口例化

        这种方法将需要例化的模块端口与外部信号按照其名字进行连接,端口顺序随意,可以与引用 module 的声明端口顺序不一致,只要保证端口名字与外部信号匹配即可。这种方法非常灵活,我个人强烈建议使用该方法。

        这是对上面提到的全加器模块的例化:

      

module adder_explicit (
	result        , // Output of the adder
	carry         , // Carry output of adder
	r1            , // first input
	r2            , // second input
	ci              // carry input
);

// 输入端口声明         
input    [3:0]   r1         ;
input    [3:0]   r2         ;
input            ci         ;

// 输出端口声明
output   [3:0]  result      ;
output          carry       ;

// Wires端口
wire     [3:0]    r1        ;
wire     [3:0]    r2        ;
wire              ci        ;
wire     [3:0]    result    ;
wire              carry     ;

// 内部变量
wire              c1        ;
wire              c2        ;
wire              c3        ;

// 多次例化,按对应名称
addbit u0 (
.a           (r1[0])        ,
.b           (r2[0])        ,
.ci          (ci)           ,
.sum         (result[0])    ,
.co          (c1)
);

addbit u1 (
.a           (r1[1])        ,
.b           (r2[1])        ,
.ci          (c1)           ,
.sum         (result[1])    ,
.co          (c2)
);

addbit u2 (
.a           (r1[2])        ,
.b           (r2[2])        ,
.ci          (c2)           ,
.sum         (result[2])    ,
.co          (c3)
);

addbit u3 (
.a           (r1[3])        ,
.b           (r2[3])        ,
.ci          (c3)           ,
.sum         (result[3])    ,
.co          (carry)
);

endmodule // End Of Module adder

端口连接规则

        Verilog中的端口连接规则是这样的:

  • 输入端口:内部必须是net,外部可以是net也可以是reg
  • 输出端口:内部可以是net也可以是reg,外部必须是net
  • 双向端口:内部和外部都只能是net
  • 位宽匹配:将位宽不同的内部和外部信号连接到一起是合法的。但是要注意,综合工具可能会报告警告或错误

  • 悬空端口:悬空端口可以使用","(顺序端口例化); 悬空端口也可以直接空着(命名端口例化)

        下面的例子展示了两种例化方法是如何处理悬空端口的:

module exam();
reg clk,d1,d2,rst,pre1,pre2;
wire q1,q2;

//顺序端口例化时,悬空的信号用","
dff u1 ( q1,,clk,d1,rst,pre1); 

//命名端口例化时,悬空的信号直接控制
dff u2 (  
	.q  	(q2),
	.d 		(d2),
	.clk 	(clk),
	.q_bar 	(),
	.rst 	(rst),
	.pre 	(pre2)
);

endmodule

// D fli-flop
module dff (q, q_bar, clk, d, rst, pre);
input clk, d, rst, pre;
output q, q_bar;
reg q;

assign q_bar = ~q;

always @ (posedge clk)
	if (rst == 1'b1) begin
	  q <= 0;
	end else if (pre == 1'b1) begin
	  q <= 1;
	end else begin
	  q <= d;
	end

endmodule

模块的层次结构

        由于模块之间具备的层次结构,所以可以使用名称索引的方式来找到不同模块的信号。

        示例:下面的adder_hier模块内4次调用了子模块addbit,将其分别例化为u0、u1、u2和u3。

module adder_hier (
	result        , // Output of the adder
	carry         , // Carry output of adder
	r1            , // first input
	r2            , // second input
	ci              // carry input
);

// Input Port Declarations       
input    [3:0]   r1         ;
input    [3:0]   r2         ;
input            ci         ;

// Output Port Declarations
output   [3:0]  result      ;
output          carry       ;

// Port Wires
wire     [3:0]    r1        ;
wire     [3:0]    r2        ;
wire              ci        ;
wire     [3:0]    result    ;
wire              carry     ;

// Internal variables
wire              c1        ;
wire              c2        ;
wire              c3        ;

// 调用addbit子模块
addbit u0 (r1[0],r2[0],ci,result[0],c1);
addbit u1 (r1[1],r2[1],c1,result[1],c2);
addbit u2 (r1[2],r2[2],c2,result[2],c3);
addbit u3 (r1[3],r2[3],c3,result[3],carry);

endmodule // End Of Module adder

        下面的代码展示了如何使用子模块内的信号:

module tb();

reg [3:0] r1,r2;
reg  ci;
wire [3:0] result;
wire  carry;

// Drive the inputs
initial begin
  r1 = 0;
  r2 = 0;
  ci = 0;
  #10 r1 = 10;
  #10 r2 = 2;
  #10 ci = 1;
  #10 $display("+--------------------------------------------------------+");
  $finish;
end

// Connect the lower module
adder_hier U (result,carry,r1,r2,ci);

// Hier demo here
initial begin
  $display("+--------------------------------------------------------+");
  $display("|  r1  |  r2  |  ci  | u0.sum | u1.sum | u2.sum | u3.sum |");
  $display("+--------------------------------------------------------+");
  $monitor("|  %h   |  %h   |  %h   |    %h    |   %h   |   %h    |   %h    |",
  r1,r2,ci, tb.U.u0.sum, tb.U.u1.sum, tb.U.u2.sum, tb.U.u3.sum); //这里分别展示了4个子模块的sum信号
end

endmodule

        代码中的   tb.U.u0.sum, tb.U.u1.sum, tb.U.u2.sum, tb.U.u3.sum  分别是4个子模块的内部信号sum,它们是不同的信号,只是名称相同。这种方法在调试时很有用。


  • 📣您有任何问题,都可以在评论区和我交流📃!
  • 📣本文由 孤独的单刀 原创,首发于CSDN平台🐵,博客主页:wuzhikai.blog.csdn.net
  • 📣您的支持是我持续创作的最大动力!如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/526285.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k8s中pod使用详解

一、前言 在之前k8s组件一篇中,我们谈到了pod这个组件,了解到pod是k8s中资源管理的最小单位,可以说Pod是整个k8s对外提供服务的最基础的个体,有必要对Pod做深入的学习和探究。 二、再看k8s架构图 为了加深对k8s中pod的理解,再来回顾下k8s的完整架构 三、pod特点 结合上面这…

YOLOv5算法原理与网络结构

YOLOv5算法原理与网络结构 1.1 YOLOv5算法 YOLOv5算法共有4种网络结构&#xff0c;分别是YOLOv5s、YOLOv5m、YOLOv5l和YOLOv5x&#xff0c;这四种网络结构在宽度和深度上不同&#xff0c;原理上基本一样&#xff0c;接下来以 YOLOv5s 为例介绍 YOLOv5网络结构。 图1 YOLOv5网…

基于Java+SpringBoot+Vue前后端分离手机销售商城系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

软件AutoID Network Navigator设置基恩士扫码枪的使用教程

AutoID Network Navigator可以用来对扫码枪的ip和各参数进行调整 1.设置前的准备 扫码枪的默认ip是192.168.100.1&#xff0c;所以需要先把电脑IP更改为192.168.100.xxx 2.搜索扫码枪 更改电脑IP后打开软件点击绿色的号 选择以太网 出现局域网设置弹窗&#xff0c;若为你设…

为什么说网络安全行业是 IT 行业最后的红利?

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护 2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来 3-5 年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏…

《汇编语言》- 读书笔记 - 第1章-基础知识

《汇编语言》- 读书笔记 - 第1章-基础知识 1.1 机器语言1.2 汇编语言的产生1.3 汇编语言的组成1.4 存储器1.5 指令和数据1.6 存储单元1.7 CPU对存储器的读写1.8 地址总线主流CPU的寻址能力 1.9 数据总线1.10 控制总线检测点 1.11.11 内存地址空间(概述)1.12 主板1.13 接口卡1.1…

【python基础教程】csv文件的写入与读取

✅作者简介&#xff1a;大家好我是hacker707,大家可以叫我hacker &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;python基础教程 &#x1f4ac;推荐一款模拟面试、刷题神器&#x1f449;点击跳转进入网站 csv文件读写 csv的简单介绍…

MAC怎么获取文件路径 MAC获取文件路径的四种方法

MAC怎么获取文件路径介绍 方法一&#xff1a;最简单的方法 右键文件或者文件夹&#xff0c;选择显示简介 2在弹出来的窗口中找到位置&#xff0c;即为路径&#xff0c;在mac 10.10之前的系统是正常的路径&#xff0c;10.10开始是小箭头代替/显示&#xff0c;注意&#xff0c…

Git操作不规范,战友提刀来相见。

年终奖都没了&#xff0c;还要扣我绩效&#xff0c;门都没有&#xff0c;哈哈。 这波骚Git操作我也是第一次用&#xff0c;担心闪了腰&#xff0c;所以不仅做了备份&#xff0c;也做了笔记&#xff0c;分享给大家。 文末留言抽奖&#xff0c;聊聊你的年终奖。 问题描述 小A和…

2023年最新Python安装详细教程

目录 一、python官网 二、在官网的Downloads栏目&#xff0c;选择对应的操作系统 三、进入windows对应的页面&#xff0c;选择python版本 (1)选择python的稳定发布版本Stable Releases (2)下载python的安装程序Windows Installer 四、运行安装python的安装程序Windows Install…

【郭东白架构课 模块二:创造价值】25|节点四:架构规划之需求确认

你好&#xff0c;我是郭东白。 上节课我们讲了架构规划这个环节的第一个部分&#xff0c;也就是统一语义。那么这节课我们就来讲第二个部分——需求确认。 需求确认与统一语义的过程是密不可分的。需求确认是在统一语义赋能之下进行的&#xff0c;所以两者并不是先后顺序的关系…

【模拟IC】MOM 电容 和 MIM 电容的简介与比较

文章目录 一、MIM和MOM电容简介1、MIM (Metal-Insulator-Metal)电容2、MOM(Metal-Oxide-Metal)电容 二、 先进工艺下&#xff0c;MIM 和 MOM 电容的比较1、单位面积容值2、工艺实现和电压系数3、电容密度受频率的影响(稳定性&#xff09;4、自谐振频率随面积的变化5、品质因数6…

ChatGPT火爆科研圈,登上《Nature》《Science》正刊

ChatGPT火出圈了&#xff0c;几乎涉及到各行各业的每个领域&#xff0c;科研圈更甚。 《Science》期刊主编H. HOLDEN THORP发表关于ChatGPT的社论&#xff1a; “ChatGPT is fun, but not an author”。 “ChatGPT 很好玩&#xff0c;但不是作者” 文章指出&#xff0c;许多担忧…

JavaWeb-CSS的盒模型与弹性布局

目录 CSS的盒模型边框内边距外边距块级元素水平居中 弹性布局常用的一些属性justify-contentalign-items CSS的盒模型 每一个HTML就相当于一个矩形的"盒子". 这个盒子由以下几个部分组成 边框 border内容 content(下图中间蓝色部分)内边距 padding外边距 margin 边…

【饭谈】ChatGpt如果让软件ui都消失的话,那ui自动化测试该何去何从?

“未来的软件长什么样&#xff1f;” 一位妹子产品经理问我&#xff1a;“你说说未来的软件ui是什么样的&#xff1f;听到这个问题我先是诧异了一下&#xff0c;随即陷入了沉思。” 我看着眼前的产品经理&#xff0c;她是一位比较年轻干练的女强人类型&#xff0c;1.65的身材…

Mac软件打开提示:已损坏,无法打开。您应该将它移到废纸娄 怎么解决?

新入手的苹果电脑打开软件出现&#xff1a;“已损坏&#xff0c;无法打开。您应该将它移到废纸娄” 或 “已损坏&#xff0c;打不开。推出磁盘映像”。这个怎么解决&#xff1f; 第一部分&#xff1a; 1、点菜单栏搜索图标&#xff0c;输入&#xff1a;终端 &#xff0c;找到后…

2022 第十三届蓝桥杯大赛软件赛省赛(第二场),C/C++ 大学B组题解

2022 第十三届蓝桥杯大赛软件赛省赛&#xff08;第二场&#xff09;&#xff0c;C/C 大学B组题解 文章目录 第1题 —— 练习 &#xff08;5分&#xff09;第2题 —— 三角回文数 &#xff08;5分&#xff09;第3题 —— 卡片 &#xff08;10分&#xff09;第4题 —— 考勤刷卡 …

软考A计划-真题-分类精讲汇总-第九章(数据结构与算法基础)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

Unity VR开发教程 OpenXR+XR Interaction Toolkit (一) 安装和配置

文章目录 &#x1f4d5;前言❓什么是 OpenXR❓什么是 XR Interaction Toolkit &#x1f4d5;教程说明&#x1f4d5;第一步&#xff1a;导入 OpenXR&#x1f4d5;第二步&#xff1a;导入 XR Interaction Toolkit⭐导入 Starter Assets⭐添加 Preset⭐设置 Preset Manager 的 Fil…

VLAN(含配置命令行)

一、VLAN的概念及优势 虚拟局域网&#xff08;VLAN&#xff09;是一组逻辑上的设备和用户&#xff0c;这些设备和用户并不受物理位置的限制&#xff0c;可以根据功能、部门及应用等因素将它们组织起来&#xff0c;相互之间的通信就好像它们在同一个网段中一样&#xff0c;由此得…