使用Quartus开发FPGA,这里建立一个简单的LED工程;

1 新建项目

1.1 项目设置

打开Quartus,点击File -> New Project Wizard,然后根据向导选择项目的路径,项目名字,顶层模块名称;

1.2 器件选择

在device设置页面,选择硬件型号,这里使用的 Cyclone系列,型号 EP13CT144C8;

1.3 工具选项

在EDA Tools设置中选择 simulation为ModelSim;

2 编写Verilog模块

2.1 新建Verilog代码

点击 New -> Verilog HDL File,新建一个文件,再写一点东西进行保存;

2.2 编写模块

这里编写一个简单的LED闪烁示例,闪烁频率为 400ms,按照 300ms 亮-> 100ms 灭交替进行;

2.2.1 时钟

硬件的板子晶振为25MH,为了简单看看IP核使用,我们使用FPGA的PLL来生成一个20MHz的时钟:

  • 点击 Tools -> MegaWizard Plug-In Manger 工具;
  • 选择 IO/ -> ALTPLL,文件类型为 Verilog HDL;
  • 输入时钟为25MHz;
  • 不需要复位和lock信号;
  • 时钟从25MHz到20MHz,因此需要设置为 MUL:4 , DIV:5,这样先倍频再降频到需要的值;
  • 生成PLL核Verilog文件后,打开文件并根据PLL端口在工程中例化一个:
1
2
3
4
5
6
wire sysclk;

pll m_pll(
.inclk0(clk),
.c0(sysclk) //20MHz
);
2.2.2 计数器

为了能达到400ms进行亮灭变化,需要计数器计数,时钟为20MHz,即周期为 50ns,这样只需要计数8000_000个即可达到LED闪烁需要的周期,然后分别在计数值为0和6000_000时候分别亮和灭即可;实现示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
always @(posedge sysclk or negedge rstn)
begin
if(!rstn) begin
cnt <= 0;
led <= 1'b0;
end else begin

if(cnt == 0) begin
led <= 1'b1;
end
//else if(cnt == 3'd6) begin //for test
else if(cnt == 24'd6000_000) begin
led <= 1'b0;
end

cnt <= cnt + 1;

if(cnt == 24'd8000_000) begin
cnt <= 0;
end

end
end

3 编译

  • 点击 start Analysis & Synthesis 进行分析综合电路,可以先使用这个选项分析代码是否正确;

  • 点击 start compilation 进行综合、布局布线、FPGA编程文件等整个过程;

4 仿真

设计好模块后,一般先进行一次仿真,看是否符合预期;

为了减小仿真时间,先把计数减小,仿真正确后再改回以在硬件上测试;

  • 编写Testbench

编写如下测试激励:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

`timescale 1ns/1ns

module tb();

reg clk;
reg rstn;
wire sysclk;//clk from pll

always #20 clk = ~clk;

initial begin
clk = 0;
rstn = 1;
@(posedge sysclk); //wait pll clk ok
$display("reset...");
rstn = 1'b0;
repeat(5) @(posedge sysclk);
rstn = 1'b1;
#1000000000;

end

top m_top(
.clk(clk),
.rstn(rstn),
.clko(sysclk),
.led()
);

endmodule

主要生成一个25MHz的时钟和一个复位信号;

  • 仿真

点击项目设置,在EDA Tools设置中的simulation中选择 compile test bench,然后把编写的testbench文件添加进来,testbench name 要注意一样:

然后点击tools -> run simulation tool -> RTL simulation,打开仿真查看波形:

注:

(1)仿真时候,如果testbench产生的时钟和PLL输入时钟不相等时候,会出现PLL输出时钟不正确;

(2)PLL输出时钟需要等待一定的时间才能输出;

5 分配引脚

  • 点击Pin Planner工具,进行引脚分配

在location位置,选择每个端口对应硬件的引脚进行分配;

6 硬件烧写测试

6.1 使用USB Blaster烧录
  • 点击Programmer,打开烧写工具
  • 在Hardware Setup中选择硬件连接的USB设备;
  • Mode选择烧写模式:
    • Active Serial Programming 为烧写到EPCS芯片掉电不会丢失,需要烧写的文件为pof;
    • JTAG模式为烧写到FPGA,掉电会丢失,下载文件为sof;
6.2 实际测试

测试波形时间,可以看到与预期一致: