VHDL十大经典基础功能设计实例代码合集

VHDL十大经典基础功能设计实例代码合集

一、文档概述

VHDL是硬件描述语言核心标准,广泛应用于FPGA、ASIC开发,入门阶段掌握基础逻辑、时序、计数器、状态机等经典模块是硬件开发必备能力。本文整理10个高频经典VHDL工程案例,覆盖组合逻辑、时序逻辑、分频、移位寄存器、状态机等核心场景,每个案例附带可直接综合、仿真的完整代码,适配Quartus、Vivado主流开发工具,适合硬件初学者快速上手实操。

二、十大经典VHDL案例代码演示

案例1:二输入与门(组合逻辑基础)

最简组合逻辑,理解实体、结构体基础语法

vhdl 复制代码
library ieee;
use ieee.std_logic_1164.all;

entity and2 is
port(
    a,b : in std_logic;
    y   : out std_logic
);
end entity and2;

architecture behav of and2 is
begin
    y <= a and b;
end architecture behav;

案例2:4位二进制加法器

多位运算基础,掌握矢量信号使用

vhdl 复制代码
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity add4 is
port(
    num1,num2 : in std_logic_vector(3 downto 0);
    sum_out   : out std_logic_vector(3 downto 0);
    carry     : out std_logic
);
end add4;

architecture behav of add4 is
signal temp : std_logic_vector(4 downto 0);
begin
    temp <= ('0' & num1) + num2;
    sum_out <= temp(3 downto 0);
    carry <= temp(4);
end behav;

案例3:D触发器(基础时序单元)

时序逻辑入门,时钟、复位信号标准写法

vhdl 复制代码
library ieee;
use ieee.std_logic_1164.all;

entity dff is
port(
    clk,rst,d : in std_logic;
    q         : out std_logic
);
end dff;

architecture behav of dff is
begin
process(clk,rst)
begin
    if rst = '1' then
        q <= '0';
    elsif rising_edge(clk) then
        q <= d;
    end if;
end process;
end behav;

案例4:8位同步计数器

掌握时序进程、循环计数逻辑

vhdl 复制代码
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity cnt8 is
port(
    clk,rst : in std_logic;
    cnt_out : out std_logic_vector(7 downto 0)
);
end cnt8;

architecture behav of cnt8 is
signal cnt : std_logic_vector(7 downto 0);
begin
process(clk,rst)
begin
    if rst='1' then
        cnt <= (others=>'0');
    elsif rising_edge(clk) then
        cnt <= cnt + 1;
    end if;
end process;
cnt_out <= cnt;
end behav;

案例5:二分频电路

时钟分频最常用基础模块

vhdl 复制代码
library ieee;
use ieee.std_logic_1164.all;

entity div2 is
port(
    clk_in,rst : in std_logic;
    clk_out    : out std_logic
);
end div2;

architecture behav of div2 is
signal temp : std_logic;
begin
process(clk_in,rst)
begin
    if rst='1' then
        temp <= '0';
    elsif rising_edge(clk_in) then
        temp <= not temp;
    end if;
end process;
clk_out <= temp;
end behav;

案例6:4位移位寄存器

串行数据传输基础模块

vhdl 复制代码
library ieee;
use ieee.std_logic_1164.all;

entity shift4 is
port(
    clk,rst,sin : in std_logic;
    q           : out std_logic_vector(3 downto 0)
);
end shift4;

architecture behav of shift4 is
signal reg : std_logic_vector(3 downto 0);
begin
process(clk,rst)
begin
    if rst='1' then
        reg <= "0000";
    elsif rising_edge(clk) then
        reg <= reg(2 downto 0) & sin;
    end if;
end process;
q <= reg;
end behav;

案例7:3-8译码器

地址译码、外设选通核心电路

vhdl 复制代码
library ieee;
use ieee.std_logic_1164.all;

entity decoder38 is
port(
    din : in std_logic_vector(2 downto 0);
    dout: out std_logic_vector(7 downto 0)
);
end decoder38;

architecture behav of decoder38 is
begin
with din select
dout <= "00000001" when "000",
        "00000010" when "001",
        "00000100" when "010",
        "00001000" when "011",
        "00010000" when "100",
        "00100000" when "101",
        "01000000" when "110",
        "10000000" when others;
