首页->【京微雅格FPGA助学小组】

183 0

一、创建工程和工程属性设置

1. 打开Primace8.0.2软件,Project菜单 ——> New Project...命令; "Project Directory:"选择工程目录所在目录(软件会在该目录下创建工程目录); "Project Name:"指定工程名称为pll_test(软件创建的工程文件夹和工程文件名均为pll_test); "Top Module Name:"指定用户工程的顶层文件名为pll_test(改名称用户也可临时指定,工程建好后也可以很方便的更改); "Design Files"设计文件,用户可以现在添加所需要的文件,用户也可以建好工程后再添加,这里先不添加设计文件; 单击Next按钮进入下一个设置界面

blob.png

2. 器件选择:"Family"选择"M5"; "Device Type"选择"FPGA+SRAM+MCU"; "Package"选择"LQFP144"; "Flash"选择"4M bits Flash"; "Operation Condition"选择软件默认值; 单击Finish按钮完成工程新建

blob.png

3. 工程属性设置: 

1). Project菜单 ——> Project Setting...命令——> General子选项, 主要用于设置: 工程顶层文件名、工程文件管理、仿真顶层文件和仿真文件管理(后面仿真章节具体介绍)

blob.png

2).  Project菜单 ——> Project Setting...命令——>Device子选项,用于器件和运行条件的设置,具体参见新建工程是的介绍,完全一样

blob.png

3). Project菜单 ——> Project Setting...命令——>Logic Flow子选项, 主要用于设置逻辑综合的优化策略和选项:

  • "Optimization Goal": 默认为"speed"模式,综合工具会按照最快速度来优化设计; "area"模式,综合工具会按照最小面积来优化设计; "balanced"模式,综合工具会按照速度面积平衡模式来优化; "fast"模式,综合工具会按照最快的软件综合执行时间来执行;

  • "Enable RAM Extraction":默认不大开; 当打开这个选项软件会自动映射符合Primace语法的 RAM RTL到BRAM;

  • "Use DSP Block":默认为"auto",该选项用于使能是否自动映射硬件DSP或乘法器

  • "Pack I/O registers into IO": 该选项用于控制是否将寄存器映射到IO内部

  • "Timing Estimation":该选项用于控制是否打开综合后进行时序分析,有助于优化组合逻辑

  • "Advanced"用于一些高级综合优化设置

    "Enable Primitive Optimization": 使能元件优化

    "Enable Carry Chain Optimization": 使能进位链优化

    "Enable Collapse Constant Adder": 使能拆解常数加法器或计数器,当使能该选项时,设计中所有的常数加法器(比如该设计中的计数器)都将使用LUT4而不是LUT4C进位链完成,总的LUT4消耗个数会增加54%,所以不到万不得已不建议勾选该选项;通过控制下面的"Collapse Adder if Width<="的方案更好

  • "Enable Collapse Constant Comparator"使能拆解常数比较器(比如设计中的各种常数比较器)

  • "Enable Register Optimization": 使能寄存器优化,优点是可以帮助减少寄存器的消耗,缺点是会让fmax变慢

  • "Enable Identical Instance Optimization": 使能相同的例化优化

  • "Collapse Adder if Width<=":综合工具会将小于等于指定宽度的加法器用纯LUT4实现(优点是会减少LUT4C的消耗,缺点是会增加LUT4的消耗),大于指定宽度的加法器用LUT4C进位链来实现(优点是可以减少LUT4的消耗,缺点是会消耗LUT4C进位链);用户可以通过增加这个参数值来减少LUT4C的消耗,用于解决设计中LUT4C资源不足问题

  • "Minimum Clock Enable Fanout": 综合工具会将小于等于这个扇出值的时钟使能信号通过寄存器的输入端来实现,将大于该扇出值得时钟使能信号通过专用时钟使能绕线资源来绕线; 

  • "Shift Register": 使能移位寄存器自动映射到EMB存储器(EMB5K),这个选项主要用于帮助减少设计中大量的大深度大位宽的pipeline寄存器的占用寄存器多时序差的问题;"Enable Merge": 将会把设计中同样深度的一位寄存器映射到同一个EMB,这将有助于减少EMB的消耗,推荐勾选; "Minimum Register Number": 综合工具将会把大于等与这个参数值的寄存器阵列(移位寄存器的宽度乘以深度)

blob.pngblob.png

4). Project菜单 ——> Project Setting...命令——>Physical Flow子选项, 主要用于设置Bitstream生成; "Unused IO's default state": 没用使用的IO的状态控制,默认是高阻; "Encryption Key": AES加密的密钥,M5为128位(32位HEX); "Output Formats": 默认是BIN格式,二进制格式; "JTAG"为明文格式,只能下载到FPGA的配置RAM; "SPI"为明文格式,只能下载到片上或偏外的Flash; "HEX"为Intel的格式; "Enable read protection": 使能该选项将禁止用户通过JTAG读回FPGA配置文件

