状态机思想编程

1. LED流水灯的FPGA代码

一个使用状态机思想来实现LED流水灯的FPGA代码

这个例子采用VHDL编写

VHDL代码示例:
复制代码
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity led_flowing is
    Port ( clk   : in  std_logic;
           reset : in  std_logic;
           led   : out std_logic_vector(7 downto 0));
end led_flowing;

architecture Behavioral of led_flowing is
    type state_type is (s0, s1, s2, s3, s4, s5, s6, s7);
    signal current_state, next_state : state_type;
    signal count : integer := 0;
    
begin
    process(clk, reset)
    begin
        if reset = '1' then
            current_state <= s0;
        elsif rising_edge(clk) then
            current_state <= next_state;
        end if;
    end process;

    process(current_state)
    begin
        case current_state is
            when s0 =>
                led <= "00000001";  -- 灯1亮
                next_state <= s1;
            when s1 =>
                led <= "00000010";  -- 灯2亮
                next_state <= s2;
            when s2 =>
                led <= "00000100";  -- 灯3亮
                next_state <= s3;
            when s3 =>
                led <= "00001000";  -- 灯4亮
                next_state <= s4;
            when s4 =>
                led <= "00010000";  -- 灯5亮
                next_state <= s5;
            when s5 =>
                led <= "00100000";  -- 灯6亮
                next_state <= s6;
            when s6 =>
                led <= "01000000";  -- 灯7亮
                next_state <= s7;
            when s7 =>
                led <= "10000000";  -- 灯8亮
                next_state <= s0;
            when others =>
                led <= "00000000";  -- 关闭所有灯
                next_state <= s0;
        end case;
    end process;

end Behavioral;
仿真测试代码:
复制代码
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity tb_led_flowing is
end tb_led_flowing;

architecture Behavioral of tb_led_flowing is

    signal clk   : std_logic := '0';
    signal reset : std_logic := '0';
    signal led   : std_logic_vector(7 downto 0);

    constant CLK_PERIOD : time := 10 ns;

begin

    uut: entity work.led_flowing
        port map (
            clk => clk,
            reset => reset,
            led => led
        );

    -- Clock generation
    clk_process :process
    begin
        while True loop
            clk <= '0';
            wait for CLK_PERIOD/2;
            clk <= '1';
            wait for CLK_PERIOD/2;
        end loop;
    end process;

    -- Stimulus process
    stim_proc: process
    begin
        reset <= '1';
        wait for 20 ns;
        reset <= '0';
        wait for 300 ns; -- 放置足够的时间进行观察
        assert false report "End of simulation" severity note;
        wait;
    end process;

end Behavioral;

流水灯演示:

2. CPLD和FPGA芯片的主要技术区别

CPLD(复杂可编程逻辑器件)与FPGA(现场可编程门阵列)的主要区别:

1、结构与规模

CPLD :通常具有较小的逻辑单元和较低的延迟,适合简单的组合逻辑和小规模状态机。FPGA:具有较大的逻辑块(逻辑单元),可以支持更复杂的设计和更高的并行处理能力。

2、应用场合

CPLD :适合用于控制逻辑、状态机、小型接口或数据处理,通常用于低功耗、高速的应用。244FPGA:适用于需要处理大量并行信号和复杂算法的应用,如图像处理、数据加速等。

相关推荐
应用市场2 小时前
深入理解STM32运行原理:从上电到主程序执行的完整过程
stm32·单片机·嵌入式硬件
空管电小二2 小时前
【开关电源篇】整流及其滤波电路的工作原理和设计指南-超简单解读
经验分享·单片机·嵌入式硬件·社交电子·学习方法
逼子格2 小时前
Altium Designer(AD)原理图更新PCB后所有器件变绿解决方案
单片机·嵌入式硬件·硬件工程·问题解决·ad·pcb·altium designer
wei-dong-183797540084 小时前
嵌入式硬件工程师的每日提问
嵌入式硬件
文火冰糖的硅基工坊5 小时前
[硬件电路-180]:集成运放,在同向放大和反向放大电路中,失调电压与信号一起被等比例放大;但在跨阻运放中,失调电压不会与电流信号等比例放大。
嵌入式硬件·系统架构·电路·跨学科融合
三佛科技-134163842125 小时前
迷你取暖器MCU方案,迷你暖风机方案分析
单片机·嵌入式硬件·智能家居·pcb工艺
国科安芯5 小时前
前沿探索:RISC-V 架构 MCU 在航天级辐射环境下的可靠性测试
网络·单片机·嵌入式硬件·fpga开发·硬件架构·risc-v
小莞尔5 小时前
【51单片机】【protues仿真】基于51单片机多功能电子秤系统
单片机·嵌入式硬件
范纹杉想快点毕业5 小时前
请创建一个视觉精美、交互流畅的进阶版贪吃蛇游戏
数据库·嵌入式硬件·算法·mongodb·游戏·fpga开发·交互
源远流长jerry6 小时前
STM32之wifi模块与MQTT模块详解
stm32·单片机·嵌入式硬件