Site Overlay

VHDL 笔记

适合有编程基础的同学快速入门食用。

主要参考和引用了下列文章:

程序的基本结构

-- 调用的库引入部分
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;

发表评论

电子邮件地址不会被公开。 必填项已用*标注