VHDL-FSM未启动(仅在时序模拟中)
我正在写我的硕士论文,我对VHDL非常陌生,但我仍然需要实现一些复杂的东西。这是我不得不写的最简单的结构之一,但我仍然遇到一些问题 它是一种FSM,通过一个有源低同步信号实现24位移位寄存器,以编程DAC。这只是我为我的项目创建的复杂精化链的结束。我尽可能地遵循FSM的示例模型 行为模拟工作得很好,实际上我创建的整个精化链就行为模拟而言工作得很好。然而,一旦我尝试翻译后模拟,事情就开始出错:大量的“X”输出信号 使用这个简单的移位寄存器,我没有得到任何“X”,但是我无法到达加载和准备数据阶段。看起来,通过检查一些信号,当前的_状态发生了变化,但详细说明并未继续 请记住,因为我对这种语言是新手,我不知道应该在这个FSM上设置什么时间限制,我也不知道如何在top.ucf上写它们 你能看出怎么了吗? 提前谢谢 编辑 我听从了你的建议,使用单一状态流程清理了FSM。我仍然有一些疑问放在哪里,但我真的很喜欢新的实施。不管怎样,我现在得到了一个干净的行为模拟,但在翻译后模拟中,所有输出都是“X”。 这是什么原因造成的? 我将发布新代码和测试台的测试结果:VHDL-FSM未启动(仅在时序模拟中),vhdl,timing,fsm,Vhdl,Timing,Fsm,我正在写我的硕士论文,我对VHDL非常陌生,但我仍然需要实现一些复杂的东西。这是我不得不写的最简单的结构之一,但我仍然遇到一些问题 它是一种FSM,通过一个有源低同步信号实现24位移位寄存器,以编程DAC。这只是我为我的项目创建的复杂精化链的结束。我尽可能地遵循FSM的示例模型 行为模拟工作得很好,实际上我创建的整个精化链就行为模拟而言工作得很好。然而,一旦我尝试翻译后模拟,事情就开始出错:大量的“X”输出信号 使用这个简单的移位寄存器,我没有得到任何“X”,但是我无法到达加载和准备数据阶段。看
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 14:44:03 11/28/2014
-- Design Name:
-- Module Name: dac_ad5764r_24bit_sr_programmer_v2 - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description: This is a PISO shift register that gets a 24bit parallel input word.
-- It outputs the 24bit input word starting from the MSB and enables
-- an active low ChipSelect line for 24 clock periods.
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity dac_ad5764r_24bit_sr_programmer_v2 is
Port ( clk : in STD_LOGIC;
start : in STD_LOGIC;
reset : in STD_LOGIC; -- Note that this reset is for the FSM not for the DAC
reset_all_dac : in STD_LOGIC;
data_in : in STD_LOGIC_VECTOR (23 downto 0);
serial_data_out : out STD_LOGIC;
sync_out : out STD_LOGIC; -- This is a chip select
reset_out : out STD_LOGIC;
busy : out STD_LOGIC
);
end dac_ad5764r_24bit_sr_programmer_v2;
architecture Behavioral of dac_ad5764r_24bit_sr_programmer_v2 is
-- Stati
type state_type is (idle, load_and_prepare_data, transmission);
--ATTRIBUTE ENUM_ENCODING : STRING;
--ATTRIBUTE ENUM_ENCODING OF state_type: TYPE IS "001 010 100";
signal state: state_type := idle;
--signal next_state: state_type := idle;
-- Clock counter
--signal clk_counter_enable : STD_LOGIC := '0';
signal clk_counter : unsigned(4 downto 0) := (others => '0');
-- Shift register
signal stored_data: STD_LOGIC_VECTOR (23 downto 0) := (others => '0');
begin
FSM_single_process: process(clk)
begin
if rising_edge(clk) then
if reset = '1' then
serial_data_out <= '0';
sync_out <= '1';
reset_out <= '1';
busy <= '0';
state <= idle;
else
-- Default
serial_data_out <= '0';
sync_out <= '1';
reset_out <= '1';
busy <= '0';
case (state) is
when transmission =>
serial_data_out <= stored_data(23);
sync_out <= '0';
busy <= '1';
clk_counter <= clk_counter + 1;
stored_data <= stored_data(22 downto 0) & "0";
state <= transmission;
if (clk_counter = 23) then
state <= idle;
end if;
when others => -- Idle
if start = '1' then
serial_data_out <= data_in(23);
sync_out <= '0';
reset_out <= '1';
busy <= '1';
stored_data <= data_in;
clk_counter <= "00001";
state <= transmission;
end if;
end case;
-- if (reset_all_dac = '1') then
-- reset_out <= '0';
-- end if;
end if;
end if;
end process;
end;
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--USE ieee.numeric_std.ALL;
ENTITY dac_ad5764r_24bit_sr_programmer_tb IS
END dac_ad5764r_24bit_sr_programmer_tb;
ARCHITECTURE behavior OF dac_ad5764r_24bit_sr_programmer_tb IS
-- Component Declaration for the Unit Under Test (UUT)
COMPONENT dac_ad5764r_24bit_sr_programmer_v2
PORT(
clk : IN std_logic;
start : IN std_logic;
reset : IN std_logic;
data_in : IN std_logic_vector(23 downto 0);
serial_data_out : OUT std_logic;
reset_all_dac : IN std_logic;
sync_out : OUT std_logic;
reset_out : OUT std_logic;
--finish : OUT std_logic;
busy : OUT std_logic
);
END COMPONENT;
--Inputs
signal clk : std_logic := '0';
signal start : std_logic := '0';
signal reset : std_logic := '0';
signal data_in : std_logic_vector(23 downto 0) := (others => '0');
signal reset_all_dac : std_logic := '0';
--Outputs
signal serial_data_out : std_logic;
signal sync_out : std_logic;
signal reset_out : std_logic;
--signal finish : std_logic;
signal busy : std_logic;
-- Clock period definitions
constant clk_period : time := 100 ns;
BEGIN
-- Instantiate the Unit Under Test (UUT)
uut: dac_ad5764r_24bit_sr_programmer_v2 PORT MAP (
clk => clk,
start => start,
reset => reset,
data_in => data_in,
reset_all_dac => reset_all_dac,
serial_data_out => serial_data_out,
sync_out => sync_out,
reset_out => reset_out,
--finish => finish,
busy => busy
);
-- Clock process definitions
clk_process :process
begin
clk <= '0';
wait for clk_period/2;
clk <= '1';
wait for clk_period/2;
end process;
-- Stimulus process
stim_proc: process
begin
-- hold reset state for 100 ns.
wait for clk_period*10;
reset <= '1' after 25 ns;
wait for clk_period*1;
reset <= '0' after 25 ns;
wait for clk_period*3;
reset_all_dac <= '1' after 25 ns;
wait for clk_period*1;
reset_all_dac <= '0' after 25 ns;
wait for clk_period*5;
data_in <= "111111111111111111111111" after 25 ns;
wait for clk_period*3;
start <= '1' after 25 ns;
wait for clk_period*1;
start <= '0' after 25 ns;
wait;
end process;
END;
以及测试台:
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 14:44:03 11/28/2014
-- Design Name:
-- Module Name: dac_ad5764r_24bit_sr_programmer_v2 - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description: This is a PISO shift register that gets a 24bit parallel input word.
-- It outputs the 24bit input word starting from the MSB and enables
-- an active low ChipSelect line for 24 clock periods.
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity dac_ad5764r_24bit_sr_programmer_v2 is
Port ( clk : in STD_LOGIC;
start : in STD_LOGIC;
reset : in STD_LOGIC; -- Note that this reset is for the FSM not for the DAC
reset_all_dac : in STD_LOGIC;
data_in : in STD_LOGIC_VECTOR (23 downto 0);
serial_data_out : out STD_LOGIC;
sync_out : out STD_LOGIC; -- This is a chip select
reset_out : out STD_LOGIC;
busy : out STD_LOGIC
);
end dac_ad5764r_24bit_sr_programmer_v2;
architecture Behavioral of dac_ad5764r_24bit_sr_programmer_v2 is
-- Stati
type state_type is (idle, load_and_prepare_data, transmission);
--ATTRIBUTE ENUM_ENCODING : STRING;
--ATTRIBUTE ENUM_ENCODING OF state_type: TYPE IS "001 010 100";
signal state: state_type := idle;
--signal next_state: state_type := idle;
-- Clock counter
--signal clk_counter_enable : STD_LOGIC := '0';
signal clk_counter : unsigned(4 downto 0) := (others => '0');
-- Shift register
signal stored_data: STD_LOGIC_VECTOR (23 downto 0) := (others => '0');
begin
FSM_single_process: process(clk)
begin
if rising_edge(clk) then
if reset = '1' then
serial_data_out <= '0';
sync_out <= '1';
reset_out <= '1';
busy <= '0';
state <= idle;
else
-- Default
serial_data_out <= '0';
sync_out <= '1';
reset_out <= '1';
busy <= '0';
case (state) is
when transmission =>
serial_data_out <= stored_data(23);
sync_out <= '0';
busy <= '1';
clk_counter <= clk_counter + 1;
stored_data <= stored_data(22 downto 0) & "0";
state <= transmission;
if (clk_counter = 23) then
state <= idle;
end if;
when others => -- Idle
if start = '1' then
serial_data_out <= data_in(23);
sync_out <= '0';
reset_out <= '1';
busy <= '1';
stored_data <= data_in;
clk_counter <= "00001";
state <= transmission;
end if;
end case;
-- if (reset_all_dac = '1') then
-- reset_out <= '0';
-- end if;
end if;
end if;
end process;
end;
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--USE ieee.numeric_std.ALL;
ENTITY dac_ad5764r_24bit_sr_programmer_tb IS
END dac_ad5764r_24bit_sr_programmer_tb;
ARCHITECTURE behavior OF dac_ad5764r_24bit_sr_programmer_tb IS
-- Component Declaration for the Unit Under Test (UUT)
COMPONENT dac_ad5764r_24bit_sr_programmer_v2
PORT(
clk : IN std_logic;
start : IN std_logic;
reset : IN std_logic;
data_in : IN std_logic_vector(23 downto 0);
serial_data_out : OUT std_logic;
reset_all_dac : IN std_logic;
sync_out : OUT std_logic;
reset_out : OUT std_logic;
--finish : OUT std_logic;
busy : OUT std_logic
);
END COMPONENT;
--Inputs
signal clk : std_logic := '0';
signal start : std_logic := '0';
signal reset : std_logic := '0';
signal data_in : std_logic_vector(23 downto 0) := (others => '0');
signal reset_all_dac : std_logic := '0';
--Outputs
signal serial_data_out : std_logic;
signal sync_out : std_logic;
signal reset_out : std_logic;
--signal finish : std_logic;
signal busy : std_logic;
-- Clock period definitions
constant clk_period : time := 100 ns;
BEGIN
-- Instantiate the Unit Under Test (UUT)
uut: dac_ad5764r_24bit_sr_programmer_v2 PORT MAP (
clk => clk,
start => start,
reset => reset,
data_in => data_in,
reset_all_dac => reset_all_dac,
serial_data_out => serial_data_out,
sync_out => sync_out,
reset_out => reset_out,
--finish => finish,
busy => busy
);
-- Clock process definitions
clk_process :process
begin
clk <= '0';
wait for clk_period/2;
clk <= '1';
wait for clk_period/2;
end process;
-- Stimulus process
stim_proc: process
begin
-- hold reset state for 100 ns.
wait for clk_period*10;
reset <= '1' after 25 ns;
wait for clk_period*1;
reset <= '0' after 25 ns;
wait for clk_period*3;
reset_all_dac <= '1' after 25 ns;
wait for clk_period*1;
reset_all_dac <= '0' after 25 ns;
wait for clk_period*5;
data_in <= "111111111111111111111111" after 25 ns;
wait for clk_period*3;
start <= '1' after 25 ns;
wait for clk_period*1;
start <= '0' after 25 ns;
wait;
end process;
END;
更新1
更新为上一个设计:此代码没有导致任何“X”无法找出原因,这没有,但上一个没有。然而,它并不像前3台加工机器那样在翻译后模拟中启动,信号sync_out停留在0,而默认情况下它应该是“1”
更新2
我一直在研究技术示意图,从sync_out=0的问题开始:它是用FDS实现的,s是FSM复位信号,D来自LUT3,I=state&reset&start,INIT=45=00101101。我在模拟中查找了这个LUT3,我注意到它的INIT=00000000
关于如何运行此模拟,我缺少什么吗?似乎设计中的每个LUT都没有设置
更新3
在某种程度上,翻译后模拟似乎有问题,或者我没有正确配置它是因为某些原因:翻译后地图和翻译后模拟工作并显示一些输出。
然而,有一个奇怪的错误:存储的_数据寄存器没有用向量中的完整数据_更新,之后,FSM正确运行并输出存储的数据。
我在合成后查看了技术示意图,出于某种原因,位23、22、21、19、18未连接到位中相应的数据_。您可以在地图模拟后的屏幕截图中看到效果。同样的情况也发生在后PAR中,但似乎这个问题直接来自于合成!
解决:奇怪的输出来自综合优化。该工具意识到精化链中的前一个块对于那些特定的位永远不会输出与0不同的位。我的错误是假设我可以单独测试单个块:我真正测试的是为FPGA合成的块,考虑到设计中的所有其他因素
感谢所有帮助过我的人,我将听从你的建议 以下是一些改进代码的提示: 您可以将Xilinx依赖项删除到UNISIM,因为您没有使用任何Xilinx Primitves。 应用属性ENUM_编码对状态编码没有影响,除非还定义属性FSM_编码并将其值设置为user。通过将FSM_编码设置为一个热编码,可以强制进行一个热编码。通常,合成足够聪明,可以找到最佳编码。 没有一个寄存器具有默认值: 信号当前状态:状态类型:=空闲; 在Xilinx合成工具XST眼中,您的FSM不是FSM。我确信,如果您查看您的合成报告,您将不会发现XST报告当前状态的FSM。 那么,你的FSM出了什么问题? 您的FSM没有初始状态。 您的FSM有多个复位状态空闲、加载和准备数据 您的FSM没有从空闲到加载的转换,并且准备数据重置没有转换 为当前状态编写下一个状态转换可能会导致XST认为它不是FSM
默认分配下一个_state以下是一些改进代码的提示: 您可以将Xilinx依赖项删除到UNISIM,因为您没有使用任何Xilinx Primitves。 应用属性ENUM_编码对状态编码没有影响,除非还定义属性FSM_编码并将其值设置为user。通过将FSM_编码设置为一个热编码,可以强制进行一个热编码。通常,合成足够聪明,可以找到最佳编码。 没有你的登记册 具有默认值: 信号当前状态:状态类型:=空闲; 在Xilinx合成工具XST眼中,您的FSM不是FSM。我确信,如果您查看您的合成报告,您将不会发现XST报告当前状态的FSM。 那么,你的FSM出了什么问题? 您的FSM没有初始状态。 您的FSM有多个复位状态空闲、加载和准备数据 您的FSM没有从空闲到加载的转换,并且准备数据重置没有转换 为当前状态编写下一个状态转换可能会导致XST认为它不是FSM
默认赋值next_state我更喜欢状态机的单进程形式,它更干净、更简单,更不容易出现敏感度列表错误之类的错误。我也赞同佩培尔出色回答中的观点。然而,我认为这些都不是问题所在 在后合成和后PAR模拟中需要注意的一点是,他们的时间模型不同于行为模型。行为模型遵循我在中描述的简单规则,并确保在典型的设计流程中,您可以直接进入硬件-无需后期合成模拟,无需担心 事实上,如果我在追踪可疑的工具错误,我只会使用后期合成或后期PAR模拟。对于FPGA设计,而不是ASIC,就是这样 然而,这种简单的计时模型有其局限性。您可能熟悉一些问题,例如通过信号分配分配分配的时钟信号通常隐藏在第三方模型中,您不希望它消耗增量周期,并确保您的时钟数据在时钟之前到达,而不是之后到达,随后所有事情都比预期的早一个周期发生 在行为建模中,一点纪律可以避免这些麻烦。但后标准杆造型的情况并非如此 您的测试台的设置方式可能与行为模型相同。如果是这样,那很可能就是问题所在 我在这种情况下是这样做的:我声称没有正式的权威,只有经验。当FPGA与具有真实计时的外部内存模型接口时,它也能很好地工作 1我假设简单的行为计时模型适用于设计内部的所有信号 2我假设设计的输入和输出不存在这种情况 3我记录输入上的估计设置和保持时间,a来自FPGA数据表或更好,b来自后合成或后PAR报告中显示的最坏情况值,并围绕它们构建测试台。 工作示例:设置时间1ns,保持时间2ns,时钟周期10ns。这意味着在时钟边缘之后2 ns到9 ns之间的任何输入都可以保证正确读取。我任意选择5ns
signal_to_fpga <= driving_value after 5 ns;
请注意,Xilinx通过将它们表示为之前/之后的偏移量in/out,而不是您正在查看的时钟边缘,从而荒谬地违反了直觉
或者,如果输入来自真实世界中的CPU或内存,我将使用该设备的数据表定时规范
4我注意到数据表或报告中报告的最坏情况时钟输出时间,并围绕它们构建设计。比如说,7纳秒
fpga_output_pin <= driving_value after 7 ns;
注意,合成显然忽略了这个after子句;然而,post-synth-back注释将引入类似的内容。
5如果这证明不够好,那么可能在包装器组件中,以避免污染可合成代码,提高精度,如
fpga_output_pin <= 'X' after 1 ps, driving_value after 7 ns;
6我重新运行行为模拟。通常,它现在失败了,因为它是在没有考虑实际时间的情况下编写的
我会修复这些故障。这可能包括在测试设计输出值之前增加实际延迟。它可以是一个迭代过程
现在,我有一个合理的预期,即后PAR仿真模型将直接进入测试台并工作。我更喜欢状态机的单进程形式,它更干净、更简单,更不容易出现敏感度列表错误等错误。我也赞同佩培尔出色回答中的观点。然而,我认为这些都不是问题所在 在后合成和后PAR模拟中需要注意的一点是,他们的时间模型不同于行为模型。行为模型遵循我在中描述的简单规则,并确保在典型的设计流程中,您可以直接进入硬件-无需后期合成模拟,无需担心 事实上,如果我在追踪可疑的工具错误,我只会使用后期合成或后期PAR模拟。对于FPGA设计,而不是ASIC,就是这样 然而,这种简单的计时模型有其局限性。您可能熟悉一些问题,例如通过信号分配分配分配的时钟信号通常隐藏在第三方模型中,您不希望它消耗增量周期,并确保您的时钟数据在时钟之前到达,而不是之后到达,并且随后每件事都会在一个周期内发生 比预期的早一点 在行为建模中,一点纪律可以避免这些麻烦。但后标准杆造型的情况并非如此 您的测试台的设置方式可能与行为模型相同。如果是这样,那很可能就是问题所在 我在这种情况下是这样做的:我声称没有正式的权威,只有经验。当FPGA与具有真实计时的外部内存模型接口时,它也能很好地工作 1我假设简单的行为计时模型适用于设计内部的所有信号 2我假设设计的输入和输出不存在这种情况 3我记录输入上的估计设置和保持时间,a来自FPGA数据表或更好,b来自后合成或后PAR报告中显示的最坏情况值,并围绕它们构建测试台。 工作示例:设置时间1ns,保持时间2ns,时钟周期10ns。这意味着在时钟边缘之后2 ns到9 ns之间的任何输入都可以保证正确读取。我任意选择5ns
signal_to_fpga <= driving_value after 5 ns;
请注意,Xilinx通过将它们表示为之前/之后的偏移量in/out,而不是您正在查看的时钟边缘,从而荒谬地违反了直觉
或者,如果输入来自真实世界中的CPU或内存,我将使用该设备的数据表定时规范
4我注意到数据表或报告中报告的最坏情况时钟输出时间,并围绕它们构建设计。比如说,7纳秒
fpga_output_pin <= driving_value after 7 ns;
注意,合成显然忽略了这个after子句;然而,post-synth-back注释将引入类似的内容。
5如果这证明不够好,那么可能在包装器组件中,以避免污染可合成代码,提高精度,如
fpga_output_pin <= 'X' after 1 ps, driving_value after 7 ns;
6我重新运行行为模拟。通常,它现在失败了,因为它是在没有考虑实际时间的情况下编写的
我会修复这些故障。这可能包括在测试设计输出值之前增加实际延迟。它可以是一个迭代过程
现在,我有一个合理的预期,即后PAR仿真模型将直接进入测试台并工作。尝试将FSM下一个状态放入同步过程,即计时,使分析更容易。另一个建议,因为我看不到VHDL中任何明显的错误。您是否已确保正确驱动来自测试台或顶层模块的信号,即启动未保持在1上。同时尝试对FSM_输出_reg_过程计时。您是否用SDF延迟值注释合成后网络列表?如果不考虑时钟树上的延迟,可能会导致意外结果,从而导致无效的周期滑动和其他模拟错误。感谢您的建议@SamPalmer测试台应该很好,它在行为测试中工作。为什么我要记录这些过程?如果这些进程必须是异步的,那么一旦有了输入,它们就可以进行详细说明,然后它们的输出用于时钟进程。尝试将FSM的下一个状态放入同步进程,即时钟进程,这样分析就更容易了。另一个建议是,我看不到VHDL中有任何明显的错误。您是否已确保正确驱动来自测试台或顶层模块的信号,即启动未保持在1上。同时尝试对FSM_输出_reg_过程计时。您是否用SDF延迟值注释合成后网络列表?如果不考虑时钟树上的延迟,可能会导致意外结果,从而导致无效的周期滑动和其他模拟错误。感谢您的建议@SamPalmer测试台应该很好,它在行为测试中工作。为什么我要记录这些过程?AFAIK这些进程必须是异步的,这样一旦有了输入,它们就可以进行详细的描述,然后它们的输出被用于时钟进程中。谢谢你的回答,我会评论你的提示:我不知道,它是自动生成的,谢谢!再次感谢,我不知道,不管怎样,这些行都被评论了。这是一个编辑,我只是想看看变化,这就是为什么什么都没有发生:合成重新优化编码之后!3我为所有内部寄存器添加了默认值,在模拟中做了一些小的更改,但我想无论如何都要包含它们是一种很好的做法:4是这样的:为信号找到了有限状态机。状态=3个转换=10个输入=3个输出=3个时钟=clk上升沿重置=重置正重置类型=同步重置状态=空闲功率上升状态=空闲编码=自动实现=LUT.5无论如何实现应该是相同的:为在第1241行创建的信号找到了5位加法器。感谢您的回答,我将评论您的提示:1不知道,它是自动生成的,谢谢!再次感谢,我不知道,不管怎样,这些行都被评论了。这是一个编辑,我只是想看看变化,这就是为什么什么都没有发生:
之后,合成重新优化了编码!3我为所有内部寄存器添加了默认值,在模拟中做了一些小的更改,但我想无论如何都要包含它们是一种很好的做法:4是这样的:为信号找到了有限状态机。状态=3个转换=10个输入=3个输出=3个时钟=clk上升沿重置=重置正重置类型=同步重置状态=空闲功率上升状态=空闲编码=自动实现=LUT.5无论如何,实现应该是相同的:为在第1241行创建的信号找到了5位加法器。非常感谢您的回答,我咕哝了几天,并尝试了你的解决方案,但我仍然有一些问题。看到我原来的帖子中的编辑,再次感谢!另外,我知道最好在reset/start部分中指定所有输出,并在CASE之前使用默认语句。然后重新分配案例中的所有变量。对的内部信号呢?那么在if reset=1之前的默认语句块呢?我看到了no load_和prepare_数据状态?我认为在这个实现中,没有必要使用专用状态来加载数据,我只是在检测到启动时这样做。我正在用最近的更改再次更新代码。您的sim卡仅显示顶级信号。在行为模拟中,您可以深入研究装置本身,并查看模拟窗口中的当前状态。这通常不适用于后路由SIM卡,但您可以在端口上显示一些反映它们的位。是的,这是一个痛苦-后路线sim卡是一个痛苦-见第3段的答案!非常感谢你的回答,我咕哝了几天,并以某种方式尝试了你的解决方案,但我仍然有一些问题。看到我原来的帖子中的编辑,再次感谢!另外,我知道最好在reset/start部分中指定所有输出,并在CASE之前使用默认语句。然后重新分配案例中的所有变量。对的内部信号呢?那么在if reset=1之前的默认语句块呢?我看到了no load_和prepare_数据状态?我认为在这个实现中,没有必要使用专用状态来加载数据,我只是在检测到启动时这样做。我正在用最近的更改再次更新代码。您的sim卡仅显示顶级信号。在行为模拟中,您可以深入研究装置本身,并查看模拟窗口中的当前状态。这通常不适用于后路由SIM卡,但您可以在端口上显示一些反映它们的位。是的,这是一个痛苦-后路线sim卡是一个痛苦-见第3段的答案!