目标
用VHDL实现多个D触发器构成的计数器
源码
阶段一:实现一个D触发器
library ieee ;
use ieee.std_logic_1164.all ;
entity VHDL is
port (
clk: in std_logic; --时钟信号
d: in std_logic;
q:out std_logic
);
end VHDL;
architecture dataflow of VHDL is
begin
--D触发器赋值过程
process(clk)
begin
if rising_edge(clk) then
q <= d;
end if;
end process;
end dataflow;
这里我们引入了process,下文有简单的说明,也可以自己搜索。
这个实例可以实现D触发器的功能,波形模拟略
library ieee ;
use ieee.std_logic_1164.all ;
entity VHDL is
port (
clk: in std_logic; --时钟信号
-- d: in std_logic;
q_out_0, q_out_1, q_out_2: out std_logic
);
end VHDL;
architecture dataflow of VHDL is
signal q0: std_logic:='0';
signal q1: std_logic:='0';
signal q2: std_logic:='0';
begin
--D触发器赋值过程
process(clk)
begin
if rising_edge(clk) then
q0 <= (not q2) or q1; --自己根据状态转换分析得出的次态方程
q1 <= (not q2) and q0;
q2 <= (q1 and q0) or (q2 and q0);
end if;
end process;
当然,这是利用现有知识点生硬地实现的计数器,实际使用中,会引入更多的知识点,比如component、std_logic_vector类型等
学到的知识点
signal
信号是描述硬件系统的基本数据对象,它类似于连接线。它除了没有数据流动方向说明外,其它性质与实体的端口port类似。
使用和定义的范围是实体、结构体和程序包。
在程序中:
- 信号值的代入采用“<=”代入符,代入时可以附加延时。
- 变量赋值时用“: =”,不可附加延时。
process
Process过程是一个顺序执行的代码块,用于描述组合逻辑或时序逻辑。
一般格式:
process(sensitivity_list)
begin
--process code
end process
--其中,sensitivity_list是影响process执行的信号列表
--对于时序逻辑,sensitivity_list通常只包含时钟信号。
process+signal的理解
process(A,B,C,D)
BEGIN
D<=A;
X<=B+D;
D<C;
Y<=B+D;
END PROCESS;
--由于代入时没有进行时延处理,仿真时认为时间0值延时,执行结果D最终为C,X和Y的内容都是B+C。