一、VHDL的三个基本层次

首先来看一下一个简单的VHDL示例

library IEEE;

use IEEE.STD_LOGIC_1164.ALL; --使用IEEE库中的STD_LOGIC_1164中的所有

entity test_top is --实体的声明

Port (

a : IN STD_LOGIC; --定义a是一个输入的标准逻辑类型

b : IN STD_LOGIC;

s : IN STD_LOGIC;

y : OUT STD_LOGIC

); --实体的端口

end test_top;

architecture Behavioral of test_top is --结构体,实体内部要进行的操作

begin

y <= a WHEN s = '0' -- y=a当s=0的时候

ELSE

b WHEN s = '1';

end Behavioral;

上述代码包含了一个VHDL代码所需要的三个层次 分别是: (1)库:包含器件的输入、输出端口,数据类型。

library IEEE;

use IEEE.STD_LOGIC_1164.ALL; --使用IEEE库中的STD_LOGIC_1164中的所有

(2)实体:在电路原理图上,相当于器件符号,用来描述引脚的

entity test_top is --实体的声明

Port (

a : IN STD_LOGIC; --定义a是一个输入的标准逻辑类型

b : IN STD_LOGIC;

s : IN STD_LOGIC;

y : OUT STD_LOGIC

); --实体的端口

end test_top;

(3)结构体:相当于器件的内部结构,器件的功能

architecture Behavioral of test_top is --结构体,实体内部要进行的操作

begin

y <= a WHEN s = '0' -- y=a当s=0的时候

ELSE

b WHEN s = '1';

end Behavioral;

二、元件例化

首先需要区分实体和元件:总结起来,实体是一个模块的接口描述,用于定义模块的输入和输出信号。元件则是实体的具体实现,包含了实现模块功能的逻辑描述。

VHDL中元件例化主要有两步,首先元件声明(architecture和begin之间),然后元件例化(在电路描述部分,即begin之后)

下面是一个使用VHDL的全加器的例子 (1)首先是半加器的代码

library IEEE;

use IEEE.STD_LOGIC_1164.ALL; --使用IEEE库中的STD_LOGIC_1164中的所有

entity haf_adder is --实体的声明

Port (

a : IN STD_LOGIC; --定义a是一个输入的标准逻辑类型

b : IN STD_LOGIC;

c : OUT STD_LOGIC;

s : OUT STD_LOGIC

); --实体的端口

end haf_adder;

architecture Behavioral of haf_adder is --结构体,实体内部要进行的操作

begin

s <= a XOR b;

c <= a AND b;

end Behavioral;

(2)然后是全加器代码 在全加器中例化了两个半加器

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

entity adder is

Port (

ain : IN STD_LOGIC; --定义a是一个输入的标准逻辑类型

bin : IN STD_LOGIC;

cin : IN STD_LOGIC;

cout: OUT STD_LOGIC;

sum : OUT STD_LOGIC

);

end adder;

architecture Behavioral of adder is

COMPONENT haf_adder --声明元件

Port (

a : IN STD_LOGIC;

b : IN STD_LOGIC;

c : OUT STD_LOGIC;

s : OUT STD_LOGIC

);

END COMPONENT;

SIGNAL c1,c2,s1 :STD_LOGIC; --定义信号线,进行器件的连接

begin

U1 : haf_adder PORT MAP(a=>ain,b=>bin,c=>c1,s=>s1 );

U2 : haf_adder PORT MAP(a=>s1,b=>cin,c=>c2,s=>sum );

--例化元件

cout <= c1 OR c2;

end Behavioral;

其中, 元件声明的方式为 Component 元件名称 is Port(元件端口信息); End component; 即代码中的

元件例化的方式为 例化名 :元件名称 port map 元件端口列表 注意:此处使用了端口信号名称关联方式进行例化元件,推荐使用这种方法,比较直观

最终的程序RTL图、testbeach、仿真图如下

module adder_sim();

reg ain,bin,cin;

wire cout,sum;

initial begin

ain = 0;

bin = 0;

cin = 0;

#2

ain = 1;

bin = 0;

cin = 0;

#2

ain = 1;

bin = 1;

cin = 0;

#2

ain = 1;

bin = 1;

cin = 1;

#2

$stop;

end

adder adder(

.ain(ain),

.bin(bin),

.cin(cin),

.cout(cout),

.sum(sum)

);

endmodule

参考文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: