来自 博主:coyoo

来源:互联网 发布:扛旗世界纪录 知乎 编辑:程序博客网 时间:2024/04/30 05:19

 

FPGA高手

http://blog.ednchina.com/coyoo/

 

收藏一个EDA学习网站

http://www.doulos.com/knowhow/fpga/

就像网站自己所说的那样:Developing & Delivering KnowHow

 

重写异步复位同步释放之VHDL

你可以在这里找到FPGA、ARM、HDL、甚至TCL/TK以及Perl等。

 

        之前有两篇关于异步复位同步释放的帖子,其中讨论用VHDL实现的想再在此议议。

        我们确定在此只讨论复位信号‘1’有效的情况。

        最初那篇帖子里代码如下:

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;


entity Rst_Async2Sync is  
    port (
      clkin :            in std_logic;
    async_rst :          in std_logic; 
    sync_rst :         out std_logic  
     ); 
end Rst_Async2Sync;
       
architecture rtl of Rst_Async2Sync is
signal Sync_rst1,Sync_rst2: std_logic;
begin

process(clkin,async_rst)
begin
   if async_rst='1' then
      Sync_rst1 <= '1';
   elsif clkin'event and clkin='1' then
      Sync_rst1 <= '0';
   end if;  
end process;
process(clkin,async_rst)
begin
   if async_rst='1' then
      Sync_rst2 <= '1';
   elsif clkin'event and clkin='1' then
      Sync_rst2 <= Sync_rst1;
   end if;  
end process;
sync_rst <= Sync_rst2;

end ;

上述代码编译后map view如下:

点击看大图

从上图我们可以看到工具插入了三个not gates(如红方格)。

 

 

把上述代码稍作修改如下:

process(clkin,async_rst)
begin
   if async_rst='0' then
      Sync_rst1 <= '0';
   elsif clkin'event and clkin='1' then
      Sync_rst1 <= '1';
   end if;  
end process;
process(clkin,async_rst)
begin
   if async_rst='0' then
      Sync_rst2 <= '0';
   elsif clkin'event and clkin='1' then
      Sync_rst2 <= Sync_rst1;
   end if;  
end process;
sync_rst <= Sync_rst2;

那么编译后map view看到:

点击看大图

这次工具没有插入任何not gates。

 

控制FPGA上电、配置以及初始化时间

      有些系统有上电顺序要求,这里要讨论的不是各种电源的上电顺序(电源上电顺序可以通过电源管理芯片实现),而是如何控制系统中不同主芯片开始工作的顺序。比如这么一个系统,硬件设计为PCI的插卡,板卡主要包含ETX(或者x86等CPU)以及FPGA,由于一般PCI接口通过FPGA来控制实现,所以如果系统上电后FPGA的配置、初始化时间太长势必影响到板卡CPU对于PCI总线接口的访问,而且大部分情况下系统要求CPU通过PCI卡对系统进行一些初始话等等配置的过程,如果FPGA“起来”太慢肯定会影响系统的配置。当然这个问题可以通过电源管理实现FPGA先上电、CPU后上电来解决,不过这里我想通过FPGA的内部的一些特性来试图解决这个问题。

        要解决这个问题首先要了解FPGA上电初始化过程,这里我们是以ALTERA的ArriaGX的AS模式来进行研究。

第一步控制POR时间        

       FPGA的AS配置主要分为三个过程:复位、配置和初始化过程。在配置之前,还有一个POR过程,即一上电FPGA经过一个POR后才开始整个配置流程。而POR的时间可以控制,通过控制PORSEL引脚控制POR的时间,当PORSEL接高时POR的时间大概是12ms,当PORSEL接低时POR的时间大概是100ms。

第二步控制配置、初始化时间

      POR之后,FPGA进入正常的配置过程。下面来详细研究这个三个过程,看看那些地方用户可以进行控制。

      首先,这复位过程是 在POR的时候就开始了,POR的时候nconfig和nstatus均为低电平,进入复位过程,POR结束后FPGA释放nconfig信号,nconfig信号被外部上拉电阻拉高,由此进入配置过程。

       其次配置过程,FPGA产生DCLK时钟,在该时钟的同步下FPGA向配置芯片发送配置命令或者地址以及读取配置数据。而DCLK可以有两种速度,一种20Mhz,另一种40Mhz,且对应的配置方式分别叫AS和Fast AS。只有容量EPCS16及以上的配置芯片支持Fast AS。所以通过提高DCLK时钟速率从而达到减少配置时间的目的。

     最后初始化过程,当所有的配置数据传输完毕以后,FPGA释放config_done信号,该pin被外部10K欧姆电阻上拉到高,FPGA是检测到CONFIG_DONE为高电平后进入到初始化过程。FPGA的初始化时钟源有两种选择,一种是FPGA内部产生DCLK的晶体分出的一个10Mhz的时钟,另一个是通过CLKUSR引脚控制可选时钟。默认情况下FPGA采用内部10Mhz时钟作为初始化时钟,如果要采用第二种时钟,则首先要做QII软件中使能Enable user-supplied start-up clock (CLKUSR) 选项(Settings->Device->Device and pin options...->General->本选项),如下图所示:

点击看大图

