天天看點

來自 部落客:coyoo收藏一個EDA學習網站重寫異步複位同步釋放之VHDL 如何加密轉移自己的設計

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如下:

來自 部落客:coyoo收藏一個EDA學習網站重寫異步複位同步釋放之VHDL 如何加密轉移自己的設計

從上圖我們可以看到工具插入了三個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看到:

來自 部落客:coyoo收藏一個EDA學習網站重寫異步複位同步釋放之VHDL 如何加密轉移自己的設計

這次工具沒有插入任何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->本選項),如下圖所示:

來自 部落客:coyoo收藏一個EDA學習網站重寫異步複位同步釋放之VHDL 如何加密轉移自己的設計

當上面可選項被使能以後CLKUSR引腳将作為FPGA初始化時鐘源,使用者可以在外部給該引腳提供一個時鐘用來控制初始化時間。在這種情況下FPGA總共需要299個時鐘周期完成初始化,CLKUSR支援最高時鐘是100Mhz。Altera沒有提供預設情況下初始化的時間(即官方沒有提供預設情況下經過多少個10Mhz時鐘周期完成初始化),是以一般使能CLKUSR是用來推遲FPGA退出初始化的時間,這裡是研究能否通過CLKUSR來減少FPGA的初始化時間,這就必須要求我們獲得Altera的官方的預設情況下FPGA的初始化時間。

下圖是AS配置模式時序圖:

來自 部落客:coyoo收藏一個EDA學習網站重寫異步複位同步釋放之VHDL 如何加密轉移自己的設計

關于上圖中初始化時間即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的網表檔案

來自 部落客:coyoo收藏一個EDA學習網站重寫異步複位同步釋放之VHDL 如何加密轉移自己的設計

其次是對于使用網表者,可以把當作一般的子子產品來調用,如果是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,如下圖所示:

來自 部落客:coyoo收藏一個EDA學習網站重寫異步複位同步釋放之VHDL 如何加密轉移自己的設計

概述:

         總結一些使用QuartusII軟體的小經驗,有些技巧性的東西很久不用或者不是經常用到很容易就忘掉,等到用到再到處查找确實費時費力。

       1、使用PinPlanner觀察Pad

        Altera的引腳配置設定經常會在某些特别标準中存在一些限制,比如LVDS差分引腳周圍就有至少隔多少個row pad才能配置單端引腳的限制等等。。。。

       那麼我們如何确定某個pin的pad和别的pin對應的pad的關系呢?

       答案是我們可以通過PinPlanner裡的一個工具來觀察每個pin對應的pad。具體操作是先打開PinPlanner(不要告訴我你不知道如何打開),在PinPlanner界面選擇View菜單下的Pad View即可,請參考以下二圖:

圖一:在PinPlanner的View菜單下打開Pad View

來自 部落客:coyoo收藏一個EDA學習網站重寫異步複位同步釋放之VHDL 如何加密轉移自己的設計

圖二:Pad View界面

來自 部落客:coyoo收藏一個EDA學習網站重寫異步複位同步釋放之VHDL 如何加密轉移自己的設計

上圖是放大後的Pad View,虛線分出了一個個pad row或者pad column。

       最後引申一下,在進行ddr設計的已經使用到的vref引腳附近必須間隔兩個pad才能配置設定普通的pin(所謂普通的pin就是非DQ、DM以及DQS等pin)。如以下各圖顯示:

來自 部落客:coyoo收藏一個EDA學習網站重寫異步複位同步釋放之VHDL 如何加密轉移自己的設計

上圖顯示的是正确配置設定,led[3](N9)與vref(T6)引腳中間隔了兩個pad(分别為DQS和DM),而實際中封裝中他們對應的位置怎樣的呢,見下圖:

來自 部落客:coyoo收藏一個EDA學習網站重寫異步複位同步釋放之VHDL 如何加密轉移自己的設計

從上圖其實很難看出led[3]和左邊vref(T6)對于的pad位置關系,另外上圖同時顯示了另一個錯誤的配置設定,即P12位置配置設定了led[1],其與右邊的vref(T11)對應的pad靠的太近是以被認為的錯誤的assignment。他們的pad對應圖如下所示:

來自 部落客:coyoo收藏一個EDA學習網站重寫異步複位同步釋放之VHDL 如何加密轉移自己的設計

       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以後的信号。

繼續閱讀