适合有编程基础的同学快速入门食用。
主要参考和引用了下列文章:
- 王万霖 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;
引入语句
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
端口的定义
port(a, b : in STD_LOGIC; -- 多个变量可以逗号隔开
s : in STD_LOGIC; -- 单个变量
y : out STD_LOGIC)-- 输出信号(最后一个没有分号!!!)
);
数组
port(
led : out STD_LOGIC_VECTOR(7 downto 0));
);
允许的端口模式
- IN(输入):该端口是只读的。
- OUT(输出):该端口是只写的。
- INOUT(双向):该端口既允许数据流入,也允许数据流出。
- BUFFER(缓冲):和INOUT类似,但区别在于当需要读取数据时,只能读取内部产生的反馈信号。
信号的定义
architecture Behavioral of suanpan is
signal numH : std_logic_vector(3 downto 0) := "0000";
signal numL : std_logic_vector(3 downto 0) := "0000";
signal overflow: std_logic := '1'; --溢出标志, 低电位有效
begin
-- ...
变量和常量同理
constant clkPeriod : time := 20 ns; --主时钟定义 50Mhz
signal cnt : integer range 0 to 255 := 0;
赋值语句
led <= '1';
Process (进程)
括号里写入 敏感量
process(clock, rst)
begin
-- ...
end process;
条件运算符
= -- 相等判定
< -- 小于
> -- 大于
not(a = b) -- 不等判定
(a = b) or (a > b)-- 大于等于
时钟条件
--- 上升沿
clock’event and clock='1';
rising_egde(clock);
--- 下降沿
clock’event and clock=‘0’;
falling_egde(clock);
If 语句
Process 中可用。
if (条件) then
led <= '1';
end if;
else
process (button)
begin
if (button = '0') then --如果button被按下
led <= "11111111";
else
led <= "00000000";
end if;
end process;
Case 语句
case numH is
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
wait for clk/2;