上文描述了DDS在Gowin的创建、编写和综合,本文将继续介绍DDS在Gowin&modelsim的仿真、以及在combat上板的过程。
接着上一节的内容,在Gowin成功综合后,接下来联合modelsim进行仿真。联合仿真需要在modelsim中编译Gowin的库。
附上上一篇链接:基于FPGA的DDS在Gowin和combat开发板的实现(一)
目录
一、编译库
Gowin联合modelsim进行仿真,首先在modelsim中添加源文件和testbench文件,再进行编译和仿真。由于Gowin的ip core仅在对应平台里使用,modelsim无法获取Gowin的ip core内部的运行逻辑结果,无法直接进行仿真,需要进行Gowin库的编译。
1. 创建文件夹
首先要在modelsim软件目录下创建gowin文件夹,再在gowin文件夹下创建gw2a。如图所示:
2. 修改目录
打开modelsim,修改目录,在此处选择刚才创建的文件夹
3. 编译库
1)新建library
新建library,命名为prim_sim,点击OK
此时这里是empty
2)compile建立的库
选中prim_sim,接下来编译库,点击compile->compile..
library选择prim_sim,查找范围选择Gowin下gw2a库文件
(如本文选择F:\Gowin\Gowin_V1.9.7.06Beta\IDE\simlib\gw2a)
点击compile, “compile”后modelsim界面左下有百分比进度条,100%后点击“done”,完成编译库
二、Modelsim仿真
1. 添加文件
在modelsim新建工程->添加文件(之前在高云综合的.v文件我复制在了modelsim/project目录下;tb文件需要新建,我也放在了相同目录下,因此这里直接添加)。
这里附上仿真文件(DDS_tb.v):
`timescale 1ns/1ps
module DDS_tb;
reg clk;
reg rst_n;
wire [11:0] Data;
reg [1:0] Mode_Sel;
reg [1:0] fword_sel;
DDS DDS0 (
.clk (clk),
.rst_n (rst_n),
.Mode_Sel (Mode_Sel),
.fword_sel (fword_sel),
.Data (Data)
);
initial clk = 1;
always #5 clk = ~clk;
initial begin
rst_n = 0; //combat开发板复位低有效
Mode_Sel=0; //正弦波
fword_sel=0;
#1000
rst_n = 1;
end
endmodule
2. 编译compile
空白处右键编译选择compile all
3. 仿真Simulation
1)编译成功后“Statuts”处由蓝色问号变为绿色对勾。之后选择Simulate->Start Simulation。
2)Design处选择work下tb文件,去掉“Enable optimization”处的对勾。(不要点击OK,还要添加库!)
在libraries处,添加库(本文为F:\modelsim\gowin\gw2a\prim_sim),完成后点击OK
3)弹出仿真界面,右键添加wave
仿真成功,出现波形。如下:
三、上板
本文使用的是国产高云半导体combat开发板(GW2A-LV18PG484C7/16)
1. 配置管脚
首先需要配置管脚,它有两种方法,一种是双击FloorPlanner,设置相应管脚
另一种是添加.cst约束文件,手动输入。在这里附上本文使用的约束文件:
//Copyright (C)2014-2021 Gowin Semiconductor Corporation.
//All rights reserved.
//File Title: Physical Constraints file
//GOWIN Version: 1.9.7.06Beta
//Part Number: GW2A-LV18PG484C7/I6
//Device: GW2A-18
//Created Time: Thu 07 08 14:17:49 2021
IO_LOC "Data[11]" AB14;
IO_PORT "Data[11]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "Data[10]" AB13;
IO_PORT "Data[10]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "Data[9]" AA15;
IO_PORT "Data[9]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "Data[8]" AB15;
IO_PORT "Data[8]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "Data[7]" AA16;
IO_PORT "Data[7]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "Data[6]" AB16;
IO_PORT "Data[6]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "Data[5]" AB18;
IO_PORT "Data[5]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "Data[4]" AB17;
IO_PORT "Data[4]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_PORT "Data[3]" IO_TYPE=LVCMOS33;
IO_PORT "Data[2]" IO_TYPE=LVCMOS33;
IO_PORT "Data[1]" IO_TYPE=LVCMOS33;
IO_PORT "Data[0]" IO_TYPE=LVCMOS33;
IO_LOC "DA_clk" AB19;
IO_PORT "DA_clk" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "fword_sel[1]" AB22;
IO_PORT "fword_sel[1]" IO_TYPE=LVCMOS33 PULL_MODE=UP;
IO_LOC "fword_sel[0]" W20;
IO_PORT "fword_sel[0]" IO_TYPE=LVCMOS33 PULL_MODE=UP;
IO_LOC "Mode_Sel[1]" V20;
IO_PORT "Mode_Sel[1]" IO_TYPE=LVCMOS15 PULL_MODE=UP;
IO_LOC "Mode_Sel[0]" R19;
IO_PORT "Mode_Sel[0]" IO_TYPE=LVCMOS15 PULL_MODE=UP;
IO_LOC "rst_n" U20;
IO_PORT "rst_n" IO_TYPE=LVCMOS15 PULL_MODE=UP;
IO_LOC "clk" M19;
IO_PORT "clk" IO_TYPE=LVCMOS33 PULL_MODE=UP;
推荐读者直接添加.cst文件,省去查管脚的步骤
2. 布线
双击Place&Route完成布线,成功后显示如图所示绿色对勾
3. 烧录
将开发板连接至电脑,双击“Program Device”,将程序烧录到开发板中
这时还未生成.fs文件,如图所示。
需要将此界面关闭,然后再次点击“Program Device”,发现已自动生成的.fs文件,点击“Program”,烧录成功
4. 生成波形
在示波器可以观测到生成的正弦波、方波、锯齿波、三角波,并且可以通过开发板上开关进行频率和波形的切换。附上波形
本系列文章DDS波形实现过程至此结束。此外,就操作过程中的注意事项和常见问题,我们也汇总了一篇文章,可供参考。