ASIC-WORLD Verilog(3)第一个Verilog代码

news/2024/4/25 0:06:58/

写在前面

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

        这是网站原文:Verilog Tutorial

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

介绍

        如果你去看任何有关编程语言的书籍,就会发现它们的第一个例子几乎都是“Hello World”程序。一旦你学会了这个程序,就可以说你已经对这种语言入门了。

        接下来我会先展示如何在 Verilog 语言中编写“hello world”程序,然后再介绍一个稍微复杂点的“计数器”程序。

Hello World

        下面是一个在Verilog中打印“hello world”的程序。

//-----------------------------------------------------
// 这是我的第一个Verilog程序
// 设计名: hello_world
// 文件名: hello_world.v
// 功能  : 这个程序会打印'hello world'
// 作者  : Deepak
//-----------------------------------------------------
module hello_world ;initial begin$display ("Hello World by Deepak");#10  $finish;
endendmodule 

        

        Verilog 的程序都以保留字 “module” 开头,后面跟上设计者自定义的模块名 。在上面的示例中,第 8 行即包含“module hello_world”。

        第 10 行包含initial块:它只在仿真开始后执行一次,即仿真时间 = 0 (0ns)时。initial块中有两条语句,它们被第 10 行的 begin 和第 13 行的 end 包围起来了。在 Verilog 中,如果一个块中有多行,则需要使用 begin 和 end。

        模块以“endmodule”保留字作为结尾,即本例的第 15 行。

        这是程序打印的结果:

Hello World By Deepak

计数器

        这是要设计的计数器的框图:

        它的预期设计规格是这样的:

  • 4 位同步递增计数器
  • 高电平有效的同步复位信号
  • 高电平有效的使能信号

        预期的计数器设计Verilog程序如下:

//-----------------------------------------------------
// 这是我的第二个Verilog程序
// 设计名: first_counter
// 文件名: first_counter.v
// 作者  : Deepak
// 功能  : 这是一个4位宽的递增计数器
//		高有效的同步复位;高有效的使能信号
//-----------------------------------------------------
module first_counter (clock , 	// 时钟reset , 	// 高有效的同步复位enable , 	// 高有效的使能信号counter_out // 计数器输出
); //-------------Input Ports-----------------------------
input clock ;
input reset ;
input enable ;
//-------------Output Ports----------------------------
output [3:0] counter_out ;//-------------Input ports Data Type-------------------
// 输入必须是wire变量  
wire clock ;
wire reset ;
wire enable ;
//-------------Output Ports Data Type------------------
// 输出可以是wire或者reg
reg [3:0] counter_out ;//------------Code Starts Here-------------------------
// 这个计数器是时钟上升沿有效的
always @ (posedge clock)
begin : COUNTER // Block名//在每一个时钟上升沿,如果复位有效,则输出是4'b0000if (reset == 1'b1) begincounter_out <=  #1  4'b0000;end//如果使能有效,则输出递增else if (enable == 1'b1) begincounter_out <=  #1  counter_out + 1;end
end endmodule 


        任何数字电路,无论复杂与否都需要进行测试以验证其功能的正确性。

        对于计数器,我们需要提供时钟和复位信号。一旦计数器不在复位状态,我们将启用输入切换到计数器,并检查波形以查看计数器是否在正确计数。

        这是在 Verilog 的 testbench 中完成的。对于这个计数器,我们设计的testbench是这样的:

