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

news2024/9/19 10:38:38

写在前面

        在自己准备写一些简单的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;
end

endmodule 

        

        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'b0000
  if (reset == 1'b1) begin
    counter_out <=  #1  4'b0000;
  end
  //如果使能有效,则输出递增
  else if (enable == 1'b1) begin
    counter_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 counter
 0        1   0     0      xxxx
 5        0   1     0      xxxx
 10       1   1     0      xxxx
 11       1   1     0      0000
 15       0   0     0      0000
 20       1   0     0      0000
 25       0   0     1      0000
 30       1   0     1      0000
 31       1   0     1      0001
 35       0   0     1      0001
 40       1   0     1      0001
 41       1   0     1      0010
 45       0   0     1      0010
 50       1   0     1      0010
 51       1   0     1      0011
 55       0   0     1      0011
 60       1   0     1      0011
 61       1   0     1      0100
 65       0   0     1      0100
 70       1   0     1      0100
 71       1   0     1      0101
 75       0   0     1      0101
 80       1   0     1      0101
 81       1   0     1      0110
 85       0   0     1      0110
 90       1   0     1      0110
 91       1   0     1      0111
 95       0   0     1      0111
 100      1   0     1      0111
 101      1   0     1      1000
 105      0   0     1      1000
 110      1   0     1      1000
 111      1   0     1      1001
 115      0   0     1      1001
 120      1   0     1      1001
 121      1   0     1      1010
 125      0   0     0      1010

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

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


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

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

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

相关文章

Windows应急响应 -Windows日志排查,系统日志,Web应用日志,

「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 Windows日志分析一、查看日志二、日志分类三、筛选日志四、事件ID1、安全日志1.1、登录类…

基于Java+SSM+Vue的旅游资源网站设计与实现【源码(完整源码请私聊)+论文+演示视频+包运行成功】

博主介绍&#xff1a;专注于Java技术领域和毕业项目实战 &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例&#xff08;200套&#xff09; 目录 一、效果演示 二、…

【从零开始学Skynet】实战篇《球球大作战》(八):login代码设计

现在来编写我们的第二个服务——登录服务&#xff0c;在编写此服务时&#xff0c;建议大家对照着如下所示的流程图来看&#xff0c;知晓各个方法的作用&#xff0c;写起来会简单许多。 1、登录协议 定义如下图所示的登录协议&#xff1a; 客户端需要发送玩家账号和密码&#x…

MyBatis 源码解析 面试题总结

MyBatis源码学习环境下载 文章目录1、工作原理1.1 初始化1.1.1 系统启动的时候&#xff0c;加载解析全局配置文件和相应的映射文件1.1.2 建造者模式帮助我们解决复杂对象的创建&#xff1a;1.2 处理SQL请求的流程1.2.1 通过sqlSession中提供的API方法来操作数据库1.2.2 获取接口…

UOS内核替换kylin内核

一、替换UOS内核 如果可以获取UOS的的ROOT权限, 跳过步骤一和二。 步骤一、配置环境 如果有UOS系统的机器,则不需要安装,跳到步骤二 。 如果没有UOS系统则需要下载, 下载UOS镜像:统信UOS生态社区 - 打造操作系统创新生态 ,下载专业版需要用户注册大概1~3天可以通过,…

HTML-form表单和提交

网络请求 在浏览器的URL中写入地址&#xff0c;点击回车访问时 浏览器会发送数据过去&#xff0c;本质上发送的是字符串 浏览器向后端发送请求时 GET请求【URL方法/表单提交】 现象&#xff1a;向后台传入数据&#xff0c;数据会拼接在URL上 搜索百度时&#xff1a; http…

十四、Pytorch实现RNN Classifier

一、项目需求 数据集&#xff1a;姓名和对应的国籍 要求&#xff1a;输入一个姓名&#xff0c;通过模型可以得到TA所属的国籍 数据集下载&#xff1a;name_country_datasets 二、思路步骤分析 ①准备数据集 将下载好的数据集解压&#xff0c;放到一个指定的位置&#xff0c…

文心一格小程序,AI绘画产品

文章目录AIGC什么是AI作画&#xff1f;Prompt文心一格文心一格小程序使用方法使用小程序进行AI绘图AIGC的未来发展结语AIGC AIGC&#xff08;AI Generated Content&#xff09;是指利用人工智能生成内容。是利用人工智能来生成你所需要的内容&#xff0c;GC的意思是创作内容。与…

samba介绍和使用

一. 介绍 Samba是一套使用SMB(Server Message Block)协议的应用程序, 通过支持这个协议, Samba允许Linux服务器与Windows系统之间进行通信,使跨平台的互访成为可能。 Samba采用C/S模式, 其工作机制是让NetBIOS( Windows 网上邻居的通信协议)和SMB两个协议运行于TCP/IP通…

【Obsidian】基础使用手册(包括如何将Obsidian页面设置为中文)

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于工具类软件的笔记 &#x1f236;本篇是Obsidian的基础使用 Obsidian的基础使用将页面设置为中文常用的默认快捷键常用的格式标题代码块表格字体样式列表任务列表官方下载地址&am…

中国电子学会2022年12月份青少年软件编程Python等级考试试卷六级真题(含答案)

一、单选题(共25题&#xff0c;共50分) 1.数据文件“abc.txt”中包含若干个英文单词&#xff0c;如图所示&#xff1a; 读取文件“abc.txt”中数据的Python程序段如下&#xff1a; file abc.txt word_b [] for word in open(file):if word[0:1] a and len(word)>4:wor…

ASP学生公寓管理系统的设计与实现

学生公寓是每一位在校学生生活、学习、相互交流的主要场所&#xff0c;如何提供一个良好的学生公寓的管理体系&#xff0c;对学校和同学而言至关重要。以往的学生公寓管理基本上还处于人工操作的阶段&#xff0c;随着计算机技术和网络技术的日益广泛应用&#xff0c;采用计算机…

Oracle基础部分三(视图、物化视图、序列、同义词、索引)

Oracle基础部分三(视图、物化视图、序列、索引&#xff09;1 视图1.1概述1.2 创建普通视图1.2.1 创建普通视图1.2.2 创建带检查约束的视图1.2.3 创建只读视图的创建与使用1.2.4 强制创建视图1.2.5 创建复杂视图1.2.5.1 多表关联1.2.5.2 分组聚合统计的复杂视图1.3 创建物化视图…

强化学习简介

1.强化学习简介 **强化学习&#xff08;Reinforcement Learning&#xff0c;RL&#xff09;**是机器学习中的一个领域&#xff0c;是学习“做什么&#xff08;即如何把当前的情景映射成动作&#xff09;才能使得数值化的收益信号最大化”。学习者不会被告知应该采取什么动作&a…

CDN(内容分发网络)技术原理

1. 前言 Internet的高速发展&#xff0c;给人们的工作和生活带来了极大的便利&#xff0c;对Internet的服务品质和访问速度要求越来越高&#xff0c;虽然带宽不断增加&#xff0c; 用户数量也在不断增加&#xff0c;受Web服务器的负荷和传输距离等因数的影响&#xff0c;响应速…

认证 (authentication) 和授权 (authorization) 的区别

以前一直傻傻分不清各种网际应用中 authentication 和 authorization, 其实很简单: 这两个术语通常在安全性方面相互结合使用&#xff0c;尤其是在获得对系统的访问权限时。两者都是非常重要的主题&#xff0c;通常与网络相关联&#xff0c;作为其服务基础架构的关键部分。然而…

vite+vue3+pinia+vuex4动态路由解决刷新页面丢失

目录 了解如何添加动态路由 使用pinia持久化数据 解决方案 404找不页面问题 目前解决思路 完整路由配置 动态路由使用的数据 了解如何添加动态路由 vue官网-动态添加路由 使用pinia持久化数据 pinia的使用 解决方案 asyncRoutes()方法从pinia获取到动态菜单数据登陆成…

SpringMVC 01 -SpringMVC入门

高效学习习惯啊 坚持&#xff0c;比如这样经常更新博客&#xff0c;保持学习哈哈哈 SpringMVC-SpringMVC引入1 SpringMVC引入1.1 引言1.2 MVC架构1.2.1 概念1.2.2 好处1.2.3 执行流程【重点】2 快速入门2.1 导入依赖2.2 配置核心(前端)控制器2.3 springmvc核心配置文件2.4 创建…

开心档之C++ 修饰符类型

C 修饰符类型 目录 C 修饰符类型 实例 C 中的类型限定符 C 允许在 char、int 和 double 数据类型前放置修饰符。修饰符用于改变基本类型的含义&#xff0c;所以它更能满足各种情境的需求。 下面列出了数据类型修饰符&#xff1a; signedunsignedlongshort 修饰符 signed、…

Gitlab中Pipeline语法六

Gitlab中Pipeline语法 needs/include/extends nodes 阶段并行 - 可以无序执行作业,无序按照阶段顺序运行某些作业,可以让多个阶段同时运行. - 如果nedds:设置为指向因only/except规则而未实例化的作业,或者不存在,则创建管道时会出现yaml错误. stages:- build- test- depl…