VHDL简述
这学期学了相关课程,要用到vhdl,简单记录一下用到的一些东西。
1. VHDL基本结构
2. 运算符
3. 赋值符号
4. 并行语句
5. 元件例化
1. VHDL基本结构
VHDL的基本结构包括库声明、实体声明和架构体等部分。
- 库声明:包含使用的库和包。
- 实体声明:定义了模块的接口,包括端口。
- 架构体:描述了实体的内部实现。
一个简单的VHDL示例:LED闪烁
-- 库声明
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- 实体声明
entity LED_Blink is
Port (
clk : in STD_LOGIC; -- 输入时钟
reset : in STD_LOGIC; -- 复位信号
led : out STD_LOGIC -- 输出LED控制信号
);
end LED_Blink;
-- 架构体
architecture Behavioral of LED_Blink is
signal led_state : STD_LOGIC := '0'; -- 定义内部信号
begin
process(clk, reset)
begin
if reset = '1' then
led_state <= '0'; -- 复位时LED熄灭
elsif rising_edge(clk) then
led_state <= not led_state; -- 每个时钟上升沿翻转LED状态
end if;
end process;
led <= led_state; -- 将内部信号连接到输出端口
end Behavioral;
解释
-
库声明:引用了IEEE标准库STD_LOGIC_1164,它定义了STD_LOGIC类型。
-
实体声明:定义了模块LED_Blink,它有三个端口:输入时钟clk,复位信号reset和输出led。
-
架构体:定义了模块的行为。
- 内部信号led_state:用于存储LED的当前状态,初始化为0。
- 过程块process(clk, reset):当复位信号为1时,将LED状态设置为0(LED熄灭)。在时钟上升沿,翻转LED状态。
- 信号赋值:将内部信号led_state的值赋给输出端口led。
2. 运算符
/=: 不等运算。例如:a /= b。
&: 例如:a & b,将a和b拼接成一个更长的向量。
其他大多与c语言类似。
3. 赋值符号
- 信号赋值符号 (<=)
- 用于将一个值赋给信号(signal)。
- 这种赋值是延迟的,即在当前进程(process)完成时才会生效。
signal my_signal : std_logic;
my_signal <= '1';
- 变量赋值符号 (:=)
- 用于将一个值赋给变量(variable)。
- 这种赋值是立即生效的。
variable my_variable : integer;
my_variable := 10;
- 常量赋值符号 (:=)
constant my_constant : integer := 5;
- 端口映射赋值符号 (=>)
- 用于在端口映射(port map)或生成映射(generate map)时,连接实际信号到端口。
U1: entity work.my_entity
port map (
clk => clk_sig,
reset => reset_sig
);
4. 并行语句
- 并行信号赋值语句
并行信号赋值语句用于为信号赋值,并且这些赋值是并行执行的。
signal a, b, c : std_logic;
signal d : std_logic;
a <= '1';
b <= a;
c <= b;
d <= c;
在上面的例子中,所有赋值操作是并行执行的。
- 并行选择信号赋值语句
并行选择信号赋值语句允许根据条件选择性的为信号赋值。
signal sel : std_logic_vector(1 downto 0);
signal y : std_logic;
with sel select
y <= '0' when "00",
'1' when "01",
'Z' when "10",
'X' when others;
- 生成语句(Generate Statement)
生成语句用于在结构描述中创建多个相同的实例。
gen_label: for index in range generate
-- 并行语句
end generate;
- 并行进程语句(Process Statement)
进程语句用于描述一组在某些事件(例如信号变化)触发时执行的并行操作。
process1 (sensitivity_list)
begin
-- 顺序语句
end process1;
process2 (sensitivity_list)
begin
-- 顺序语句
end process2;
process1和process2是并行的。
- 并行块语句(Block Statement)
块语句用于将一组并行语句组合在一起,并为其提供一个局部作用域。
block_label: block
signal declarations;
begin
-- 并行语句
end block;
5. 元件例化
将已经设计好的模块,封装为元件,然后在新的设计实体中调用该元件,构成层次化的设计。
由 元件声明 和 元件例化 组成。
元件定义是将已经完成的设计实体封装为一个元件,是在 architecture 和 begin 关键字之间用 component 语句完成。
元件例化就是调用该元件,一般通过 port map 端口映射语句实现对应。
举例如下:
- 元件声明
component my_component is
port (
a : in std_logic;
b : in std_logic;
y : out std_logic
);
end component;
有一个元件叫做my_component,它有两个输入信号和一个输出信号.
- 元件例化
label: my_component
port map (
a => signal_a,
b => signal_b,
y => signal_y
);
label是该实例的标签,可以任意取名,my_component是元件的名称,port map用于将实体的端口连接到具体的信号。这里采用名称关联。