VHDL 快速入门(一)
写在前面
本篇主旨,以实际案例解析 VHDL。
吐槽,代码块没有 VHDL 的格式,看起来不大舒服…
代码中的--xxx
是注释
通用位移寄存器
VHDL代码示例
library ieee; --声明库
use ieee.std_logic_1164.all; --调用库里面的std_logic_1164这个包
entity SHIFT is
port(
CLK,C0 :in std_logic;
MD :in std_logic_vector(2 downto 0);
D :in std_logic_vector(7 downto 0);
QB :out std_logic_vector(7 downto 0);
CN :out std_logic);
end entity SHIFT;
architecture BHV of SHIFT is
signal REG : std_logic_vector(7 downto 0);
signal CY : std_logic;
begin
process(CLK,MD,C0)
begin
if CLK'EVENT AND CLK='1' then
case MD is
when "001" =>
REG(0)<=C0;
REG(7 downto 1)<=REG(6 downto 0);
CY<=REG(7);
when "010" =>
REG(7)<=C0;
REG(6 downto 0)<=REG(7 downto 1);
CY<=REG(7);
when "011" =>
REG(0)<=REG(7);
REG(7 downto 1)<=REG(6 downto 0);
CY<=REG(7);
when "100" =>
REG(7)<=REG(0);
REG(6 downto 0)<=REG(7 downto 1);
CY<=REG(7);
when "101" =>
REG(7 downto 0)<= D(7 downto 0);
when others =>
REG<=REG; CY<=CY;
end case;
end if;
end process;
QB(7 downto 0)<=REG(7 downto 0); CN<=CY;
end BHV;
分析
上述代码主要涉及到了实体、结构体以及进程
实体
一般格式:
entity 实体名 is
generic(常数名:数据类型:初值)
port(端口信号名:数据类型)
end 实体名
示例格式:
entity SHIFT is
port(
CLK,C0 :in std_logic;
MD :in std_logic_vector(2 downto 0); --可定义字符长度
D :in std_logic_vector(7 downto 0); --注意区别downto和to
QB :out std_logic_vector(7 downto 0);
CN :out std_logic);
end entity SHIFT;
结构体
一般格式:
architecture 结构体名 of 实体名 is
说明部分(可选,如数据类型type 常数constand 信号signal 元件component 过程pocedure 变量variable和进程process等)
begin
功能描述部分
end 结构体名
示例格式:
architecture BHV of SHIFT is
signal REG : std_logic_vector(7 downto 0);
signal CY : std_logic;
begin
功能描述部分
end BHV;
进程
一般格式:
[ 进程标号 :] ] PROCESS ( 敏感信号参数表 )
[声明区 ] ;
BEGIN
顺序语句
END PROCESS [进程标号] ;
示例格式:
process(CLK,MD,C0) --这边只有一个进程,因此不加进程标号也可以
begin
--顺序语句,应当包括if、wait、case、loop
if CLK'EVENT AND CLK='1' then --CLK'EVENT AND CLK='1'即为上升沿触发
case MD is
--选择判定
end case;
end if;
end process;
选择语句
一般格式:
CASE 表达式 IS
WHEN 选择值 [ 选择值 ]=>
顺序语句;
WHEN 选择值 [ 选择值 ]=>
顺序语句;
WHEN OTHERS=>
顺序语句;
END CASE;
示例格式:
case MD is
when "001" =>
REG(0)<=C0;
REG(7 downto 1)<=REG(6 downto 0);
CY<=REG(7);
when "010" =>
REG(7)<=C0;
REG(6 downto 0)<=REG(7 downto 1);
CY<=REG(7);
when "011" =>
REG(0)<=REG(7);
REG(7 downto 1)<=REG(6 downto 0);
CY<=REG(7);
when "100" =>
REG(7)<=REG(0);
REG(6 downto 0)<=REG(7 downto 1);
CY<=REG(7);
when "101" =>
REG(7 downto 0)<= D(7 downto 0);
when others =>
REG<=REG; CY<=CY;
end case;
注意:在选择语句中,需要把所有情况都列出来,不要有空闲状态,否则会引入锁存器。
总结
以实例进行相关内容的学习,应该还是有收获的…
需要注意的是,本篇还有未涉及到的 VHDL 知识,请读者自行拓展学习。