(高清版)GB∕T 37979-2019 可編程邏輯器件軟件VHDL編程安全要求_第1頁
(高清版)GB∕T 37979-2019 可編程邏輯器件軟件VHDL編程安全要求_第2頁
(高清版)GB∕T 37979-2019 可編程邏輯器件軟件VHDL編程安全要求_第3頁
(高清版)GB∕T 37979-2019 可編程邏輯器件軟件VHDL編程安全要求_第4頁
(高清版)GB∕T 37979-2019 可編程邏輯器件軟件VHDL編程安全要求_第5頁
已閱讀5頁,還剩36頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

ICS35.080GB/T37979—2019可編程邏輯器件軟件VHDL編程國家市場監(jiān)督管理總局中國國家標準化管理委員會GB/T37979—2019 1 1 1 1 15.1例化類 1 4 8 95.5命名類 5.6運算類 5.7循環(huán)控制類 5.8分支控制類 5.9時鐘類 5.12綜合/約束類 5.13注釋類 IⅢGB/T37979—2019本標準按照GB/T1.1—2009給出的規(guī)則起草。請注意本文件的某些內容可能涉及專利。本文件的發(fā)布機構不承擔識別這些專利的責任。本標準由全國信息技術標準化技術委員會(SAC/TC28)提出并歸口。1GB/T37979—2019可編程邏輯器件軟件VHDL編程安全要求本標準規(guī)定了VHDL用于可編程邏輯器件軟件編程安全細則。本標準適用于可編程邏輯器件軟件VHDL的編程安全設計、編碼、測試及其使用。ASIC數(shù)字電路設計時也可參照使用。2規(guī)范性引用文件下列文件對于本文件的應用是必不可少的。凡是注日期的引用文件,僅注日期的版本適用于本文件。凡是不注日期的引用文件,其最新版本(包括所有的修改單)適用于本文件。GB/T11457—2006信息技術軟件工程術語GB/T33781—2017可編程邏輯器件軟件開發(fā)通用要求3術語和定義GB/T11457—2006和GB/T33781—2017界定的術語和定義適用于本文件。4縮略語下列縮略語適用于本文件。FPGA:現(xiàn)場可編程門陣列(FieldProgrammableGateArray)VHDL:超高速集成電路硬件描述語言(Very-high-speedintegratedcircuitHardwareDescriptionLanguage)5安全細則5.1例化類5.1.1端口例化應采取名稱映射的方式,避免位置映射。在進行端口例化時,應采取名稱映射的方式,避免位置映射,利于提高程序的可讀性和可維護性。reset_filter_inst:reset_filterportmap(reset_in=)reset_in,clk=)clk,reset_out=〉reset_out);2GB/T37979—2019--違背示例--端口例化采取位置映射portmap(reset_in,clk,5.1.2例化時不應輸入端口懸空。--遵循示例--違背示例portmap(a_in=>open,--例化時輸入端口懸空5.1.3例化時未使用的輸出端口宜采用“open”說明。3GB/T37979—2019--遵循示例example_ent_inst:example_entportmap(a_in=>sa,b_in=〉s_b,c_out=〉s_c,d_out=>open);--未使用的端口采用open說明entityexample_entisport(a_in:instd_logic;endexample_ent;5.1.4端口例化時不應進行邏輯運算操作。--遵循示例example_ent_inst:example_entportmap(a_in=》s_a,b_in=)s_b,c_out=》sc,d_out=)notsdn);entityexample_entisport(a_in:instd_logic;endexample_ent;4GB/T37979—2019--違背示例example_ent_inst:example_entportmap(a_in=>s_a,b_in=〉s_b,c_out=》sc,d_out=)nots_d);--端口例化時進行邏輯非運算entityexample_entisport(a_in:instd_logic;b_in:instd_logic;C_out:outstd_logic;d_out:outstd_logic);endexample_ent;5.2.1每個模塊/單元應至少包含1個輸入/輸出端口。--違背示例entityexample_entisport(--沒有定義端口endexample_ent;單向的輸出信號不應直接用于驅動同一個模塊內部的邏輯,如需使用可采用中間信號的方式進行處理。--遵循示例--輸出信號反饋驅動同模塊內部邏輯entitytop_entisport(A_in:instd_logic;Clk:instd_logic;Arout:outstd_logic;B_out:outstd_logic);endtop_ent;architecturebehave_arcoftop_entissignalS_A_r;5GB/T37979—2019B_out(=B_inandSAr;--采用中間信號SAr的方式驅動內部邏輯--違背示例--輸出信號反饋驅動同模塊內部邏輯B_out<=B_inandArout;--輸出端口Arout直接用于驅動模塊內部邏輯B_out--遵循示例signalS_inter_data,S_inter_ctrl,S_iS_inter_data(=S_inter_dinwhenS_inter_ctrl='l’elseS_inter_data;6GB/T37979—2019--違背示例signalS_inter_data,S_inter_ctrl,S_iS_inter_data〈=S_inter_dinwhenS_inter_ctrl=’l’else'Z';--內部信號S_inter_data不應使用三態(tài)門--遵循示例reset_filter_0:reset_filterportmap(reset_in=)reset_7GB/T37979—2019--違背示例ENTITYtop_ENT(……);signalS_Dout1_2:std_logic;S_Dout1_2(=Doutl_outorDout2_out;U0:big_blocklportmap(clk=>clk,rst=)rst,D_in=〉Dinl_in,Dout=》Doutl_out);U1:big_block2portmap(clk=>clk,rst=)rst,D_in=)Din2_in,Dout=〉Dout2_out);U3:big_block3portmap(clk=>clk,rst=)rst,D_in=〉S_Doutl_2,Dout=>Dout3_out);endbehave_ARC5.2.5設計中不應存在多余代碼或不可達分支。signalS_count:std_logic_vector(3downto0);signalS_flag:std_logic;process(clk,resetn)beginif(reset_n='0’)thenS_count(=(others=>70’);S_flag(='0’;elsifclk'eventandclk='1'thenif(S_count=16)thenS_flag(=’1’;S_count(=S_countendif;--該分支不可達+1;endprocess5.2.6設計中不應產生非預期的鎖存器。--產生鎖存器的實現(xiàn)data_reg(=datawhenenable=’l’elsedata_reg;--無鎖存器的實現(xiàn)data_reg(=datawhenenable='l’else'0’;8GB/T37979—20195.2.8宜按照不同的設計目標進行模塊劃分。束和優(yōu)化。5.2.9宜將相關的組合邏輯和可以復用的邏輯劃分在同一個模塊層次中。--遵循示例process(a,b,enable)beginifenable=’0'thenoutl〈=a;outl〈=b;endprocess;--違背示例process(a,b)--組合邏輯中敏感列表缺少enable信號beginifenable=’0'thenout1〈=a;outl〈=b;endprocess;--違背示例process(clk,rst_n,enable)--時序邏輯中敏感列表enable信號多余beginifrst_n=’0'thenout_reg(='0’;elsifclk'eventandclk='1'thenifenable=’0'thenoutreg(=a endprocess;9GB/T37979—2019--遵循示例--信號、變量定義時應設置位寬signalS_i:std_logic_vector(1downto0);…...S_i〈="01";--違背示例signalcnt:std_logic_vector(5downto0);--程序中未使用,多余信號GB/T37979—2019--違背示例port(D_in:instd_logic;D_out:outstd_logic);endtop_ent;signalS_Ctrl_in:std_logic;D_out<=D_inwhenS_Ctrl_in='Z'else'l’;--條件表達式中應避免使用"Z"狀態(tài)--違背示例port(D_out:outstd_logic);endtop_ent;signalS_Ctrl_in:std_logic_vector(2downto0);D_out<=D_inwhenS_Ctrl_in="1?0"else'l’;--條件表達式中應避免使用"?"狀態(tài)5.4.4不應在一個進程中使用多個eventcontrol段。當process語句eventcontrol段存在多個表達式時,會造成不同綜合工具的綜合差異,不利于代碼的移植。--違背示例signalS_a,S_b:std_logic;signalS_r:std_logic;process(S_a,Sb)beginifS_a'eventandS_a=’l'thenifS_b'eventandS_b='l'then--不應在一個進程中使用多個eventcontrol段endif;endprocess;GB/T37979—2019--違背示例signal--違背示例signalS_a:std_logic;signalLabel:std_logic;--信號命名與關鍵字重復b)應以英文字母開頭;c)末字符不應使用下劃線;d)不應連續(xù)使用下劃線。5.5.4不應使用大小寫英文字母區(qū)分不同的命名。5.5.5時鐘的命名宜與一般的端口名字相區(qū)別。--遵循示例--時鐘的命名宜與一般的端口名字相區(qū)別entityclk_entisport(clk:instd_logic;rst:instd_logic;clk_gps:outendclk_ent;std_logic;std_logic);a)信號名稱不宜超過20個字符;b)變量名稱宜以V開始;c)常量名稱宜以C開始;d)實體名稱宜以_ent結束;e)實體名稱約定文件宜是<entity>.vhd;f)結構體名稱宜以_arc結束;g)結構文件名稱宜是<architecture>.vhd;h)包名稱宜以_pack結束;i)包聲明文件名稱宜是<package>.vhd;j)包文件名稱宜是<package>_body.vhd;k)配置名稱宜以_conf結束;1)配置聲明文件名稱宜是<configuration>.vhd;m)部件名稱宜以comp開始;n)類型名稱宜以T開始;GB/T37979—2019o)子類型名稱宜以ST開始;p)函數(shù)名稱宜以F開始;q)器件名稱宜以U開始;r)塊標號名稱宜以_block結束;s)generate標號名稱宜以_gen結束;t)進程標號名稱宜以_proc結束;u)初始信號名稱宜以P_開始;v)輸入端口名稱宜以_in結束;w)輸出端口名稱宜以_out結束;x)輸入/出端口名稱宜以_inout結束;y)初始化模塊標號名稱以_init結束;z)使能信號名稱宜以_en結束,非使能信號名稱不宜使用_en;aa)低有效信號名稱宜使用_n結尾;bb)經過一個反相器或緩沖器的信號名稱宜僅改變信號后綴名;cc)復位端口名稱宜使用rst起始命名,非復位信號名稱里不宜包含rst。5.5.7跨越多個模塊層次的信號應該使用同樣的命名。當一個信號跨越多個模塊層次時,在不同的層次使用同樣的命名有助于提高程序的可讀性和可維護性。entityrs422_entisport(clk:inrst:instd_logic;std_logic;rx_in:instd_logic;rx_data_out:outstd_logic_vector(15downto0);rx_syn_out:outstd_logic);endrs422_ent;rx_syn_out〈=S_rx_synbandS_rx_syna;_rxb_block:rec_ent_portmap(clkrstrxin__rxdata_out_rx_syn_out__rxablock:rec__=》clk,=》rst,=》rx_in,=>rx_data_out(15downto8),=>S_rx_synb);portmap(clkrst=》clk,=》rst,=》rx_in,rx_data_out=》rx_data_out(7downto0),rx_syn_out=>S_rx_syna);GB/T37979—20195.6.1信號應在賦值后使用。--違背示例entityexample_entisport(SEL_in:instd_logic;DATA_out:outstd_logic);endexample_ent;architecturebehave_arcofexample_entissignalS_tmp:std_logic;beginprocess(SEL_in,S_tmp)beginif(SEL_in='l’)thenDATA_out<=S_tmp;--S_tmp信號在使用前沒有賦值DATA_out〈=’0’;endprocess;endbehave_arc;5.6.2運算符兩端信號或參數(shù)位寬應相等。b)在case語句中,case表達式和case條件語句中的信號或參數(shù)的長度應該相等。參與計算。--遵循示例--常量賦值表達式可以計算出明確的數(shù)值SignalS:integer;constantCintl:integer:=1;constantCint2:integer:=Cint1+1;beginS〈=Cintl+Cint2;GB/T37979—2019--違背示例intl<=ul;--將無符號數(shù)隱式轉化為整數(shù)--遵循示例int1<=to_integer(ul);--使用轉換函數(shù)進行不同數(shù)據(jù)類型之間的轉換5.6.5避免將有符號數(shù)和無符號數(shù)混用于同一運算式。--違背示例signalul,u2:unsigned(3downto0);u2〈=ul+sl;--將有符號數(shù)和無符號數(shù)混于同一運算式中--違背示例signalS_net_1,S_net_2,S_net_3,S_net_4:std_logic;out<=S_net_1andS_net_2;out<=not(S_net_3norS_net_4);--out被多個信號驅動5.6.7相同的信號源應避免驅動同一個寄存器的多個異步信號端。GB/T37979—2019--違背示例--相同的信號源不應驅動同一個寄存器的多個異步信號端test_block:test_ent--rst和set分別為test_block模塊的復位端和置位端portmap(clk=)clk,rst=)rst_c,--使用rst_c信號驅動復位端d_in=)d_in,set=)rst_c,--使用rst_c信號驅動置位端d_out=)d_out);--違背示例--輸入信號和使能信號被相同的信號源(S_ctrl)驅動--違背示例d_out<=d_inwhenS_c=70'else'Z';--一使用組合邏輯的輸出控制三態(tài)門GB/T37979—20195.7.1用于控制循環(huán)終止條件的參數(shù)應為常量。--遵循示例SUM:foriinlto3loop--用于控制循環(huán)終止條件的參數(shù)為常量sum=sum十i:5.7.2不應在for循環(huán)體內修改循環(huán)變量。--違背示例sum=sum十i:5.7.3while語句條件表達式不應為常量。.i:=1;whilei(=5loopi:=i+1;endloop;5.8.1case語句表達式不應為固定常量。case語句執(zhí)行時,根據(jù)條件數(shù)值選擇不同分支執(zhí)行,如果條件表達式為常量則其余分支多余。--違背示例entityexample_entisport(A_out:outstd_logic);endexample_ent;GB/T37979—2019architecturebehave_arcofexample_entisconstantCTMP:std_logic:=’l’;constantCFS_COND:std_logic:='1’;beginprocess(SEL_in,A_in)begin--case語句的條件表達式不應為常量case(CFS_COND)iswhenCTMP=)A_out(=A_in;whenothers=》A_out<=’X’;endcase;endprocess;endbehave_arc;--違背示例case(Va)iswhen"01":Vb=Va;when"10":Vb=Va+1;when"Vc+Vd":Vb=1;--使用變量或者變量表達式作為case語句的分支endcase5.8.3case語句除所有條件分支能完全覆蓋其表達式或狀態(tài)機寄存器的所有取值外,應包含一個--遵循示例case(Va&.Vb&.Vc)iswhen"100"=)base_addr_r(24downto0)〈=VA+(code_r(7downto0)&."000000");when"000"=)base_addr_r(24downto0)《=VB+(code_r(7downto0)&"000000");when"101"=)base_addr_r(24downto0)<=VC+(code_r(7downto0)&."000000");when"001"=)base_addr_r(24downto0)〈=VD+(code_r(7downto0)&."000000");when"010"=)base_addr_r(24downto0)〈=VE+(code_r(7downto0)&."000000");-case語句包含一個whenothers分支endcase;GB/T37979—2019--遵循示例typestateis(s0,s1,s2,s3,s4,s5):signalnstate,cstate:state;process(cstate,……)beginnstate(=s0;whens0=)whensl=)whens2=)whens3=)whens4=)whens5=)--case語句包含一個whenothers分支endprocess;5.8.4組合邏輯中if語句應包含else分支。--遵循示例GB/T37979—2019--違背示例architecturebehave_arcofexample_entisbeginprocess(a,en)beginif((=a;='1')then--if語句缺少else分支endif;endprocess;endbehave_arc;5.8.5不宜在進程中出現(xiàn)空語句。--遵循示例--違背示例NULL;--不宜在進程中出現(xiàn)空語句5.8.6多級ifelse語句應重視優(yōu)先級順序對性能的影響。第一級if優(yōu)先級最高,路徑延時也最短。如果存在關鍵路徑的信號,宜結合功能實現(xiàn)將其放在靠前的if語句內。GB/T37979—20195.9時鐘類聚路徑易導致時鐘路徑上發(fā)生時序沖突。--違背示例entityexample_entisport(clk:instd_logic;rst_n:instd_logic;sel2:instd_logic;dout:outstd_logic);endexample_ent;architecturebehave_arcofexample_entissignalclkl:std_logic;signalclk2:std_logic;signalclk_sel:std_logic;beginclk1(=sellandclk;clk2(=sel2orclk;clk_sel<=clk1andclk2;--此處的時鐘信號在時鐘網(wǎng)絡上發(fā)生了再匯聚process(rst_n,clk_sel)beginif(rst_n='0')thendout〈='0’;elsifclk_sel'eventandclk_sel=l'thendout<=din;endprocess;endbehave_arc;上述代碼的電路示意圖見圖1。DDQrstn□GB/T37979—2019--違背示例d_out<=d_inwhenclk='1'else'0’;--時鐘信號連接到多路選擇器的控制端5.9.3不宜使用組合邏輯產生的時鐘。--違背示例clk〈=a_inandb_in;--組合邏輯產生時鐘ifclk'eventandclk='1’then--使用組合邏輯產生的時鐘5.9.4避免使用門控時鐘。GB/T37979—2019--違背示例clk_out〈=clkandsl;--輸出時鐘由輸入時鐘、控制信號經與門產生,容易產生毛刺5.9.5同一進程中應只使用一個時鐘。--違背示例process(clk_1,clk_2)--在一個進程中使用多個時鐘--違背示例--示例中a_in為外部輸入信號與時鐘clk異步a_in:instd_logic;--a_in為外部的異步信號architecturebehaveGB/T37979—2019beginifclk'eventandclk='1'thenif(a_in='1’)then--a_in為外部的異步信號,此處未經同步化直接使用S_cnt(=S_cnt+1;endprocess;d_out〈=S_cnt;endbehavearc--遵循示例entityexample_entisport(a_in:instd_logic;clk:instd_logic;d_out:outstd_logic_vector(1downto0));endexample_ent;architecturebehave_arcofexample_entissignalS_cnt:std_logic_vector(1downto0);signala_regl:std_logic;signala_reg2:std_logic;beginprocess(clk)--同步輸入信號a_inbeginifclk'eventandclk='l’thena_regl(=a_in;a_reg2(=a_regl;endprocess;process(clk)beginifclk'eventandclk='l'thenif(a_reg2='1’)then--使用同步后的信號S_cnt(=S_cnt+1;endprocess;d_out〈=S_cnt;endbehave_arc;GB/T37979—2019--遵循示例--本舉例是以某公司芯片設計為例entityexample_entisclk_in:instd_logic;endexample_ent;.BUFG_inst:BUFGportmap(O=>clk,--將輸入時鐘連接至全局時鐘網(wǎng)絡后再使用I=〉clk_in);CLKCLKcnt1DQDQCLKCLK--違背示例行波時鐘使用電路的違背示例的示意圖見圖2。圖2行波時鐘使用電路示意圖--使用前級觸發(fā)器的輸出信號作為后級觸發(fā)器的時鐘信號5.9.10時鐘信號源不宜驅動不同時鐘沿觸發(fā)的寄存器。GB/T37979—2019--違背示例entitytop_entisport(rst_n:instd_logic;D_in:instd_logic;D_out:outstd_logic);endtop_ent;architecturebehave_arcoftop_entissignalS_Doutl_r,S_Dout_temp_r:std_logic;beginprocess(clk,rst_n)beginifrst_n=’0'thenS_Dout_temp_r(=0;elsifclk'eventandclk='l'then--一此處使用時鐘信號上升沿S_Dout_temp_r(=D_in;endprocess;process(clk,rst_n)beginifrst_n=’0'thenD_out〈=0;elsifclk'eventandclk=’0'then--一此處使用時鐘信號下降沿D_out<=S_Dout_temp_r;endprocess;endbehave_arc;5.9.11避免在時鐘路徑上插入反相器或緩沖器。--違背示例entitytop_entisport(clk:instd_logic;reset:instd_logic;D_in:instd_logic;D_out:outstd_logic);endtop_ent;architecturebehave_arcoftop_entisGB/T37979—2019signalclock_1:std_Logic;clock_1<=notclk;--在時鐘路徑上使用反相器portmap(PAD=>clock1,Y=)clock_2);--在時鐘路徑上使用緩存器process(reset,clock_2)endprocess;endbehave_arc;同一個寄存器的輸出信號不應經過組合邏輯后再反饋回異步復位(置位)端。--違背示例U5:GTECH_FD2Portmap(D=》in2_in,CP=〉clk,CD=)rst,Q=〉outl_out);--觸發(fā)器U5的輸出經組合邏輯后又反饋回U5復位端。rst<=inl_iANDoutl_out;5.10.2同一寄存器的復位與置位信號不應來自同一個信號。5.10.3異步復位釋放時應采用同步釋放的方式。--違背示例Process(clk,rst_n)--復位信號rst_n與時鐘clk為異步關系beginif(rst_n=’0’)then--rst_n釋放時寄存器S_test存在亞穩(wěn)態(tài)風險S_test〈="00";GB/T37979—2019--遵循示例process(clk,rst_n)beginif(rst_n='0’)thenrstnsyn0(=’0’;rstnsynl(=0’;elsifclk'eventandclk='l'then--對異步復位信號進行同步釋放處理rstnsyn0<=1;rstnsyn1<=rstnsyn0;endif;endprocess;process(clk,rstnsynl)--使用可以同步釋放的復位信號進行復位beginif(rstnsynl=’0’)thenS_test〈="00";5.10.4寄存器復位端口不應懸空。example_ent_inst:example_entportmap(clk=)clk.out_1=〉out_1);--復位端口被懸空entityexample_entisport(clk:instd_logic;rst:instd_logic;endexample_ent;5.10.5應使用復位/置位操作對寄存器進行初始化。聲明初始化方式對某些器件型號,綜合工具是無法綜合的。對寄存器的初始化不宜采用聲明初始化方式,應使用復位/置位操作初始化。如存在信號無法通過復位/置位操作初始化,且確認使用的器件可以聲明初始化時,可采用聲明初始化方式。signalS_test:std_logic_vector(1downto0):="10";--聲明初始signalS_test:std_logic_vector(1downto0):="10";--聲明初始GB/T37979—2019--遵循示例process(clk,rstn)beginif(rst_n=0’)thenS_test<="10";--使用復位操作對寄存器進行初始化5.10.7宜將系統(tǒng)復位信號設置為全局網(wǎng)絡。將系統(tǒng)復位信號設置為全局時鐘網(wǎng)絡,可以保證復位信號延遲最小,使所有觸發(fā)器同時進行全局BUFG_inst:BUFG--將復位信號連接至全portmap(O=>g_rst_n,I=》rst_n);.process(clk,g_rst_n)--使用經過全局時鐘網(wǎng)絡后的復位信號beginif(g_rst_n=’0’)then兩級級聯(lián)寄存器同步外部復位信號。process(clk)--復位信號rst_n在時鐘域clk下兩級同步beginifclk'eventandclk='1'thenrstnsyn0(=rst_n;rstnsynl<=rstnsyn0;endif;endprocess;process(clk)--使用同步之后的復位信beginifclk'eventandclk(='1'thenif(rstnsynl=70’)thenS_test〈="00";GB/T37979—2019示例:--遵循示例使用同一電平復位的示意圖見圖3。--違背示例使用不同電平復位的示意圖見圖4。 --遵循示例rst_n〈=rst_aandrst_b;--復位信號由組合邏輯產生process(clk)beginifclk'eventandclk='l'then--對復位信號進行同步化處理,消除毛刺rstnsyn0<=rst_n;rstnsynl<=rstnsyn0;endprocess;process(clk,rstnsynl)--使用同步處理后的復位信號進行復位beginif(rstnsynl=’0’)thenGB/T37979—2019--違背示例singalcurrent_state_r,next_state_r:std_logic_vector(1downtoO);constantCst0:std_logic_vector(1downto0):="00";constantCst1:std_logic_vector(1downto0):="01";constantCst2:std_logic_vector(1downto0):="10";constantCst3:std_logic_vector(1downto0):="11";casecurrent_state_riswhenCst0=)whenCstl=〉whenCst2=〉--當程序的狀態(tài)機進入無效狀態(tài)后執(zhí)行whenothers分支,由于程序whenothers=)null;endcase--遵循示例singalcurrent_state_r,next_state_r:std_logic_vector(1downto0);constantCst0:std_logic_vector(1downto0):="00";constantCstl:std_logic_vector(1downto0):="01";constantCst2:std_logic_vector(1downto0):="10";constantCst3:std_logic_vector(1downto0):="11";casecurrent_state_riswhenCst0=〉whenCstl=〉whenCst2=〉whenothers=>next_state_r〈=Cst0;endcaseGB/T37979—2019置中通過勾選安全模式或代碼中增加綜合屬性約束等方式進行設置。typestateis(s0,sl,s2,s3,s4,s5);signalnstate,cstate:state;attributesyn_encodingofcstate:signalis"safe,gray";5.11.3狀態(tài)機應初始化為合法狀態(tài)。應使用全局復位信號使狀態(tài)機初始化為已知的合法狀態(tài)。--遵循示例process(rst_n,clk)beginifrst_n=’0’thencurrent_state_r<=IDLE;--初始化為IDLE狀態(tài)elsifrising_edge(clk)thenendif;endprocess;process(rst_n,clk)beginifrst_n=0’thencurrent_state_r〈=IDLE;elsifrising_edge(clk)thencurrent_state_r(=next_state_r;endif;endprocess;process(current_state_r,AD_start,…)beginnext_state_r(=IDLE;casecurrent_state_riswhenIDLE=〉GB/T37979—2019ifAD_start='l'thennext_state_r〈=STATE_1;next_state_r<=IDLE;next_state_r<=STATE_2;whenothers=》next_state_r〈=IDLE;endprocess;--第三個進程,同步時序進程,描述次態(tài)寄存器輸出process(rst_n,clk)beginifrst_n=70'thenAD_CS(='1’;AD_RD<=’l’;AD_DONE(=’0’;elsifrising_edge(clk)thencasenext_state_riswhenIDLE=)AD_CS(='l’;AD_RD〈='1’;AD_DONE〈=’0’;AD_CS(='0’;endprocess;5.11.5宜使用枚舉類型來聲明狀態(tài)機。--遵循示例--枚舉類型定義狀態(tài)機typestate_valuesis(IDLE,Conv_Start,Config_Start,Write_Parameter);signalstate,next_state:state_values;5.11.6狀態(tài)機中的狀態(tài)數(shù)量及編碼方式要求:a)有限狀態(tài)機中狀態(tài)的數(shù)量過大會產生較復雜的組合邏輯電路,使時序路徑上的傳輸延時增大,狀態(tài)機的數(shù)量一般應少于40;GB/T37979—2019采用二進制編碼;c)獨熱編碼需要較多的寄存器,但狀態(tài)機之間需要的組合邏輯資源比較少,能夠提高邏輯的速--遵循示例--采用二進制編碼--遵循示例--采用獨熱碼編碼--遵循示例--采用格雷碼編碼5.12.1在用于綜合的代碼中應避免使用不可綜合的代碼。--空字符串常量不可綜合architectureDCVHDL_2159_archofDCVHDL_2159is--違背示例constantN:string:="";--錯誤--遵循示例constantB:integer:=4;--正確begin.endDCVHDL_2159_arch;GB/T37979—2019--非整型generic不可綜合--違背示例entityDCVHDL_2024isgeneric(delay:string:="temp");--錯誤port(B:instd_logic;A:outstd_logic

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論