当前位置:   article > 正文

Vivado之VIO原理及应用_vivado vio

vivado vio

虚拟输入输出(Virtual Input Output,VIO)核是一个可定制的IP核,它可用于实时监视和驱动内部FPGA信号,如图所示。

可以定制VIO的输入和输出端口的数量与宽度,用于和FPGA设计进行连接。由于VIO核与被监视和驱动的设计同步,因此应用于设计的时钟约束也适用于VIO核内的元件。当使用这个核进行实时交互时,需要使用Vivado逻辑分析特性。

接下来将介绍VIO的原理及应用,内容主要包括设计原理、添加VIO核、生成比特流文件和下载并调试设计。

设计原理

设计以下源码的工程,并添加VIO核:

  1. `timescale1ns/1ps
  2. //
  3. //Company:
  4. //Engineer:
  5. //
  6. //CreateDate:2021/08/222358
  7. //DesignName:
  8. //ModuleName:top
  9. //ProjectName:
  10. //TargetDevices:
  11. //ToolVersions:
  12. //Description:
  13. //
  14. //Dependencies:
  15. //
  16. //Revision:
  17. //Revision0.01-FileCreated
  18. //AdditionalComments:
  19. //
  20. //
  21. moduletop(
  22. inputclk,
  23. inputa,
  24. inputb,
  25. outputreg[5:0]z
  26. );
  27. reg[5:0]z_tmp;
  28. wire[5:0]z_vio;
  29. rega_tmp,b_tmp;
  30. wirea_in,b_in;
  31. wiresel;
  32. wirea_vio,b_vio;
  33. assigna_in=sel?a:a_vio;
  34. assignb_in=sel?b:b_vio;
  35. assignz_vio=z;
  36. vio_0 Inst_vio(
  37. .clk(clk),//inputwireclk
  38. .probe_in0(z),//inputwire[5:0]probe_in0
  39. .probe_out0(sel),//outputwire[0:0]probe_out0
  40. .probe_out1(a_vio),//outputwire[0:0]probe_out1
  41. .probe_out2(b_vio)//outputwire[0:0]probe_out2
  42. );
  43. always@(posedgeclk)
  44. begin
  45. a_tmp<=a_in;
  46.  b_tmp<=b_in;
  47. end 
  48. always @(*)
  49. begin
  50.  z_tmp[0]=a_tmp & b_tmp;
  51.  z_tmp[1]=~(a_tmp & b_tmp);
  52.  z_tmp[2]=a_tmp | b_tmp;
  53.  z_tmp[3]=~(a_tmp | b_tmp);
  54.  z_tmp[4]=a_tmp ^ b_tmp;
  55.  z_tmp[5]=a_tmp ~^ b_tmp;
  56. end 
  57. always @(posedge clk)
  58. begin
  59. z<=z_tmp;
  60. end 
  61. endmodule

添加VIO后的整体设计如下:

        如上图所示,在该设计中添加一个vio核,该IP提供3个输出端口,其中probe_out0端口用于选择进入寄存器a_tmp_reg和寄存器b_tmp_reg的信号。当probe_out0输出1时,将外部端口a和b提供的信号分别连接到寄存器a_tmp_reg和寄存器b_tmp_reg;当probe_out0输出0时,将vio输出端口probe_outl和probe_out2信号连接到寄存器a_tmp_reg和b_tmp_reg。这样就可以通过vio提供的端口来控制整个FPGA的设计。此外,FPGA设计的最终输出z可以连接到vio模块的probe_in0输入端口。

添加VIO和

本节将添加VIO核,主要步骤如下所示。

第一步:用Vivado集成开发环境打开需要添加的工程。

第二步:在Vivado主界面左侧的“Flow Navigator”窗口中找到并展开PROJECT MANAGER选项。在展开项中,找到并选择“IP Catalog”选项。

第三步:在Vivado主界面的右侧窗口中,弹出“IP Catalog”标签页。在该标签页的搜索框中输入“VIO”,则在下面出现“VIO(Virtual Input/Output)”,如图所示,双击“VIO(Virtual Input/Output)”。

第四步:弹出“Customize IP-VIO(VirtualInput/Output)”对话框。

(1)单击“General Options”标签,如图所示,在该标签页中,按如下参数进行设置。

  1. Input ProbeCount:1
  2. Output ProbeCount:3
  3. 勾选 Enable Input Probe Activity Detectors前面的复选框

(2)单击“PROBE_IN Ports(0..0)”标签,如图所示,在该标签页中,按如下参数进行设置

(3)单击“PROBE_OUTPorts(0..2)”标签,如图所示,在该标签页中,按如下参数进行设置。

第五步:单击【OK】按钮,退出“Customize IP”对话框。

第六步:弹出“Generate Output Products”对话框。

第七步:单击【Generate】按钮,退出“Generate Output Products”对话框。

第八步:在“Sources”窗口中,单击“IP Sources”标签。在该标签页中,可以看到添加了名字为“vio_0”的IP核实例,如图所示。找到并展开“vio_0”选项。在展开项中,找到并展开“Instatiation Template”选项。在展开项中,选择并用鼠标左键双击vio_0.veo,打开其例化模板,如下述代码所示。

  1. //-----------BeginCuthereforINSTANTIATIONTemplate---//INST_TAG
  2. vio_0your_instance_name(
  3. .clk(clk),//inputwireclk
  4. .probe_in0(probe_in0),//inputwire[5:0]probe_in0
  5. .probe_out0(probe_out0),//outputwire[0:0]probe_out0
  6. .probe_out1(probe_out1),//outputwire[0:0]probe_out1
  7. .probe_out2(probe_out2)//outputwire[0:0]probe_out2
  8. );

第九步:在“Sources”窗口中,单击“Hierarchy”标签。在该标签页中,找到并展开“Design Sources”选项。在展开项中,找到并用鼠标双击top.v文件,按下述代码修改设计代码,并添加vio的例化代码。

  1. `timescale1ns/1ps
  2. //
  3. //Company:
  4. //Engineer:
  5. //
  6. //CreateDate:2021/08/222358
  7. //DesignName:
  8. //ModuleName:top
  9. //ProjectName:
  10. //TargetDevices:
  11. //ToolVersions:
  12. //Description:
  13. //
  14. //Dependencies:
  15. //
  16. //Revision:
  17. //Revision0.01-FileCreated
  18. //AdditionalComments:
  19. //
  20. //
  21. moduletop(
  22. inputclk,
  23. inputa,
  24. inputb,
  25. outputreg[5:0]z
  26. );
  27. reg[5:0]z_tmp;
  28. wire[5:0]z_vio;
  29. rega_tmp,b_tmp;
  30. wirea_in,b_in;
  31. wiresel;
  32. wirea_vio,b_vio;
  33. assigna_in=sel?a:a_vio;
  34. assignb_in=sel?b:b_vio;
  35. assignz_vio=z;
  36. vio_0Inst_vio(
  37. .clk(clk),//inputwireclk
  38. .probe_in0(z),//inputwire[5:0]probe_in0
  39. .probe_out0(sel),//outputwire[0:0]probe_out0
  40. .probe_out1(a_vio),//outputwire[0:0]probe_out1
  41. .probe_out2(b_vio)//outputwire[0:0]probe_out2
  42. );
  43. always@(posedgeclk)
  44. begin
  45. a_tmp<=a_in;
  46.  b_tmp<=b_in;
  47. end 
  48. always @(*)
  49. begin
  50.  z_tmp[0]=a_tmp & b_tmp;
  51.  z_tmp[1]=~(a_tmp & b_tmp);
  52.  z_tmp[2]=a_tmp | b_tmp;
  53.  z_tmp[3]=~(a_tmp | b_tmp);
  54.  z_tmp[4]=a_tmp ^ b_tmp;
  55.  z_tmp[5]=a_tmp ~^ b_tmp;
  56. end 
  57. always @(posedge clk)
  58. begin
  59. z<=z_tmp;
  60. end 
  61. endmodule

第 十 步 :保 存 该 设 计 文 件 。


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/704315
推荐阅读
相关标签
  

闽ICP备14008679号