和前面相同的我就不解释了
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;--不解释
ENTITY BUFF IS --buff实体定义
PORT
(
LD: IN STD_LOGIC;
AA: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
BB: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
);--ld AA为输入型号 bb为输出 其中AA BB 是4位信号
END BUFF;
ARCHITECTURE a OF BUFF IS 定义buff实体下的结构体a
SIGNAL BUFF1: STD_LOGIC_VECTOR(3 DOWNTO 0); 定义信号量buff1 共4位
BEGIN 开始
PROCESS(LD) 引入进程(LD为敏感信号) 一般敏感信号是你的输入端口
BEGIN 开始
IF LD='1' THEN BUFF1<=AA; 如果ld为高电平 则 AA的4位数据送入buff信号量 记住 只有 定义的信号量 采用“<=”这个符号 定义变量 符号为“:=”
ELSE NULL;--否则 不做任何事情
END IF;结束if
END PROCESS;结束进程
BB<=BUFF1; 把buff1的值送给外部端口BB
END A;结束A
另外说一句 信号量可以看成是内部电源线路 有硬件特性 是有先后顺序的,而变量 是可以随时改变的 如果不明白 可以查查C语言中的volatile关键字(VHDL里面没有这个关键字,但意思是一样的)
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;--不解释
ENTITY cnt10 IS --定义cnt10这个实体
PORT
(
clk,rst,en: IN STD_LOGIC;
CQ : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
COUT : OUT STD_LOGIC
); --端口定义 clk rst en为输入,cq 是4位输出 cout是输出
END CNT10;
ARCHITECTURE a OF CNT10 IS--定义cnt10实体下的a结构体
BEGIN-开始
PROCESS (clk,RST,EN)-进程开始 敏感信号 clk rst en
VARIABLE CQI: STD_LOGIC_VECTOR(3 DOWNTO 0);--定义变量 CQI 4位
BEGIN 开始
IF RST = '1' THEN CQI:=(OTHERS=>'0'); 如果RST为高电平 则 CQI全部是低电平 注意“:=”前面我说过
ELSIF (clk'EVENT AND clk = '1') THEN 否则 上升沿来的时候
IF EN = '1' THEN 外加en为高电平的时候
IF CQI<9 THEN CQI:=CQI+1; 然后CQI 小于9 这3个条件同时满足(有先后优先级顺序的)CQI 自加1
ELSE CQI:=(OTHERS=>'0'); 否则CQI清零
END IF;结束if
END IF;结束if
END IF;结束if
IF CQI=9 THEN COUT<='1';如果cqi=9 则cout输出高电平
ELSE COUT<='0'; 否则 cout一直为低电平
END IF;
CQ<=CQI; CQI的值传给CQ
END PROCESS;结束进程
END a; 结束
另外 一个实体可以有多个结构体 也就是说 一个cnt10可以有a这个结构体 比如上面这个程序 也可以有b,c,d....这些 所以要有一个begin...
这个程序每隔9个时钟周期输出一个高电平 可以看成分频程序