这次由于是小小拓展一下,所以就不系统写教程了.所有知识点和细节都在注释里面.
--是注释,vhdl不区分大小写,教程一般是全部大写的,那我就全部小写吧
-------------------------------------------------------------------------
--首先是vhdl的库声明,有三个常用的库:
library ieee;
use ieee.std_logic_1164.all;
-- 库名 .包名 .引用部分
--以下两个库在程序中都是默认"包含"的,所以可以不写
library standard;
use std.standard.all;
library work;
use work.all;
--------------------------------------------------------------------------
--接下来是实体(entity)声明,相当于verilog里面的module声明
entity D_NAND is
port (
a,b,clk : IN BIT;
q : OUT BIT
);
end D_NAND;
--vhdl有些时候语法看起来就像是英语一样.
--里面涵盖的信息,相当于verilog里面的外部端口声明.
--可以看出有三个端口,ab是输入端口,c是输出端口,数据类型都是BIT.
--端口类型有四种:in(输入),out(输出),inout(双向引脚),buffer(反馈引脚)
--信号类型有比较多种,常见的有:BIT,STD_LOGIC,INTEGER等
---------------------------------------------------------------------------
--接下来是结构体(architecture)部分,用来描述电路功能.
--多封装了一层architecture我个人觉得可以便捷地进行电路的版本管理吧,综合器只会选用一个结构体.
architecture d_a_b of D_NAND is
signal temp : BIT ;
begin
temp <= a nand b ;
process (clk)
begin
if(clk'event and clk = '1')
then q <= temp ;
end if;
end process;
end d_a_b;
--d_a_b是architecture的名字
--注意: <= 不再是verilog里面的阻塞赋值,在这里是信号的赋值而已
-- nand是RTL级电路描述,与非
-- process是顺序执行语句,括号里面是敏感信号,类比verilog里面always后面的括号
--程序中,除了process之外,其它的都是并行在走的.相当于always
--在vhdl里面会分清楚触发process的事件,如代码便表示在时钟上升沿时触发if
------------------------------------------------------------------------------