基于Verilog HDL和Diamond/ModelSim的FPGA开发入门——以显示译码器为例


StepFPGA有两块物美价廉的FPGA开发板:1. 基于Altra的MAX10,2. 基于Lattice的MachXO2。都比较合适于教学,现以后者为例介绍FPGA开发的入门步骤(后者的优势是Lattice的Diamond是免费的,前者可能存在的优势是该MAX10开发板有可能支持Simulink的FPGA在环(FIL)设计,有待进一步验证)。这是一篇step-by-step的学习手册,仿照即可学会。

第1部分 安装Diamond——编程、综合、仿真的集成环境

    

  • 安装Diamond
  • 将之前收到邮件中的license.dat保存到"\lscc\diamond\3.xx\license"中
  • 检查设置环境变量,确保环境变量中存在下面一项内容:

key: LM_LICENSE_FILE

value: lscc\diamond\3.xx\license\license.dat

  • 运行Diamond

第2部分 Diamond中的Verilog HDL设计——从编程到烧录

 参考“STEP-MXO2 软件手册”的15-29页。期间涉及到管脚分配环节,这部分必须看懂所用FPGA(开发板)电路原理图和芯片引脚图,否则将会无从分配,除非仅作仿真,不烧录程序。

tip: 应该仔细认真的阅读厂家提供的电路原理图,这一点对于电路原理的理解至关重要,要习惯于通过厂家的资料学习专业知识,从而消弭大学课堂学习的理论课知识和工程实践之间的障碍。如果能够指出产品设计或相关文档不完善的地方就更好了,如此便产生了与厂家工程师交流的契机,快速提高自己的实操水平。比如该开发板在驱动板载数码管时采用了直接驱动的方式,无论公共端还是各段码端都没有限流措施,可能设计者已经考虑到了核心芯片的引脚和所用数码管的内阻,能够保证安全(由于笔者没有详细查找datasheet,所以不敢妄下结论),但实际使用过程中,在静态显示时还是有一定热度,问工程师,反馈是最好做一下限流。为了使用安全,只能自己想办法,比如将公共端引脚设置为高阻状态(assign C9 = 1'bz;)的同时外接限流电阻后接地。其实这只是简单的电路知识,学过电子电路原理之后应该能够理解。

  第3部分 ModelSim中仿真

  • 仿真工具不止一种,可以使用Active-HDL,也可以使用ModeSim,前者需要单独下载安装,后者可在Diamond 3.12中直接调用,这里以后者为例。(其实都差不多,入门先学会一种也可以了,甚至包括Xilinx ISE、Quartus和Diamond之间操作上也都大同小异)
  • 正式进入ModelSim之前的工作流程可以继续参考“STEP-MXO2 软件手册”的29-35页,只是中途会有“Active-HDL”和“Modelsim”选项的差别

 

  •  进入ModelSim之后的操作如下

1. 编译所有文件,包括程序和测试文件

2. 进入仿真流程

3. 切换至Librabry选项卡,从库中找到对应系列的芯片

 

4. 切换至Design选项卡,选择相应的测试文件

 

5. 选中并添加所有将要参与仿真的信号

6. 设置单步仿真时间,并点击Run图标仿真

7. 观察波形


 程序:

module seg7 (bcd, leds, CC);
  input [3:0] bcd;
  output [1:7] leds;
  output CC;
  reg [1:7] leds;
  always @(bcd)
    case (bcd)
      0: leds = 7'b1111110;
      1: leds = 7'b0110000;
      2: leds = 7'b1101101;
      3: leds = 7'b1111001;
      4: leds = 7'b0110011;
      5: leds = 7'b1011011;
      6: leds = 7'b1011111;
      7: leds = 7'b1110000;
      8: leds = 7'b1111111;
      9: leds = 7'b1111011;
      default: leds = 7'bx;
    endcase
  assign CC = 1'b0;
endmodule

测试程序:

`timescale 1ns/100ps
module decoder_tb;
  reg [3:0] bcd;
  wire [1:7] leds;
  initial
    begin
      bcd = 4'b0000;
      #50
      bcd = 4'b0010;
      #50
      bcd = 4'b0110;
      #50
      bcd = 4'b1001;
      #50;
    end
  seg7 seg7_u1
  (   .bcd (bcd),   .leds (leds)   );
endmodule

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM