大家推荐一款网页版的 Verilog代码编辑仿真验证平台,这个平台是国外的一家开源FPGA学习网站,通过

“https://hdlbits.01xz.net/wiki/Main_Page”

地址链接进入网页,在该网页上可以进行Verilog代码的编写、综合,而且最后还能够仿真出波形来验证设计代码的正确性,该验证平台是基于Icarus Verilog(简称iVerilog,比较著名的开源HDL仿真工具,也有对应的安装版本)的,让你随时随地只需登录网页就能够享受Verilog编程仿真的乐趣!

一、官方模板演示

1、首先打开

“https://hdlbits.01xz.net/wiki/Main_Page”,

打开后的界面如下图所示,全英文显示。如果感觉自己的英文水平欠佳,可以使用谷歌浏览器打开该网页,并选择在线翻译功能,翻译的正确率还是很高的。

2、点击Simulation下的 ”Run a Simulation(lcarus Verilog)“。

3、打开后的界面如下图所示,代码编辑框中给出了一个简单的例子。

4、点击下面的“Submit(new window)“在新界面中进行仿真。

5、在新打开的界面中我们可以看到编译的信息和仿真波形图。

二、实例演示

虽然看完了官方的模板演示,但我们要想立刻仿真验证自己设计的代码并不是那么容易,需要进行一番摸索。下面就是大家进行一个呼吸灯的设计实例演示。

1、学习过FPGA的朋友都知道要想对FPGA逻辑进行仿真一定要具备两个文件,一个是RTL代码文件,用来综合生成硬件电路的部分;第二个就是Testbench文件,用来验证RTL代码功能的仿真文件,这两者缺一不可。

2、根据观察发现官方模板中的代码编辑部分有两个module,大家也都知道一个.v 文件中只能有一个模块,也就是只能有一个module,而这里面有两个,那肯定就不对了。再仔细观察会发现代码编辑区域中的上半部分就是Testbench,而下半部分则是RTL代码,再结合仿真出的波形来更看验证了这个想法。原来 RTL 代码和Testbench都写在了一个编辑框里。

