(高清版)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页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ICS35.080GB/T37979—2019可编程逻辑器件软件VHDL编程国家市场监督管理总局中国国家标准化管理委员会GB/T37979—2019 1 1 1 1 15.1例化类 1 4 8 95.5命名类 5.6运算类 5.7循环控制类 5.8分支控制类 5.9时钟类 5.12综合/约束类 5.13注释类 IⅢGB/T37979—2019本标准按照GB/T1.1—2009给出的规则起草。请注意本文件的某些内容可能涉及专利。本文件的发布机构不承担识别这些专利的责任。本标准由全国信息技术标准化技术委员会(SAC/TC28)提出并归口。1GB/T37979—2019可编程逻辑器件软件VHDL编程安全要求本标准规定了VHDL用于可编程逻辑器件软件编程安全细则。本标准适用于可编程逻辑器件软件VHDL的编程安全设计、编码、测试及其使用。ASIC数字电路设计时也可参照使用。2规范性引用文件下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文件。凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。GB/T11457—2006信息技术软件工程术语GB/T33781—2017可编程逻辑器件软件开发通用要求3术语和定义GB/T11457—2006和GB/T33781—2017界定的术语和定义适用于本文件。4缩略语下列缩略语适用于本文件。FPGA:现场可编程门阵列(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不应使用三态门--遵循示例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设计中不应产生非预期的锁存器。--产生锁存器的实现data_reg(=datawhenenable=’l’elsedata_reg;--无锁存器的实现data_reg(=datawhenenable='l’else'0’;8GB/T37979—20195.2.8宜按照不同的设计目标进行模块划分。束和优化。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"状态--违背示例port(D_out:outstd_logic);endtop_ent;signalS_Ctrl_in:std_logic_vector(2downto0);D_out<=D_inwhenS_Ctrl_in="1?0"else'l’;--条件表达式中应避免使用"?"状态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)不应连续使用下划线。5.5.4不应使用大小写英文字母区分不同的命名。5.5.5时钟的命名宜与一般的端口名字相区别。--遵循示例--时钟的命名宜与一般的端口名字相区别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)函数名称宜以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运算符两端信号或参数位宽应相等。b)在case语句中,case表达式和case条件语句中的信号或参数的长度应该相等。参与计算。--遵循示例--常量赋值表达式可以计算出明确的数值SignalS:integer;constantCintl:integer:=1;constantCint2:integer:=Cint1+1;beginS〈=Cintl+Cint2;GB/T37979—2019--违背示例intl<=ul;--将无符号数隐式转化为整数--遵循示例int1<=to_integer(ul);--使用转换函数进行不同数据类型之间的转换5.6.5避免将有符号数和无符号数混用于同一运算式。--违背示例signalul,u2:unsigned(3downto0);u2〈=ul+sl;--将有符号数和无符号数混于同一运算式中--违背示例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';--一使用组合逻辑的输出控制三态门GB/T37979—20195.7.1用于控制循环终止条件的参数应为常量。--遵循示例SUM:foriinlto3loop--用于控制循环终止条件的参数为常量sum=sum十i:5.7.2不应在for循环体内修改循环变量。--违背示例sum=sum十i:5.7.3while语句条件表达式不应为常量。.i:=1;whilei(=5loopi:=i+1;endloop;5.8.1case语句表达式不应为固定常量。case语句执行时,根据条件数值选择不同分支执行,如果条件表达式为常量则其余分支多余。--违背示例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语句除所有条件分支能完全覆盖其表达式或状态机寄存器的所有取值外,应包含一个--遵循示例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不宜在进程中出现空语句。--遵循示例--违背示例NULL;--不宜在进程中出现空语句5.8.6多级ifelse语句应重视优先级顺序对性能的影响。第一级if优先级最高,路径延时也最短。如果存在关键路径的信号,宜结合功能实现将其放在靠前的if语句内。GB/T37979—20195.9时钟类聚路径易导致时钟路径上发生时序冲突。--违背示例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;--此处的时钟信号在时钟网络上发生了再汇聚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,--将输入时钟连接至全局时钟网络后再使用I=〉clk_in);CLKCLKcnt1DQDQCLKCLK--违背示例行波时钟使用电路的违背示例的示意图见图2。图2行波时钟使用电路示意图--使用前级触发器的输出信号作为后级触发器的时钟信号5.9.10时钟信号源不宜驱动不同时钟沿触发的寄存器。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);--触发器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存在亚稳态风险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宜将系统复位信号设置为全局网络。将系统复位信号设置为全局时钟网络,可以保证复位信号延迟最小,使所有触发器同时进行全局BUFG_inst:BUFG--将复位信号连接至全portmap(O=>g_rst_n,I=》rst_n);.process(clk,g_rst_n)--使用经过全局时钟网络后的复位信号beginif(g_rst_n=’0’)then两级级联寄存器同步外部复位信号。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=〉--当程序的状态机进入无效状态后执行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状态机应初始化为合法状态。应使用全局复位信号使状态机初始化为已知的合法状态。--遵循示例process(rst_n,clk)beginifrst_n=’0’thencurrent_state_r<=IDLE;--初始化为IDLE状态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;--第三个进程,同步时序进程,描述次态寄存器输出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宜使用枚举类型来声明状态机。--遵循示例--枚举类型定义状态机typestate_valuesis(IDLE,Conv_Start,Config_Start,Write_Parameter);signalstate,next_state:state_values;5.11.6状态机中的状态数量及编码方式要求:a)有限状态机中状态的数量过大会产生较复杂的组合逻辑电路,使时序路径上的传输延时增大,状态机的数量一般应少于40;GB/T37979—2019采用二进制编码;c)独热编码需要较多的寄存器,但状态机之间需要的组合逻辑资源比较少,能够提高逻辑的速--遵循示例--采用二进制编码--遵循示例--采用独热码编码--遵循示例--采用格雷码编码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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论