`include "first_counter.v"
module first_counter_tb();
//声明输入(reg)与输出(wire)
reg clock, reset, enable;
wire [3:0] counter_out;//初始化所有变量
initial begin        $display ("time\t clk reset enable counter");	$monitor ("%g\t %b   %b     %b      %b", $time, clock, reset, enable, counter_out);	clock = 1;       		// 初始化时钟信号reset = 0;       		// 初始化复位信号enable = 0;      		// 初始化使能信号#5  reset = 1;       // 置位复位信号#10  reset = 0;      // 失效复位信号#10  enable = 1;     // 置位使能信号#100  enable = 0;    // 失效使能信号#5  $finish;         // 结束仿真
end// 生成时钟信号
always begin#5  clock = ~clock; // 每5个单位时钟翻转一次
end// 被测模块
first_counter U_counter (clock,reset,enable,counter_out
);endmodule

        这个testbench由时钟发生器(clock gen)、复位控制(reset logic)、使能控制(enable logic)和监控/验证逻辑(monitor/checker)组成。

        这是仿真完成后打印的结果,可以看到计数器的工作是符合预期的。

 time     clk reset enable counter0        1   0     0      xxxx5        0   1     0      xxxx10       1   1     0      xxxx11       1   1     0      000015       0   0     0      000020       1   0     0      000025       0   0     1      000030       1   0     1      000031       1   0     1      000135       0   0     1      000140       1   0     1      000141       1   0     1      001045       0   0     1      001050       1   0     1      001051       1   0     1      001155       0   0     1      001160       1   0     1      001161       1   0     1      010065       0   0     1      010070       1   0     1      010071       1   0     1      010175       0   0     1      010180       1   0     1      010181       1   0     1      011085       0   0     1      011090       1   0     1      011091       1   0     1      011195       0   0     1      0111100      1   0     1      0111101      1   0     1      1000105      0   0     1      1000110      1   0     1      1000111      1   0     1      1001115      0   0     1      1001120      1   0     1      1001121      1   0     1      1010125      0   0     0      1010

        看数据多少有点不够直观,那我们也可以直接来看仿真的波形:

        从波形图可以看到:首先复位;复位完成后从0开始依次递增计数。 


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


http://www.ppmy.cn/news/48197.html

相关文章

【蓝桥杯省赛真题38】Scratch流星坠落 少儿编程scratch编程蓝桥杯省赛比赛真题讲解

目录 scratch流星坠落 一、题目要求 编程实现 二、案例分析 1、角色分析

SAS学习第3章:试验数据处理的心决

sas中数据的输入格式一般分为2种&#xff0c;一种是直接输入&#xff0c;另一种是循环输入。input 后跟几个变量名&#xff0c;数据卡cards就要据此逐次处理&#xff0c;且一定是倍数关系。 1.直接输入在自变量及数据较少的情况下较好使用。 例&#xff1a; 甲、乙、丙三个奶…

第七讲 分支结构和循环结构的应用

通过前面两节课的学习&#xff0c;大家对 Python 中的分支结构和循环结构已经有了初步的认知。分支结构和循环结构是构造程序逻辑的基础&#xff0c;它们的重要性不言而喻&#xff0c;但是对于初学者来说这也是比较困难的部分。很多人对分支结构和循环结构的语法是能够理解的&a…

FISCO BCOS(三十四)———商品溯源(智能合约+后端)

FISCO BCOS(三十四)———商品溯源(智能合约+后端) 一、智能合约函数调用流程 注:智能合约来源(官网的合约仓库中) 但是TraceabilityFactory合约有问题,我已经做了修改,可以看原版与我的,只有一个函数不同。 官网上这套合约在TraceabilityFactory这个合约上缺少getGo…

MySQL系列四(alter锁表、批量删除导致IO出现瓶颈)

文章目录 alter锁表问题批量删除导致IO出现瓶颈 alter锁表问题 Mysql5.6版本之前 更新步骤 对原始表加写锁按照原始表和执⾏语句的定义&#xff0c;重新定义⼀个空的临时表。对临时表进⾏添加索引&#xff08;如果有&#xff09;。再将原始表中的数据逐条Copy到临时表中。当原…

传统串口设备快速实现联网的解决方案(串口-以太网网关、Modbus网关、Modbus Poll/Slave调试软件的使用、Modbus报文数据实例分析)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》

Java实现复制文件

1、InputStream与OutputStream 创建两个文件 - 源和目标。然后我们从源创建InputStream并使用OutputStream将其写入目标文件进行 java 复制文件操作。 private static void copyFileUsingStream(File source, File dest) throws IOException { InputStream is null; …

SpringCloud消息总线——Bus

Bus 本专栏学习内容来自尚硅谷周阳老师的视频 有兴趣的小伙伴可以点击视频地址观看 在SpringCloud Config学习过程中&#xff0c;还遗留下来一个问题&#xff1a;当运维更新git上的配置信息时&#xff0c;要想更改所有的客户端服务&#xff0c;必须得手动给客户端服务发送post请…

蒙层禁止页面滚动

学习链接&#xff1a;蒙层禁止页面滚动的方案 <!DOCTYPE html> <html> <head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1"><title>蒙层禁止页面滚动的方案<…

IMX6ULL---Yocto制作U-Boot

目录 1. U-Boot源码下载 2.增加U-Boot Recipe 3.修改U-Boot Recipe 4.编译U-Boot 5.U-Boot移植(EMMC版)

探讨接口测试颗粒度

偶然间在论坛上看到一个帖子&#xff0c;帖子内容如下&#xff1a; 假设现在有一个新增商品的接口&#xff0c;返回的参数中有新增商品的 id&#xff08;每次返回的 id 都不一样&#xff09;、success&#xff08;判断是否成功&#xff0c;0 失败 1 成功&#xff09; 1. 接口…

qt属性系统简介( Q_PROPERTY)

1、属性定义 Qt 提供一个 Q_PROPERTY()宏可以定义属性&#xff0c;它也是基于元对象系统实现的。Qt 的属性系统与C编译器无关&#xff0c;可以用任何标准的 C编译器编译定义了属性的 Qt C程序。 在QObiect 的子类中&#xff0c;用宏Q_PROPERTY()定义属性&#xff0c;其使用格式…

【Python_Scrapy学习笔记(十)】基于Scrapy框架的下载器中间件创建代理IP池

基于Scrapy框架的下载器中间件创建代理IP池 前言 本文中介绍 如何基于 Scrapy 框架的下载器中间件创建代理IP池。 正文 1、添加中间件的流程 在 middlewares.py 中新建 代理IP 中间件类在 settings.py 中添加此下载器中间件&#xff0c;设置优先级并开启 2、基于Scrapy框…

汽车基础软件信息安全与AUTOSAR

AUTOSAR 信息安全框架和关键技术分析 随着汽车网联化和智能化,汽车不再孤立,越来越多地融入到互联网中。在这同时,汽车也慢慢成为潜在的网络攻击目标,汽车的网络安全已成为汽车安全的基础,受到越来越多的关注和重视。AUTOSAR 作为目前全球范围普遍认可的汽车嵌入式软件架…

[线上故障][坑] spring的自动装配和事务不生效

哪些年的故障 spring自动装备 方案1 <context:annotation-config scan/ > autowired byType Qulified Resource byName 不建议, 二选一, 自动选择同名的. Autowired与Resource异同&#xff1a; 1、Autowired与Resource都可以用来装配bean。都可以写在字段上&#x…

CAS操作实际上包含了哪两个步骤?

目录 先讲原理&#xff1a; 再深入CAS规则&#xff1a; 问题&#xff1a;第一步是否应该是修改预期值&#xff1f; 总结一下&#xff1a; 先讲原理&#xff1a; CAS的全称是Compare And Swap&#xff08;比较并交换&#xff09;&#xff0c;是一种原子操作&#xff0c;通常…

zookeeper 单机环境搭建(三)

下载地址&#xff1a;Index of /dist/zookeeper 1.新建目录/home/yy/tools/zookeeper&#xff0c;将下载好的apache-zookeeper-3.8.0-bin.tar拷进/home/yy/tools目录。 2.解压zk tar –zxvf apache-zookeeper-3.8.0-bin.tar j3. cd到解压后的zk路径下&#xff0c; 将解压后…

二叉树的遍历

文章目录 二叉树的遍历方式先序遍历中序遍历后序遍历层序遍历 根据遍历过程构造二叉树已知前序(后序)中序输出后序(前序) 二叉树的遍历方式 先序遍历 先序遍历指遍历顺序为根节点——》左节点——》右节点 代码实现&#xff1a; //存储遍历结果的数组vector<int> v;//前…

9、MachO简介

一、MachO文件 MachO其实是Mach Object文件格式的缩写,是Mac以及iOS上可执行文件的格式,类似于windows上的PE格式(Portable Executable), linux上的elf格式(Executable and Linking Format) 二、MachO文件结构 Mach-O为Mach Object文件格式的缩写,它是一种用于可执行文件、目…

事件处理框架

一、事件处理框架-event_base Reactor模式有几个基础的组件&#xff0c;其中的Reactor框架就是event_base结构体&#xff0c;下面是定义&#xff08;只列出部分常用的成员&#xff09;&#xff0c;如下&#xff1a; struct event_base {/* 后台使用的I/O多路复用机制 */const s…