gpt4 book ai didi

vhdl - 简单状态机问题

转载 作者:行者123 更新时间:2023-12-02 00:37:47 25 4
gpt4 key购买 nike

我有一个非常简单的 FSM,它可以驱动外部 RAM 的一些输出信号。我在处理数据总线时遇到的问题既可以输入也可以输出...我不太确定我该如何处理在我的 FSM 中最好的这种情况。问题来自以下行:

  v.sram_data   <= io_sram_data;

显然,左侧是变量,右侧是信号。是否有一种“不错”的方式来处理 FSM 中的 inout 信号,就像我所拥有的那样?

entity sram_fsm is
port (
clk : in std_logic;
reset : in std_logic;
out_sram_rd : out std_logic;
out_sram_wr : out std_logic;
out_sram_addr : out std_logic_vector(3 downto 0);
io_sram_data : inout std_logic_vector(7 downto 0)

);
end;

architecture Behavioral of sram_fsm is

type state_type is (wr_init, wr_data, rd_init, rd_data);

type reg_type is record
state : state_type;
sram_data : std_logic_vector(7 downto 0);
sram_addr : std_logic_vector(3 downto 0);
sram_rd : std_logic;
sram_wr : std_logic;
end record;

signal r, rin : reg_type;

begin

comb : process (r)
variable v : reg_type;
begin
v := r;

case r.state is
when wr_init =>
v.sram_data := "00000000";
v.sram_addr := "0000";
v.sram_rd := '0';
v.sram_wr := '0';
v.state := wr_data;
when wr_data =>
io_sram_data <= "00001000";
v.sram_wr := '1';
v.state := rd_init;
when rd_init =>
v.sram_addr := "0000";
v.sram_rd := '1';
v.sram_wr := '0';
v.state := wr_data;
when rd_data =>
v.sram_data <= io_sram_data;
v.state := wr_init;
end case;

out_sram_addr <= v.sram_addr;
out_sram_rd <= v.sram_rd;
out_sram_wr <= v.sram_wr;

rin <= v;

end process;

regs : process (reset, clk)
begin
if reset = '0' then
r.state <= wr_init;
elsif rising_edge(clk) then
r <= rin;
end if;
end process;

end Behavioral;

非常感谢代码改进这个简单 FSM 的评论!

最佳答案

对于 inout,最好在顶层将其拆分为两个信号 data_from_outsidedata_to_outside。然后你的下层需要实体上的三个元素,一个输入向量,一个输出向量和一个信号来说明何时驱动外部数据。双向信号也不适合记录。

然后顶层需要做的事情:

data_pins <= data_to_outside when data_to_outside_enable = '1' else (others => 'Z');
data_from_outside <= data_pins;

从风格上来说:把一切都放在一个过程中。对此有一些争论,但 comp.arch.fpga 和 comp.lang.vhdl 上的许多受人尊敬的海报都持这种观点。

关于vhdl - 简单状态机问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3924850/

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