verilog hdl 排球比赛计分功能_学会使用Hdlbits网页版Verilog代码仿真验证平台

欢迎FPGA工程师加入官方微信技术群

点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群

f7bbb2443b8c44634b38faed22671b51.png

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

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

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

一、官方模板演示

1、首先打开

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

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

ba7da0a53d2c609a1a38aa4f89967142.png

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

4eded29f6c8d40e0d5eb0f7b202a3b24.png

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

 77651eb3f75ea9a373555b5b97cb1402.png

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

7b3c9012820de1c10798c372fe2cf5c8.png 

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

 b80ecce9240a34f067766a3ae18467fe.png

二、实例演示

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

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    begin    sclk   =1'b0;    rst_n <= 1'b0;    #200    rst_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;    else       cnt_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;    else       cnt_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)“执行仿真。

c7f8c12688a3b871485ddde36195972d.png

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

4b334000782a5c119826799b506c8376.png

55a70178b0007c3a68a9c0aff27b3524.png  

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

4347d3e058fc94b64a871ffe113fe71f.png

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

28003197561e483a4f55ca3b894b38bf.png

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

1eeabb863b295e2171df3f1cbdcc59fc.png

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

ee108d7f44daecf53a4657824fb3be6d.png

c3952295eaf4e6eae157bb69fa177a33.png

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

47b86238e9f2d3de331d9f216351e31b.png

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

欢迎FPGA、嵌入式、信号处理等工程师关注公众号

592c7083f8a4badf8f7651b8ff145f64.png

全国第一大FPGA微信技术群

欢迎大家加入全国FPGA微信技术群,这个群体拥有数万工程师、一群热爱技术的工程师,这里的FPGA工程师相互帮助,相互分享,技术氛围浓厚!赶紧叫上小伙伴一起加入吧!

5c3a503a48a4aa4612e1e0ea5550d032.png

用手指按住就可以加入FPGA全国技术群哦

FPGA之家元器件芯城

优势元器件服务,有需求请扫码联系群主:金娟 邮箱:293580331@qq.com 欢迎推荐给采购

ACTEL、AD部分优势订货(经营全系列):

481776a399074f415c3ca45c06867c95.png

XILINX、ALTERA优势现货或订货(经营全系列):

965759aebdaa751a60b9097dac6b4e9c.png

(以上器件为部分型号,更多型号请咨询群主金娟)

服务理念:FPGA之家元器件自营芯城,旨在方便工程师快速方便购买器件服务,经过数年竭诚服务,我们的客服遍布国内大型上市公司、军工科研单位、中小企业、最大的优势是强调服务至上的理念、并且做到快速交货、价格优惠!

直营品牌:Xilinx ALTERA ADI TI NXP ST E2V、镁光 等百余元器件品牌,尤其擅长欧美对华禁运器件,欢迎工程师朋友把我们推荐给采购或者亲自咨询我们!我们将一如既往提供业内最佳服务!

5a300ea62a61f0568d63f992fe4b776a.png

FPGA技术群官方鸣谢品牌:Xilinx、 intel(Altera)、microsemi(,Actel)、LattIC e,Vantis,Quicklogic,Lucent等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值