|
VHDL语言是IEEE工业标准硬件描述语言,它具有很强的行为描述能力,具有支持大规模设计的分解和已有设计的再利用功能.与原理图输入方式相比较,用语言的方式描述硬件电路,更容易修改和保存. 因此,目前VHDL在电路设计中得到了广泛应用. 由于VHDL包含的语句非常丰富,初学者不容易快速掌握,在使用时容易出现这样或那样的问题. 1 要严格区分信号和变量的不同 信号和变量是在用VHDL语言进行电路描述中极容易混淆的两个概念,因此,要注意信号与变量在基本用法、适用范围、行为特性等方面的不同,如表1所示.
表1 信号和变量的特性比较 信号(SIGNAL) 变量(VARIABLE)基本用法电路中的信号连线进程中局部数据存储单元适用范围结构体内的任何地方所定义的进程中行为特性最后才对信号赋值立即赋值
例1 程序1: ENTITY reg1 IS PORT(d:in BIT; clk:inBIT; q:outBIT); END reg1; ARCHITECTURE reg1 OF reg1 IS SIGNAL a,b:BIT; BEGIN PROCESS(clk) BEGIN IF clk='1'AND elk'event THEN a<= d;b<=a;q<=b; END IF; END PROCESS; END reg1;
程序2: ENTITY reg1 IS PORT(d:in BIT; clk:in BIT; q:outBIT); END regl; ARCHITECTURE reg1 OF reg1 IS BEGIN PROCESS(clk) VARIABLE a,b :BIT; BEGIN IF clk='1' AND clk'event THEN a:=d;b:=a;q<= b; END IF; END PROCESS; END reg1; 程序1中信号作为电路中的连线,引人了触发器,程序2中变量没有产生连线,不引入触发器. 2 要注意不同语句能够实现同样的功能. 在VHDL语言中,有丰富的语句可供选择.不同的语句虽结构和用法不尽相同,描述的方式和风格也不相同,但有时描述的功能是相同的.例如,下列各程序都是D触发器的描述方式.
例2 程序1: architecture body of test1 is signal q1:bit; begin process(clk) begin if clk='1'AND clk'last_value='0'then q1<= d: end if; q<=q1: end process; end testl_body;
程序2: architecture body of test1 is begin process(clk,d) begin if rising_edge(clk)then q<=d: end if; end process; end test1_body;
程序3: architecture body of test1 is signal q1:bit; begin process(clk) begin if(clk='1')then q1<=d: end if; q<= q1; end process; end body;
程序4: architecture body of test1 is signal q1:bit; begin process(clk,d) begin if(clk='1')then q1<=d; end if; q<=q1; end process; end body; 程序1中的clk='1' AND clk'last_value='0',程序2中的rising_edge(clk),程序3中的(clk='1'),都是表示的时钟上升沿,它们是D触发器的几种不同描述. 3 关于IF语句 IF语句作为一种条件语句,有3种语句结构,在选择使用哪一种语句结构时,要注意一下2个问题. (1)在描述组合逻辑电路时,为了不引入不必要的寄存器,则应选择带有ELSE结构的语句,或者使用When……Else,Case语句来代替IF结构.例如: PROCESS(a,b,j,k) BEGIN IF a='1'andb='0'THEN step<="1000OO00"; ELSIF a='1'THEN step<=j; ELSIF b='1'THEN step<=k: ELSE step<="00000000"; 如果在程序中不加ELSE step<="00000000"这句,则暗示step会保持原有值,会生成一个含有8位寄存器的结构,从而使电路复杂度大大增加.
(2)用IF语句描述寄存器功能时,有时禁止使用ELSE项.由于在有些情况下,这种结构相当于在没有时钟信号时就赋新值,而实际上不可能有这样的硬件电路与之对应.例如,在如下情况下禁止使用ELSE项: PROCESS(clk) BEGIN IF clk'event an d clk='1'THEN y<=m; ELSE /禁止使用 y<=n; END IF; END PROCESS; 但在如下情况下,则可以使用ELSE项: PROCESS(clk) BEGIN IF clk'event and clk='1'THEN IF ena='1'THEN y<=m; ELSE /可以使用 y<=n; END IF; END IF; END PROCESS; VHDL语言中的信号、变量以及IF语句,都比较常用但极易出现问题,在使用中要根据实际的描述要求,合理选择,谨慎使用. |
|