blob.png


二、创建PLL IP

1. Tools菜单 ——> Wizard Manager, 选择"Create a new design",单击Next按钮进入下一个GUI界面("IP cores"界面)

blob.png

2. 在"IP cores"界面下,选择"FPGA Features"类型IP下的"Phase-Locked Loop(v1.0b)", 单击Next按钮进入下一个GUI配置界面(PLL参数配置界面)

blob.png


3. 指定PLL IP的"Module name"为"MyPll", "Currently selected language"为"Verilog" 语言,单击Next按钮进入下一个GUI界面(PLL参数配置界面)

blob.png

4. 指定PLL的输入时钟频率(主要是为了让软件计算合理的PLL倍频和分频参数,使PLL的VCO满足datasheet规定的范围),"clkin's frequency"为"20"(20Mhz的外部输入时钟,注意时钟必须得从Global Clock Pin输入才能获得更加的时钟质量,M5一共有8个Global Clock Pin);"clockout0"复选框始终是勾选的,如果需要更多的时钟输出,可以勾选clockout1-3, 用户最多可以获得PLL的4个独立时钟输出频率,更具体可参考M5的器件数据手册的时钟部分;"Power mode"选择"always_on"(用户也可选择由MCU或者Fabric来控制PLL是否关闭来省电);"Location"选择"auto"(软件自动选择);单击Next按钮进入下一个GUI界面(PLL参数配置界面)

blob.png

5. 指定PLL的"clockout0"为"150"(150Mhz),用户可以自己手动指定PLL的分频系数(需要仔细计算VCO的频率范围是否在有效范围内);单击Finish按钮完成PLL IP配置

blob.png

6. 弹出IP Summary窗口,单击OK按钮,完成PLL IP的配置

blob.png


三、创建Debugware IP(嵌入式逻辑分析仪)

1. Tools菜单下 ——> Wizard Manager(或工具栏快捷按钮"blob.png"), 选择"Create a new design",单击Next按钮进入下一个GUI界面("IP cores"界面)

blob.png

2. 在"IP cores"界面下,选择"System"类型IP下的"Debugware(v2.1a)", 单击Next按钮进入下一个GUI配置界面(Debugware参数配置界面)

blob.png

3. 指定"Module Name"为"MyDebugware",文件语言为"Verilog", 单击Next按钮进入下一个GUI配置界面(Debugware参数配置界面)

blob.png

4. 指定"Number of LA Cores"为"1", 单击Next按钮进入下一个GUI配置界面(Debugware参数配置界面)

blob.png

5. 指定Debugware的数据采样宽度"Date Width"为"40", 储存深度"Memory Depth"为"512"(深度越深,消耗FPGA的BRAM的个数就越多!), 单击Finish按钮完成IP配置blob.png


四、工程文件pll_test.v

代码如下:

module pll_test(
  clk,
//  reset,
  led,
clkout0
  );
inputclk;
//inputreset;
output[1:0]led;
output clkout0;
wire clk;
wire clk0;
wire clk1;
wire clk2;
reg [25:0]cnt;
assign led = cnt[25:24];//reset? 2'b00 : 2'b11;
assign clkout0 = clk0;
//------------------------------------------
//晶体时钟例化
//MyOscillator uut_myOscillator (
//.clkout(clk)//11.0592MHz晶体输入时钟
//);
MyPll myPll_u(
.clkin  (clk),
//.pwrdown  (reset),
.clkout0(clk0),
//.clkout1(clk1),
//.clkout2(clk2),
.locked(pll_lock)
);
  always @ (posedge clk0)
cnt <= cnt + 1'b1;
/*MyDebugware MyDebugware_u(
    .trig_out_0(),
    .data_in_0(cnt),
    .ref_clk_0(clk0)
);*/
endmodule

五、工程前仿真

注意:工程仿真时需要将MyDebugware模块注视掉,Primace8.0.2目前并没有提供该硬核IP的仿真支持!

1. 设置Modelsim的路径,以便Primace软件可以找到Modelsim的exe文件。Primace ——>Tools菜单 ——> Options命令, "Modesim Path"为"C:\modeltech64_10.2c\win64"(根据你的Modelsim安装路径来合理设置,改目录为modelsim.exe文件所在的目录)

blob.png

2. 添加pll_test_tb.v文件,文件代码如下:

`timescale 1 ns/100ps
module pll_test_tb;
reg clk;
reg reset;
wire [1:0] led;
wire clkout0;
pll_test DUT(
  .clk(clk),
//.reset(reset),
.led(led),
.clkout0(clkout0)
);
initial
begin
 clk = 1'b0;
// reset = 1'b0;
//#100 reset = 1'b1;
end
///////////////////////////////////////////////////////////////////
//
// Clock generation
//
always #10 clk = ~clk;
endmodule

3. 进行仿真工程设置: Project菜单 ——> Project Setting...命令——> General子选项,进行文件添加和各种设计名称指定。设置"Top Module Name"为"pll_test", 设置"Top Module Name of Test Bench"为"pll_test_tb", 设置"Instance Name of Design Top Name"为"DUT"(注意这个名称主要是后仿真才会用,前仿真/行为仿真是不需要指定的)

blob.png

4. 进行前仿真/行为仿真: Flow菜单下 ——> Simulation ——> RTL Simulation, 

然后在Modelsim中运行100us时间,波形图如下:

blob.png


六、综合工程与添加IO位置约束和时序约束SDC

1. 综合工程: Flow菜单 ——> "Run Synthesis"命令(或者键盘"F4"快捷键,或工具栏快捷按钮"blob.png"),综合完成后,会产生资源使用报告

blob.png

2. "IO Editor"对IO位置和属性进行设置: Tools菜单 ——> "IO Editor"命令(或工具栏快捷按钮"blob.png");在"Location"列输入Pin Number(qfp/qfn封装为直接阿拉伯数字,BGA封装为常用"字母+数字",跟pinlist数据手册命名是一致的);信号电平标准"IO Standard"列统一设置为“3.3V LVTTL”(注意同一个Bank的IO只能接受一种电平标准); 输出信号的驱动电流"Drive Strength"统一设置为"12mA";其他的IO属性如:Fast IO(寄存器 IO,减少寄存器到pin的delay)、Bus Keeper(上下拉电阻,注意M5器件上电配置期间时,所有IO将保持短暂的三态弱上拉!然后进入用户控制的状态;M7/HR器件上电配置期间所有IO保持三态状态)

blob.png

3. 添加时序约束sdc文件

1). Primace支持业界标准的synopsys sdc约束: Tools菜单 ——> "Timing Constraints Editor"命令(或工具栏快捷按钮"blob.png"),然后选择"Creat a new SDC file"

blob.png

2).  设置时钟约束: 鼠标双击"Object"列的空白行,选择“Pin”——> "myPll_u_JS_PLL_u0/clkout0"(PLL的0输出,该名称为verilog的例化后的带例化名称的信号名称) 

blob.png

3). 输入约束时钟周期为: "6.667"(单位为ns),也可以直接输入时钟频率为: "150"(单位为Mhz)

blob.png

4). 其他常用时序约束如:Generated Clock(比如用fabric实现分频就需要约束时钟,一般频率超过50Mhz就必须约束)、Input Delay/Output Delay(时钟频率超过50Mhz,就需要设置,比如SDRAM就需要设置,当然也可以在IO Editor中开启IO模块中的寄存器功能——"Fast IO",来减少IO delay)、Max Delay(输入管脚到输出管脚的组合逻辑delay)、False Path(跨时钟域需要让软件不要分析已经经过用户处理的跨时钟域信号间的时序,用户一般可以用寄存器打2拍以上来降低跨时钟域的亚稳态发生,该技术属于FPGA的常用处理跨时钟信号的方法)。该设计为涉及到这些约束,所以这个工程中我们只进行了PLL的输出时钟约束。

5). 保存约束文件pll_test.sdc,并添加到工程

blob.png


七、编译整个工程生成下载文件并进行时序分析

1. 编译整个工程: Flow菜单 ——> "Run Project"命令(或者键盘"F9"快捷键,或工具栏快捷按钮"blob.png"按钮),工程编译完成后,会产生最终的资源使用报告(包括Flow Summary、综合、布局、布线4部分),Placer部分如下(有助于用户根据具体的使用率来改善代码提高主频)

blob.png

2. 时序分析: Tools菜单 ——> "Timing Analysis"命令(或工具栏快捷按钮"blob.png"按钮. 如果有时序问题会在时序分析GUI界面的左侧栏看到红色字体提醒,告知不满足时序的路径。

1) Clock Summary: Setup Summary,没有违规路径

blob.png

2). Clock Summary: Setup Summary,在Clock Name下面的时钟行"myPll_u_JS_PLL_u0/clkout0"鼠标右键,然后选则"Top 20 paths by slack"(也可以选择"All paths列出所有路径,工程如果比较大,会占用比较大的内存,运行时间也会比较久"), 软件会按照Slack从小到大列出时序最差的20条路径(slack值大于0就说明满足时序;如果slack值小于0,就说明该条路径不满足时序,字体颜色也会显示为红色); 另外注意“Start Point”和"End Point"列下为寄存器或时序元件的名称,如第一行为寄存器cnt[3]到cnt[19]的时序路径分析(名称要去掉_reg和最后一个/后面的名称)

blob.png

3). Clock Summary: Setup Summary,鼠标右键第一行"cnt_reg[3]/mclk_b",可以选择"Locate in Netlist Viewer(Post-Routing)"(便于用户分析寄存器到寄存器之间的组合逻辑的级数,用户可以优化组合逻辑提高主频或者设置不同的编译优化选项),也可以选择"Locate in Chip Editor"(用户可以看到两个时序元件之间的布局情况,有时用户可以自己手动固定位置来解决时序问题)

blob.png

blob.png

4). Clock Summary: Hold Summary,分析方法跟Setup Summary类似

5). Datasheet Report:Setup Times和Hold Times在用户指定了Input/Output Delay约束后会有Report出来

6). Datasheet Report:Max/Min Clock to Output Delay在用户指定了Input/Output Delay约束后会有Report出来

7). Datasheet Report:Max/Min Pad to Pad Delay在用户指定了Max Delay约束后会有Report出来

8). Timing Analysis: Report by Slack...用户可以按照slack大小来列出设计中各个时钟域的所有路径,用户需要指定开始时钟"Launch Clock"和上升下降沿、采样时钟"Capture Clock"和上升下降沿, 该方法可以帮助用户搜索设计中的跨时钟域信号,确认是否有潜在的时序问题,也可以帮助用户更快速的定位大型设计的时序问题

8). Timing Analysis: Report by Path...在Report by Slack...的基础上增加按照时序终点"End Point"来快速的定位更加具体的时序路径


八、下载工程到开发板验证功能

1. 下载工程bit文件到目标板卡: Tools菜单 ——> "Downloader"命令(或者键盘"Ctrl+Alt+D"快捷键,或工具栏快捷按钮"blob.png"按钮);软件默认勾选了"Verify"选项(高选项主要是为了在每个下载的数据包进行读回矫正,下载时间会增加一倍,如果用户在量产或调试时需要更快的下载时间,用户也可以不勾选这个选项,加快下载时间);"Setting"按钮用于设置JTAG cable是本地USB, 用户也可以指定为服务器模式,Download支持网络远程下载(比如可以通过局域网在其他的计算机上来调试,更加方便大型FPGA团队的调试,类似打印机的原理); "Detect Devices"按钮用于调试, 帮助用户定位是否能够发现FPGA器件,一般用于板卡的硬件调试用; "Refresh"按钮用于刷新下载acf文件的文件日期或大小等格式; "Specify the target:"主要是用于JTAG链上的Device选择,该工程列出两个JTAG device:M5(FPGA器件)和VIRTUL-JTAG(硬核8051),用户只能选择M5器件,VIRTUL-JTAG主要是给硬核8051的Keil来用的; "Address"当时单镜像配置时,地址必须是"0", 用户也可以根据自己的需要烧录用户数据,用户可以指定用户没有用到的空白Flash的扇区烧录用户数数据,用户也可以烧录多镜像FPGA的配置文件,实现M5的多镜像配置; "Erase Flash"按钮用于擦出整个Flash的所有内容; "Program"按钮用于烧写用户选择的下载文件,用户可以从Console串口看到一些Log信息,在少些程序前,软件会先根据用户下载文件所需的大小来擦出所需要的扇区(SPI NOR Flash每个扇区的大小是64KB), 需要几个扇区就会先擦出几个扇区, 擦出完毕才会执行写入Flash的命令

blob.png

2. 验证板卡为一款M5的QFP144的老开发板,下载后会发现开发板上的两个LED灯交替闪烁,另外也可以通过示波器测量PLL的输出clkout0频率为149.998Mhz(200Mhz带宽,2G采样率的Tek示波器TDS2022)

3. 整个设计的工程文件: pll_test.rar

pll_test.rar


九、Debugware对设计记过进行分析

1. 将注释掉的顶层文件的Debugware模块打开

2. Debugware的使用方法见:http://group.chinaaet.com/254/4100029874

3. Debugware的运行结果如下图,另外由于采样深度是512, 所以不能只能看到25位计数器cnt的低9位

blob.png

4. 带Debugware版本的工程: pll_test_debugware.rar

pll_test_debugware.rar


作者于2017-03-31 17:09:09修改!
楼主可见