end behav;

案例8:多路选择器MUX8to1

数据通路切换通用模块

vhdl 复制代码
library ieee;
use ieee.std_logic_1164.all;

entity mux8_1 is
port(
    sel : in std_logic_vector(2 downto 0);
    datain : in std_logic_vector(7 downto 0);
    dataout : out std_logic
);
end mux8_1;

architecture behav of mux8_1 is
begin
with sel select
dataout <= datain(0) when "000",
           datain(1) when "001",
           datain(2) when "010",
           datain(3) when "011",
           datain(4) when "100",
           datain(5) when "101",
           datain(6) when "110",
           datain(7) when others;
end behav;

案例9:奇偶校验电路

通信数据校验基础设计

vhdl 复制代码
library ieee;
use ieee.std_logic_1164.all;

entity parity is
port(
    din : in std_logic_vector(7 downto 0);
    parity_bit : out std_logic
);
end parity;

architecture behav of parity is
begin
parity_bit <= din(0) xor din(1) xor din(2) xor din(3)
            xor din(4) xor din(5) xor din(6) xor din(7);
end behav;

案例10:三段式有限状态机FSM

复杂时序逻辑标准开发范式

vhdl 复制代码
library ieee;
use ieee.std_logic_1164.all;

entity fsm3seg is
type state_type is (s0,s1,s2,s3);
port(
    clk,rst,start : in std_logic;
    state_out     : out std_logic_vector(1 downto 0)
);
end fsm3seg;

architecture behav of fsm3seg is
signal curr_state,next_state : state_type;
begin
--第一段:时序逻辑 状态寄存
process(clk,rst)
begin
    if rst='1' then
        curr_state <= s0;
    elsif rising_edge(clk) then
        curr_state <= next_state;
    end if;
end process;

--第二段:组合逻辑 状态跳转
process(curr_state,start)
begin
case curr_state is
when s0 => if start='1' then next_state<=s1; else next_state<=s0; end if;
when s1 => next_state <= s2;
when s2 => next_state <= s3;
when s3 => next_state <= s0;
end case;
end process;

--第三段:组合逻辑 输出逻辑
with curr_state select
state_out <= "00" when s0,
             "01" when s1,
             "10" when s2,
             "11" when s3;
end behav;

三、使用说明

  1. 编译环境:代码兼容Vivado 2018+、Quartus II 13.0及以上版本;
  2. 仿真操作:新建工程,复制对应模块代码,添加testbench即可完成波形仿真;
  3. 综合注意:时序模块务必同步复位/异步复位规范书写,避免亚稳态;
  4. 拓展方向:可基于计数器、分频器组合设计计时器、流水灯等综合项目。

海量精选技术文档和实战案例持续更新,敬请关注【风骏时光少年】

相关推荐
开开心心就好4 小时前
批量提取PDF中的图片,直接导出原图
前端·javascript·支持向量机·智能手机·pdf·html·启发式算法
Setsuna_F_Seiei6 小时前
前端转型 Agent 开发 05 之 Agent Hooks 与 Checkpointer(让 Agent 从全自动转变人为可掌控)
前端·agent·ai编程
百万蹄蹄向前冲8 小时前
风扇转了一晚上MVP专家团翻车事故
前端·人工智能
默_笙8 小时前
🏛 给 AI 配一间办公室:Harness Engineering 六大模块与它的实现
前端·javascript
linux_cfan10 小时前
videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力
前端·javascript·音视频
kyriewen10 小时前
我扒了 10,221 条 JD:腾讯技术岗 75% 在要 AI
前端·人工智能·ai编程
郑州光合科技余经理11 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
IT_陈寒12 小时前
Vue的响应式让我熬到凌晨三点,原来漏了这个小细节
前端·人工智能·后端
Blanche150012 小时前
利用 RAG 为答疑机器人扩展知识范围
前端
天若有情67312 小时前
【纯前端小工具】公历生日转农历,批量查询每年农历生日对应的公历日期(GitHub Pages在线直接用)
前端·javascript·github pages·农历转换·lunisolar·网页小工具