3、但是我们在提供的模板中发现一些我们平时几乎没有见过的新语法,如第4行的”initial `probe_start“、第6行的”`probe(clk)“、第26行的”`probe(in)“,通过模板的注释和多次实验发现这是官方定义的一个”宏“,也就是通过这个”宏“调用“probe”探针的功能,我们不用管这个”宏“是如何定义的,我们只需要会调用就可以了。

4、下面我们通过该网页来仿真验证一下自己设计的呼吸灯的例子。详细代码如下(呼吸灯逻辑和Testbench代码的编写方法这里我们不做讲解,会在以后的文章中再进行详细说明),标红处的注释是需要特别强调的(代码可以全部直接复制使用)。

`timescale1ns/1ns
//-------------------Tesebench--------------------
moduletop_module;       //仿真文件名必须是“top_module”
reg    sclk;
reg    rst_n;
wire   led;
initial `probe_start;   // Start the timing diagram`probe(sclk);         // Probe signal"clk",这是加载的系统时钟,只能在Tesebench中加载
//初始化
initial    beginsclk   =1'b0;rst_n <= 1'b0;#200rst_n <= 1'b1;#5000                 //一定要设置仿真停止时间,如果仿真结束时间太久会提示$finish;
end
//产生20ns的时钟
always#10sclk =~sclk;
//为了减少仿真时间我们在仿真中重定义参数,不影响RTL代码中参数的值
defparam   breath_led_inst.CNT_1US_MAX = 1;
defparam   breath_led_inst.CNT_1MS_MAX  = 2;
defparam   breath_led_inst.CNT_1S_MAX   =2;//-------------------breath_led--------------------
breath_ledbreath_led_inst(.sclk  (sclk  ),  //input    sclk  .rst_n(rst_n),  //input    rst_n .led    (led  )   //output   led
);
endmodule
//--------------------------------------------------
//-----------------------RTL------------------------
modulebreath_led
#(parameter  CNT_1US_MAX =6'd49,parameter  CNT_1MS_MAX =10'd999,parameter  CNT_1S_MAX  =10'd999
)
(input  wire   sclk   ,input  wire   rst_n  ,outputreg    led
);reg[5:0]  cnt_1us;
reg[9:0]  cnt_1ms;
reg[9:0]  cnt_1s;reg        cnt_1us_flag;
reg        cnt_1ms_flag;
reg        cnt_1s_flag;
//cnt_1us:1us计数器always@(posedgesclk ornegedgerst_n)if(rst_n ==1'b0)cnt_1us <=6'b0; else   if(cnt_1us== CNT_1US_MAX)  cnt_1us <=6'b0;elsecnt_1us <=cnt_1us + 1'b1;
//cnt_1us_flag:1us计数器标志信号always@(posedgesclk ornegedgerst_n)if(rst_n ==1'b0)cnt_1us_flag <= 1'b0;   else   if(cnt_1us==  CNT_1US_MAX) cnt_1us_flag <= 1'b1;elsecnt_1us_flag <= 1'b0;
//cnt_1ms:1ms计数器always@(posedgesclk ornegedgerst_n)if(rst_n ==1'b0)cnt_1ms <=10'b0;else   if(cnt_1ms==  CNT_1MS_MAX && cnt_1us_flag ==1'b1)  cnt_1ms <=10'b0;else   if(cnt_1us_flag ==1'b1)cnt_1ms <=cnt_1ms + 1'b1;     //cnt_1ms_flag:1ms计数器标志信号always@(posedgesclk ornegedgerst_n)if(rst_n ==1'b0)cnt_1ms_flag  <=  1'b0; else   if(cnt_1ms==  CNT_1MS_MAX && cnt_1us_flag ==1'b1)  cnt_1ms_flag <= 1'b1;else  cnt_1ms_flag <= 1'b0;
//cnt_1s:1s计数器always@(posedgesclk ornegedgerst_n)if(rst_n ==1'b0)cnt_1s<=  10'b0;else   if(cnt_1s ==CNT_1S_MAX &&cnt_1ms_flag ==1'b1)cnt_1s<=  10'b0;else   if(cnt_1ms_flag ==1'b1)cnt_1s<=  cnt_1s+1'b1;
//cnt_1s_flag:1s计数器标志信号always@(posedgesclk ornegedgerst_n)if(rst_n ==1'b0)cnt_1s_flag <= 1'b0;else   if(cnt_1s ==CNT_1S_MAX &&cnt_1ms_flag ==1'b1)cnt_1s_flag <= ~cnt_1s_flag;
//led:一个LED灯always@(posedgesclk ornegedgerst_n)if(rst_n ==1'b0)led<=1'b0;  else   if((cnt_1s_flag ==1'b1 &&cnt_1ms <= cnt_1s)|| (cnt_1s_flag  == 1'b0 &&cnt_1ms >cnt_1s))led<=1'b1;else  led<=1'b0;
//添加要观察的信号名`probe(rst_n          );  //Sub-modules can also have `probe()`probe(cnt_1us        );  //Sub-modules can also have `probe()`probe(cnt_1us_flag  );  //Sub-modules can also have `probe()`probe(cnt_1ms       );  //Sub-modules can also have `probe()`probe(cnt_1ms_flag  );  //Sub-modules can also have `probe()`probe(cnt_1s         );  //Sub-modules can also have `probe()`probe(cnt_1s_flag   );  //Sub-modules can also have `probe()`probe(led            );  //Sub-modules can also have `probe()
endmodule
//--------------------------------------------------

5、将上面编写好的Testbench代码和RTL代码放到一个文件中(Testbench在上面,RTL代码在下面,仅在该平台仿真时可以将两种文件放在一起,在其他平台仿真时要独立放到两个.v文件中),然后复制粘贴到代码编辑框中,点击“Submit(new window)“执行仿真。

6、也可以将写好的Testbench代码和RTL代码放到同一个.v文件中,然后点击下面的代码编辑框下面的“Upload a source file...”,在展开的界面中选择添加.v文件后,再点击”Upload and simulate”启动仿真。

7、仿真波形如下所示,因为界面空间有限,拖动波形显示框下面的滚动条,可以看到后面的波形显示。

8、在波形显示框中右击鼠标可以选择保存为PNG格式或SVG格式,将完整的波形信息保存下来。

9、保存为SVG格式后的完整波形图如下所示。

10、如果我们在第58行处代码设置一个错误后,再点击执行仿真,此时在仿真窗口中不会显示波形,而是提示错误的内容,将错误修改后再执行仿真即可。

11、该网页还有其他更多有趣的功能,如组合逻辑代码编写训练、时序逻辑代码编写训练、单片机嵌入式仿真等等,有兴趣的朋友可以自己探索,这里不再一一演示。

关于答案

所有题目没有标准答案,github上很多答案,大家在遇到问题的时候可以去搜索参考,建议遇到问题多思考,才能学能所用。

