gpt4 book ai didi

vhdl - 用 VHDL 编码状态机

转载 作者:行者123 更新时间:2023-12-02 21:16:27 29 4
gpt4 key购买 nike

我正在考虑在 VHDL 中创建一个系统,该系统在通过 FTDI USB 转串口设备接收图像后对其进行过滤。作为其中的一部分,我相信我已经确定了我的 CPLD 应该处于的状态,但我以前从未在 VHDL 中创建过复杂的状态机,所以我怀疑我的方法是否合理。目前,我的状态机的基本轮廓是:

begin
process(clk, reset, USB_RXFN, USB_TXEN)
begin
case state is
when IDLE =>
when NEGOTIATING =>
when RECEIVING =>
when FILTERING =>
when TRANSMITTING =>
when OTHERS => -- this should never happen but go to IDLE
end process;

我的问题是,我能够找到的每个状态机教程都会在每个上升沿(或类似的,但每个时钟一次)更改状态,并且该设备应该经常处于空闲状态,并且仅在 USB_RXFN 时才转换为协商状态变低,保持在“协商”状态直到完成,保持在“接收”状态直到整个图像已传输等等...

我的方法有什么根本性的缺陷吗? CPLD 是否根本不适合此用途?或者是否有可能保持一种状态超过一个时钟,并且为了简单起见,教程只是这样编写的?

最佳答案

简而言之,您阅读的教程只是为了简单起见而这样编写的。

在一个状态中等待某个事件然后再转移到另一个状态是完全可以的。这可以在 VHDL 中以多种方式表达,一种常见的方式是同时具有 StateNextState 信号,例如:

architecture foo of bar is
type StateType is (IDLE, NEGOTIATING, RECEIVING, FILTERING, TRANSMITTING);
signal State : StateType;
signal NextState : StateType;
begin
FSM: process(clk, reset)
begin
if reset='1' then
State <= IDLE;
elsif clk'event and clk='1' then
State <= NextState;
end if;
end process FSM;

STATES: process(State, USB_RXFN, USB_TXEN) -- ...
begin
NextState <= State; -- by default, stay in the same state (avoid a latch while you're at it)
case State is
when IDLE =>
if USB_RXFN='0' then
NextState <= NEGOTIATING;
end if;
-- etc
end case;
end process STATES;
end foo;

关于vhdl - 用 VHDL 编码状态机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5961751/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com