适合有编程基础的同学快速入门食用。
主要参考和引用了下列文章:
- 王万霖 https://zhuanlan.zhihu.com/p/26066023
- 李辉 https://zhuanlan.zhihu.com/p/26897011
- vinyjh https://blog.csdn.net/vinyjh/article/details/107313683
程序的基本结构
library ieee;
use ieee.std_logic_1164.all;
-- 实体部分
entity entityName is
port(
-- 端口定义部分
)
end entityName;
-- 架构部分
architecture entityArch of entityName is
-- 信号,属性,变量定义部分
begin
-- process 或者
end;
引入语句
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
端口的定义
s : in STD_LOGIC; -- 单个变量
y : out STD_LOGIC)-- 输出信号(最后一个没有分号!!!)
);
数组
led : out STD_LOGIC_VECTOR(7 downto 0));
);
允许的端口模式
- IN(输入):该端口是只读的。
- OUT(输出):该端口是只写的。
- INOUT(双向):该端口既允许数据流入,也允许数据流出。
- BUFFER(缓冲):和 INOUT 类似,但区别在于当需要读取数据时,只能读取内部产生的反馈信号。
信号的定义
signal numH : std_logic_vector(3 downto 0) := "0000";
signal numL : std_logic_vector(3 downto 0) := "0000";
signal overflow: std_logic := '1'; -- 溢出标志,低电位有效
begin
-- ...```
<p>
变量和常量同理
</p>
```vhdlconstant clkPeriod : time := 20 ns; -- 主时钟定义 50Mhz
signal cnt : integer range 0 to 255 := 0;
赋值语句
Process (进程)
括号里写入 敏感量
begin
-- ...
end process;
条件运算符
< -- 小于
> -- 大于
not (a = b) -- 不等判定
(a = b) or (a > b)-- 大于等于 ```
## 时钟条件
```vhdl--- 上升沿
clock’event and clock='1';
rising_egde(clock);
--- 下降沿
clock’event and clock=‘0’;
falling_egde(clock);
If 语句
Process 中可用。
led <= '1';
end if;
<h3 id="rtoc-11" >
else
</h3>
begin
if (button = '0') then -- 如果 button 被按下
led <= "11111111";
else
led <= "00000000";
end if;
end process;
Case 语句
when "0000" => segH <= "1111110";
when "0001" => segH <= "0110000";
when "0010" => segH <= "1101101";
when "0011" => segH <= "1111001";
when "0100" => segH <= "0110011";
when "0101" => segH <= "1011011";
when "0110" => segH <= "1011111";
when "0111" => segH <= "1110000";
when "1000" => segH <= "1111111";
when "1001" => segH <= "1111011";
when others => segH <= "0000001";
end case;
wait for 语句
类似于 Thread.sleep