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

这篇具有很好参考价值的文章主要介绍了ASIC-WORLD Verilog(3)第一个Verilog代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面

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

计数器

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

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

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

  • 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)组成。

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

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

 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

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

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

        从波形图可以看到:首先复位;复位完成后从0开始依次递增计数。 文章来源地址https://www.toymoban.com/news/detail-415260.html


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

到了这里,关于ASIC-WORLD Verilog(3)第一个Verilog代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

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

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

    2023年04月17日
    浏览(27)
  • ASIC-WORLD Verilog(11)过程时序控制

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

    2024年02月14日
    浏览(27)
  • ASIC-WORLD Verilog(10)编写测试脚本Testbench的艺术

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

    2024年02月07日
    浏览(28)
  • ASIC-WORLD Verilog(8)if-else语句和case语句

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

    2024年02月01日
    浏览(35)
  • 【Verilog实现FPGA上的信号延迟】—— 用Verilog代码实现将信号延迟N拍,这是FPGA中非常重要的一个操作,可以使数据在不同模块之间精确同步。

    【Verilog实现FPGA上的信号延迟】—— 用Verilog代码实现将信号延迟N拍,这是FPGA中非常重要的一个操作,可以使数据在不同模块之间精确同步。 模块是FPGA中最基本的构建模块。通常一个模块代表一个电路,包括输入、输出和处理逻辑。模块中包含的处理逻辑被称为时序逻辑。

    2024年02月04日
    浏览(62)
  • 创建React Native的第一个hello world工程

    需要安装好node、npm环境 如果之前没有安装过 react-native-cli 脚手架的,可以按照下述步骤直接安装。如果已经安装过的,但是在使用这个脚手架初始化工程的时候遇到下述报错的话 也可以先直接卸载 正常安装过程: 安装 react-native-cli 安装 react-native 安装完成之后,可以用脚手

    2024年02月07日
    浏览(35)
  • HarmonyOS鸿蒙学习基础篇 - 运行第一个程序 Hello World

    下载与安装DevEco Studio      古话说得好,“磨刀不误砍柴工”,对于HarmonyOS应用开发,我们首先得确保工具齐全。这就好比要进行HarmonyOS应用开发,我们需要确保已经安装了DevEco Studio,这是HarmonyOS的一站式集成开发环境(IDE)。      下面我们就以在Windows系统上安装DevEco

    2024年01月23日
    浏览(34)
  • 【区块链】以太坊Solidity编写一个简单的Hello World合约

    熟悉一门语言得从Hello World! 开始,因为这是最简单的一个输出形式。 我们先在contracts目录下建立一个helloworld.sol文件 进入编辑 保存退出 在migrations下新建一个部署合约的js文件:3_initial_migration.js 名字可以变动 接下来在test中使用js调用智能合约 在另一个窗口打开ganache 运行智

    2024年02月15日
    浏览(55)
  • OpenHarmony 应用开发入门 (一、环境搭建及第一个Hello World)

    万事开头难。难在迈出第一步。心无旁骛,万事可破。没有人一开始就能想清楚,只有做起来,目标才会越来越清晰。--马克.扎克伯格 前言 2024年1月16日,华为目前开启已HarmonyOS NEXT开发者预览版Beta招募,报名周期为1月15日-1月22日。HarmonyOS NEXT开发者预览版将不再兼容安卓开

    2024年01月18日
    浏览(62)
  • 创建第一个Servlet程序“hello world“(创建流程+页面出错情况)

    目录 🐲 1. 动态页面之Servlet 🐲 2. 写第一个Servlet的程序:\\\"hello world!\\\" 🦄 2.1 创建项目 🦄 2.2 引入Servlet依赖 🦄 2.3 创建目录结构 🦄 2.4 编写代码  🦄 2.5 打包程序 🦄 2.6 部署程序 🦄 2.7 验证程序 🐲3. 创建Servlet流程简化 🐲4. 工作原理流程分析 🐲5. 访问页面出错 HTTP服务器

    2023年04月11日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包