当上面可选项被使能以后CLKUSR引脚将作为FPGA初始化时钟源,用户可以在外部给该引脚提供一个时钟用来控制初始化时间。在这种情况下FPGA总共需要299个时钟周期完成初始化,CLKUSR支持最高时钟是100Mhz。Altera没有提供默认情况下初始化的时间(即官方没有提供默认情况下经过多少个10Mhz时钟周期完成初始化),所以一般使能CLKUSR是用来推迟FPGA退出初始化的时间,这里是研究能否通过CLKUSR来减少FPGA的初始化时间,这就必须要求我们获得Altera的官方的默认情况下FPGA的初始化时间。

下图是AS配置模式时序图:

点击看大图

关于上图中初始化时间即tcd2um在配置手册上有一个表里有最大和最小数据分别是100和20,但是该表没有单位,参考PS模式相应的参数,应该是us。也即默认情况下初始化时间最少也要20us,那么使能CLKUSR后初始化最小时间是多少呢?给出公式如下:

tCD2CU + (299 ×CLKUSR period)

上式中tCD2CU为从CONFIG_DONE变高到CLKUSR被使能的时间,手册上AS模式下给出的时间是100ns,所以上式最小值应该是100+299x10=3090ns,即不到4us。

 

     上面讨论的是如何减少FPGA的配置、初始化时间,当然有些应用场合可能需要增加该时间,同样通过以上反过程可以达到目的。

 

如何加密转移自己的设计

 

 

        有个在研究所的朋友(做雷达的)有个项目要跟另外一个研究所合作,也就是共同在同一块FPGA上进行开发,各自设计功能模块都很独立,向我询问如何将他的设计安全转移给兄弟所。

        给他介绍了两种方法,现在在这里也做简单的介绍:

        1、第一种方法是使用增量编译,将自己的设计作为一个子模块或者分区(partition),设计完成以后生成一个QXP文件传递给合作单位。具体的操作方法,有时间可以专门弄一篇介绍增量编译的文章。

         2、第二种方法是将自己的设计编译生成VQM网表文件传递给合作单位。具体做法首先在sttings里按照下图选中生成VQM选项,这样我这位朋友的设计就是生成一个叫做*.vqm的网表文件

点击看大图

其次是对于使用网表者,可以把当作一般的子模块来调用,如果是VHDL,则进行component例化以及调用,当然网表提供方要提供网表顶层的管脚定义说明,如果没有,直接打开vqm文件也可以看得到。另外,使用网表文件方还要将网表文件加入到工程。

       3,第三种方法跟第二种方法类似,就是通过第三方综合工具生成网表文件,所以工程中对于需要保密的部分就做成黑盒子(black box).第三方综合工具生成的网表文件一般是EDF文件,使用的时候将EDF文件放到工程目录即可,工程中安装第二种方法在设计中调用黑盒子即可.

       在QII工程中还应指定产生网表的第三方综合工具,可以在settings->EDA Tool Settings->Design Entry/Synthesis->Specify options for processing input files created other EDA tools中指定Tool name,如下图所示:

点击看大图

 

概述:

         总结一些使用QuartusII软件的小经验,有些技巧性的东西很久不用或者不是经常用到很容易就忘掉,等到用到再到处查找确实费时费力。

       1、使用PinPlanner观察Pad

        Altera的引脚分配经常会在某些特别标准中存在一些限制,比如LVDS差分引脚周围就有至少隔多少个row pad才能配置单端引脚的限制等等。。。。

       那么我们如何确定某个pin的pad和别的pin对应的pad的关系呢?

       答案是我们可以通过PinPlanner里的一个工具来观察每个pin对应的pad。具体操作是先打开PinPlanner(不要告诉我你不知道如何打开),在PinPlanner界面选择View菜单下的Pad View即可,请参考以下二图:

图一:在PinPlanner的View菜单下打开Pad View

点击看大图

图二:Pad View界面

点击看大图

上图是放大后的Pad View,虚线分出了一个个pad row或者pad column。

 

       最后引申一下,在进行ddr设计的已经使用到的vref引脚附近必须间隔两个pad才能分配普通的pin(所谓普通的pin就是非DQ、DM以及DQS等pin)。如以下各图显示:

点击看大图

上图显示的是正确分配,led[3](N9)与vref(T6)引脚中间隔了两个pad(分别为DQS和DM),而实际中封装中他们对应的位置怎样的呢,见下图:

点击看大图

从上图其实很难看出led[3]和左边vref(T6)对于的pad位置关系,另外上图同时显示了另一个错误的分配,即P12位置分配了led[1],其与右边的vref(T11)对应的pad靠的太近所以被认为的错误的assignment。他们的pad对应图如下所示:

点击看大图

 

 

 

       2、Vhdl文件的后缀可以写成vhd也可写成vhdl;Verilog文件后缀可以写出v,也可以写成vl,也可以写成vlg,还可以写成verilog。

 

       3、你是不是偶尔会在用SignalTapII的时候发现某个信号完全被取反了呢(也即该信号与你实际中设计中赋予的值完全相反-Inverted)?!

       如果有,千万别急,不用认为是设计有问题或者认为SignalTapII有问题。其实QuartusII软件有个选项是默认打开的,即“Not Gate Push-Back”选项。该选项的设置在Settings->Anaysis&Synthesis Settings->More Settings->Existing Option Settings里面。将该选项Off掉就ok了。

        仔细看该选项的说明,可以知道,其实QuartusII编译器会在你的设计中它认为有需要的地方加上或者叫插入一个带非门输入的register,该register上电后是High有效,所以输入带Not Gate,也即是说整个设计的功能没有变化,但是这时你用SignalTapII抓却是Not Gate以后的信号。

原创粉丝点击