分类: 嵌入式
2011-01-05 16:02:42
VHDL语言是IEEE工业标准硬件描述语言,它具有很强的行为描述能力,具有支持大规模设计的分解和已有设计的再利用功能.与原理图输入方式相比较,用语言的方式描述硬件电路,更容易修改和保存. 因此,目前VHDL在电路设计中得到了广泛应用. 由于VHDL包含的语句非常丰富,初学者不容易快速掌握,在使用时容易出现这样或那样的问题.
1 要严格区分信号和变量的不同
信号和变量是在用VHDL语言进行电路描述中极容易混淆的两个概念,因此,要注意信号与变量在基本用法、适用范围、行为特性等方面的不同,如表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语句,都比较常用但极易出现问题,在使用中要根据实际的描述要求,合理选择,谨慎使用.