学会使用Hdlbits网页版Verilog代码仿真验证平台相关推荐

  1. 网页版的svn怎样同步代码_学会使用Hdlbits网页版Verilog代码仿真验证平台

    大家推荐一款网页版的 Verilog代码编辑仿真验证平台,这个平台是国外的一家开源FPGA学习网站,通过 "https://hdlbits.01xz.net/wiki/Main_Page&q ...

  2. 黑科技--- 电影日历/表情搜索/抖音网页版/去水印/网易云游戏平台

    黑科技- 电影日历/表情搜索/抖音网页版/去水印/网易云游戏平台 一.电影日历(https://www.cikeee.com) 这个网站中每天会推荐一部经典的电影,并且可以在线观看.如果不喜欢看推荐的 ...

  3. 针对无人机的发动机控制仿真验证平台

    ​概述 针对无人机的发动机控制仿真验证平台用于数字电子控制器半实物仿真试验.根据真实逻辑模拟飞行管理计算机,基于飞行任务实现各个剖面下飞机执行不同动作时,对数字电子控制器激励,完成对推进系统的指令传输 ...

  4. 计算器html js php代码,JavaScript计算器网页版实现代码分享

    JavaScript网页计算器代码,该计算器是用DW写的! HTML篇 计算器 > C ← ± + 7 8 9 - 4 5 6 × 1 2 3 ÷ 0 ▪ = CSS篇 @charset &qu ...

  5. 网页爬虫python代码_Python 爬虫web网页版程序代码

    一:网页结构分析 二:代码实战#! /usr/bin/env python2 # encoding=utf-8 #BeautifulSoup需要安装 MySQLdb import sys,os,re, ...

  6. 消灭星星网页版java代码,js实现消灭星星(web简易版)

    昨天看视频之后,整理思路,自己完成了简易版消灭星星 思路: 模块1:初始化 初始化总分数.当前分数.背景图.选择的星星分数 初始化星星(生成二维数组,对二维数组的每一个对象设置样式(长.宽.背景图), ...

  7. 消灭星星网页版java代码,javascript实现消灭星星小游戏简单版

    来看看实现的效果图 游戏规则:双击颜色一样的星星,双击相同的部分就消失了 实例代码 * {margin:0; padding:0;} body {background:#000; width:100% ...

  8. PHP泡泡龙源码,JS泡泡龙游戏网页版+完整代码

    网页游戏-泡泡龙 *{padding:0px;margin:0px} hr{width:2px;height:2px;} #a{width:502px;height:602px;border:1px ...

  9. php登陆网页版微信代码,几行php代码实现微信自动注册登陆 (微信PC扫码受权登陆注册)...

    最近做的一个商城项目中,要用到发货和收货人地址的功能,上面要求要用微信PC扫码授权登陆:自己试着用研究了好久写了一个,但是发现有好多兼容问题,具体实现步骤如下.微信PC扫码授权登陆 php简单示例代码 ...

最新文章

  1. 七、深入JavaScript的DOM(三)
  2. [BZOJ 2054]疯狂的馒头
  3. 【CSU - 1023】【HRBUST - 1039】修路(二分,枚举)
  4. redis分布式锁java代码_基于redis实现分布式锁
  5. 设置tableview的滚动范围--iOS开发系列---项目中成长的知识三
  6. 供应商主数据和客户主数据各个字段进行显示、必输、隐藏和可选输入的配置学习...
  7. 三、Socket之UDP异步传输文件-多文件传输和文件MD5校验
  8. 【CVRP】基于matlab蚁群算法求解带容量的车辆路径规划问题【含Matlab源码 1039期】
  9. 笨方法学Python笔记(5)
  10. Java 替换PDF中的字体
  11. 1222-周一开盘红红火火大涨的一天。EG,PVC,沪铜,国际铜,纯碱涨停
  12. 澳大利亚域名_澳大利亚域名.au注册要求
  13. 【ERROR】Error: Error trying to upgrade business network. Error: No valid responses from any peers.
  14. 截取某个字符串之前的字符
  15. MySQL学习(十六):数据类型之日期与时间类型
  16. BZOJ 3159: 决战 解题报告
  17. 解决方法 curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to bit.ly:443
  18. Distilled Person Re-identification: Towards a More Scalable System
  19. phpcms pc标签调用整理
  20. 关于android上的定位

热门文章

  1. 连接MySQL错误:Can#39;t connect to MySQL server (10060)
  2. 规范哈夫曼编码和Deflate算法
  3. 《2021年度中国计算机视觉人才调研报告》正式发布
  4. pareto最优解程序_求多目标优化问题Pareto最优解集的方法
  5. How to deal with Imbalanced Datasets in PyTorch - Weighted Random Sampler Tutorial
  6. 2020 年我学习到的 20 条软件工程准则
  7. 浪潮存储:基于系统级可靠性设计,为数据存储保驾护航
  8. C语言中编译预处理命令作用,C语言预处理命令详解
  9. 【机器学习】采用信息增益、信息增益率、基尼指数来建造决策树。
  10. 进程、线程、程序的概念与区别