欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    全国大学生电子设计竞赛训练教程55 常见错误及其原因分析.docx

    • 资源ID:6929675       资源大小:318.72KB        全文页数:16页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    全国大学生电子设计竞赛训练教程55 常见错误及其原因分析.docx

    1、全国大学生电子设计竞赛训练教程55 常见错误及其原因分析5.5 常见错误及其原因分析 初学VHDL,往往会碰到不少问题和错误。例如:综合时出现警告和错误、编译无法通过等问题,使得设计无法实现;或者程序,综合等均通过,但不能得到正确的仿真结果,即所设计的硬件与原意要求不符等等。通过资料的收集和归纳,总结出以下一些注意事项,常见问题及错误,并提出改正方案,以供参考。5.5.1 避免语法错误VHDL规定了一些固定的描述格式,用于描述各种不同的功能,在Xilinx或Max+plus环境下,关键字会以蓝色显示,端口宽度会以紫色显示,以示区别,黑色字则是可由用户自定义的名称、数值等。下面几个简单的例子作说

    2、明:1.端口的定义端口的定义为:port ( 端口名,端口名:端口类型(空格)端口宽度); entity sztop isPort ( clk : in std_logic ; ring , sz : out std_logic ; 定义多个相同类型的端口,用逗号格开 hour : in std_logic_vector(3 downto 0) ; 4位数据sec : out std_logic_vector(6 downto 0) 7位数据);end sztop;2. 信号和变量的定义信号定义:SIGNAL 信号名: 数据类型 ;signal a : std_logic;signal b :

    3、 std_logic_vector(2 downto 0); 变量定义:VARIABLE 变量名 : 数据类型 ;variable c0 , c1 : integer ;variable d : integer range 0 to 256; variable cnt : std_logic_vector(3 downto 0);3. CASE语句case seg is when 0000 = q q q q =1111111;end case;初学者要紧记这些语法结构,特别注意标点符号的用法,从而避免编程时可能出现的大量小错误。5.5.2 信号与变量 信号与变量都可以用于描述器件内部结构,两

    4、者的区别如表5.5.1所示。表5.5.1 信号与变量的区别信号变量基本用法 电路中的信号连线进程中局部数据存储单元适用范围在整个结构体内的任何地方都能使用只能在所定义的进程中使用定义位置进程外部进程内部赋值符号=:=多次赋值在进程的最后才对信号赋值立即赋值初学编程时经常出现的错误是信号或变量的定义位置混淆,如果在进程外部定义变量,或在进程内部定义信号,综合时就会出现Unexpected symbol read的错误。对信号赋值的符号是 “=”,对变量的赋值符号是“:=”,如例5.5.1所示。编程时应正确使用。【例5.5.1】entity multiclock is Port ( clk:in

    5、std_logic; ps: out std_logic);end multiclock;architecture Behavioral of multiclock issignal ps0: std_logic; -定义信号beginprocess(clk)variable clk1:integer range 0 to 32 ; -定义变量beginif clkevent and clk=1 thenclk1:=clk1+1; -变量赋值if clk1=16 thenps0=1; -信号赋值elsif clk1=32 thenps0=0;clk1:=0;end if;end if;ps=p

    6、s0;end process ;下面举例说明信号与变量用法的区别:【例5.5.2】entity dff is Port ( clk,d: in std_logic; q: out std_logic);end dff;architecture Behavioral of dff issignal a,b: std_logic;beginprocess(clk)beginif clkevent and clk=1 thena=d;b=a;q=b;end if;end process;end Behavioral【例5.5.3】entity dff1 is Port ( clk,d: in std

    7、_logic; q: out std_logic);end dff1;architecture Behavioral of dff1 isbeginprocess(clk)variable a,b: std_logic;beginif clkevent and clk=1 thena:=d;b:=a;qb then q=1;elsif ab then qb then q=1;else q=0;end if;end process;end Behavioral;易见,程序1忽略了当“ab”的情况,应为else语句囊括了与if语句所描述的情形相反的全部可能。程序2则描述了所有的情况。从两个程序的仿

    8、真结果图5.5.3和图5.5.4也可看出,图中,当ab时,q有两种可能取值,而图中,q只有一种取值0。这两个程序虽然很简单,错误也很明显,但类似的逻辑上的错误往往很容易犯,因此必须特别注意。图5.5.3 例5.5程序1仿真图图5.5.4 例5.5程序2仿真图IF-ELSE语句的嵌套也是必须十分注意的,如果嵌套的层次没有分清,逻辑混乱,就得不到预期的功能,下面看例5.5.5例和5.5.6两个程序的对比:例5.5.5取自于一个4位数码管动态显示的驱动器,该进程完成的是一个多位的计数器功能,从最低位起开始计数,满三进一(为方便观察仿真结果,实际应用多为十进制或六进制),计数的同时输出显示。注意该IF

    9、ElSE的嵌套最里一层位数最高,最低位在嵌套的最外层,循环次数最多。【例5.5.5】entity dt1 is Port ( clk : in std_logic; reset : in std_logic; cnta0,cntb0,cntc0,cntd0:out std_logic_vector(3 downto 0);end dt1;architecture Behavioral of dt1 isbegincounter10:process(reset,clk) variable cnta,cntb,cntc,cntd:std_logic_vector(3 downto 0);begin

    10、if reset=0 then cnta:=0000;cntb:=0000;cntc:=0000;cntd:=0000;elsif rising_edge(clk) thenif cnta=0011 then cnta:=0000;cnta0=cnta; -最低位 if cntb=0011 then cntb:=0000;cntb0=cntb; if cntc=0011 then cntc:=0000;cntc0=cntc; if cntd=0011 then cntd:=0000;cntd0=cntd; -最高位 else cntd:=cntd+1;cntd0=cntd; end if; e

    11、lse cntc:=cntc+1;cntc0=cntc; end if; else cntb:=cntb+1;cntb0=cntb; end if;else cnta:=cnta+1;cnta0=cnta;end if;end if;end process;end Behavioral;图5.5.5 例5.5.5程序仿真图但是,如果将程序中的IFELSE结构改成例5.5.6所示:【例5.5.6】entity dt2 is Port ( clk : in std_logic; reset : in std_logic; cnta0,cntb0,cntc0,cntd0:out std_logic_

    12、vector(3 downto 0);end dt2;architecture Behavioral of dt2 isbegincounter10:process(reset,clk) variable cnta,cntb,cntc,cntd:std_logic_vector(3 downto 0);beginif reset=0 then cnta:=0000;cntb:=0000;cntc:=0000;cntd:=0000;elsif rising_edge(clk) thenif cnta=0011 then cnta:=0000;cnta0=cnta; else cnta:=cnta

    13、+1;cnta0=cnta; end if; if cntb=0011 then cntb:=0000;cntb0=cntb; else cntb:=cntb+1;cntb0=cntb; end if;if cntc=0011 then cntc:=0000;cntc0=cntc; else cntc:=cntc+1;cntc0=cntc; end if;if cntd=0011 then cntd:=0000;cntd0=cntd; else cntd:=cntd+1;cntd0cnt0:=1;cnt1:=2; when0001=cnt0:=2;cnt1:=3; when0010=cnt0:

    14、=3;cnt1:=6 ; when0011=cnt0:=3 ;cnt1:=4; when others=cnt0:=0;cnt1:=0; end case; elsif clkevent and clk=1 then count:=count+1; if count=cnt0 then clk0:=1; elsif count=cnt1 then count:=0; clk0:=0; end if; end if; clockcnt0:=1;cnt1:=2; when0001=cnt0:=2;cnt1:=3; when0010=cnt0:=3;cnt1:=6 ; when0011=cnt0:=

    15、3 ;cnt1:=4; when others=cnt0:=0;cnt1:=0; end case; if count=cnt0 then clk0:=1; elsif count=cnt1 then count:=0; clk0:=0; end if; end if; clock=clk0;end process counter;end Behavioral;图5.5.7 例5.5.7仿真图图5.5.8 例5.5.8仿真图5.5.5 多时钟源的解决方案有时,在同一个实体中往往使用多个进程,而每个进程使用不同的时钟源驱动时,就会发生错误。例如,由分频器产生多个不同频率的时钟脉冲去控制不同的部件

    16、时,如果每个进程都采用“if clkevent and clk=1 then”这样的格式来描述时钟上升沿,综合将无法进行。此时,可以用rising_edge来描述分频后得到的时钟的上升沿,就不会出错。library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity multiclock is Port ( clk:in std_logic; d0,d1:in std_logic; q0,q1: out std_logic);end multic

    17、lock;architecture Behavioral of multiclock issignal clka,clke: std_logic;beginmain: process(clk)variable count0,count1: integer ;variable clk0,clk1: std_logic; begin if clkevent and clk=1 then count0:=count0+1;count1:=count1+1; if count1=16 then clk1:=1; elsif count1=32 then count1:=0; clk1:=0; end

    18、if; if count0=8then clk0:=1; elsif count0=16 then count0:=0; clk0:=0; end if; end if; clka=clk0;clke=clk1; end process main;second: process(clka)beginif clkaevent and clka=1 thenq0=d0;end if;end process second;third:process(clke)beginif clkeevent and clke=1 thenq1=d1;end if;end process;end Behaviora

    19、l;5.5.6 仿真无波形综合成功后进行波形仿真时常常会看不到波形,一般有两种可能:第一种是仿真周期太长而无法看到,一般见于分频器或计数器中。例如:对一个32MHz的晶振进行分频,要求得到1Hz的信号。这时要等32兆个CLK波形才能看到输出有跳变,在仿真图上当然是无法看到的,如果将分频系数减小,例如8分频,就可以看到仿真波形了。一般分频系数大于几百时就会出现这种现象。第二种是出现不定态(UNKNOWN), 设计分频器时有这种情况,一般是由于没有对变量或信号进行初始化引起的,例如STD_LOGIC有七种逻辑状态,如果不指定其初始值是“0”还是“1”,系统就无法确定。如例5.5.9及其仿真结果(图

    20、5.5.9)所示。【例5.5.9】entity pulse is Port (clk:in std_logic ; c:out std_logic );end pulse;architecture Behavioral of pulse isbeginprocess (clk)variable dd:integer;beginif clkevent and clk=1 thendd:=dd+1;if dd=4 then c=0;elsif dd=8 then c=1;dd:=0;end if;end if;end process;图5.5.9 例5.5.9仿真图(无输出波形)为解决该问题,可以

    21、在定义变量或信号时指定其初始状态。将例中的“variable dd:integer;”改为“variable dd:integer:=0;”,就能得到如图5.5.10所示的波形了。图5.5.10 例5.9改正后的仿真图(正确的波形)另一种办法是增加一个清零或置位信号,通过一个清零或置位信号对信号或变量进行初始化,如例5.5.10所示。得到的结果如图5.5.10所示。【例5.5.10】entity ppp is Port (clk,en:in std_logic ; c:out std_logic );end ppp;architecture Behavioral of ppp isbeginp

    22、rocess (clk,en)variable dd:integer;beginif en=0 then dd:=0; -增加了清零信号elsif clkevent and clk=1 then dd:=dd+1;if dd=4 then c=0;elsif dd=8 then c=1; dd:=0;end if;end if;end process;图5.5.11 例5.50程序仿真图5.5.7 执行时端口丢失 当综合与仿真完成后,就要进行引脚锁定(Edit Implementation Constraite),执行引脚锁定时,有时会发现Port表找不到某些定义过的端口。例如下面一段程序:【

    23、例5.5.11】entity loseport is Port ( clk,en:in std_logic ; c:out std_logic );end loseport;architecture Behavioral of loseport isbeginprocess (clk,en)variable dd:integer range 0 to 256; -变量范围beginif en=0 thendd:=0;elsif clkevent and clk=1 thendd:=dd+1;if dd=612then -分频系数c=0;elsif dd=1024 thenc=1;dd:=0;end if;end if;end process;end Behavioral;综合后出现这样的警告:WARNING:Xst:646 - Signal is assigned but never used. Foun


    注意事项

    本文(全国大学生电子设计竞赛训练教程55 常见错误及其原因分析.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开