我用于实现某些fsm的vhdl代码工作不正常 IEEE库; 使用IEEE.std_logic_1164.all; 实体孵化器2是 端口(温度:标准逻辑向量(7到0); 时钟,复位:在标准逻辑中; on_冷却器、on_加热器:输出标准_逻辑; CRS:输出标准逻辑向量(3到0); 终端实体孵化器2; 孵化器2的架构是 类型状态\类型\左侧为(S1、S2、S3); 信号状态,下一个状态:状态类型左; 类型状态\类型\右侧为(S\ OUT、S\ U 1、S\ U 2、S\ U 3); 信号冷却器\状态、冷却器\下一个\状态:状态\类型\右侧; 开始 --T

我用于实现某些fsm的vhdl代码工作不正常 IEEE库; 使用IEEE.std_logic_1164.all; 实体孵化器2是 端口(温度:标准逻辑向量(7到0); 时钟,复位:在标准逻辑中; on_冷却器、on_加热器:输出标准_逻辑; CRS:输出标准逻辑向量(3到0); 终端实体孵化器2; 孵化器2的架构是 类型状态\类型\左侧为(S1、S2、S3); 信号状态,下一个状态:状态类型左; 类型状态\类型\右侧为(S\ OUT、S\ U 1、S\ U 2、S\ U 3); 信号冷却器\状态、冷却器\下一个\状态:状态\类型\右侧; 开始 --T,vhdl,xilinx,xilinx-ise,edaplayground,Vhdl,Xilinx,Xilinx Ise,Edaplayground,由于您只需要设计右侧状态机(冷却器),因此您应该专注于与左侧状态机(主控制器)分离的部分 与正在设计主控制器的同事交谈,添加名为enable\u cooler的输出,以启用冷却器状态机。孵化器实体可以包括两个名为MainController和冷却器的实体 我已将cooler状态机逻辑提取到一个名为cooler的单独实体中。它分为三个过程,保持输出与时钟和状态同步: 状态寄存器和输出寄存器 下一状态逻辑 接下来输出逻辑 我还添加了一些else子句以防止推断锁存,并添加了一些常量以使其更具可读性和可

由于您只需要设计右侧状态机(冷却器),因此您应该专注于与左侧状态机(主控制器)分离的部分

与正在设计主控制器的同事交谈,添加名为
enable\u cooler
的输出,以启用冷却器状态机。
孵化器
实体可以包括两个名为
MainController
冷却器
的实体

我已将cooler状态机逻辑提取到一个名为
cooler
的单独实体中。它分为三个过程,保持输出与时钟和状态同步:

  • 状态寄存器和输出寄存器
  • 下一状态逻辑
  • 接下来输出逻辑
  • 我还添加了一些
    else
    子句以防止推断锁存,并添加了一些常量以使其更具可读性和可维护性

    冷却器状态机 状态图 图1–冷却器状态机


    VHDL
    ieee库;
    使用ieee.std_logic_1164.all;
    使用ieee.numeric_std.all;
    实体冷却器是
    港口
    (
    时钟:标准逻辑;
    复位:在标准逻辑中;
    启用:在std_逻辑中;--添加:来自修改的左侧状态机的冷却器启用信号。
    温度:在标准逻辑向量(7到0)中——我假设这是一个有符号的温度。
    crs:输出标准逻辑向量(3到0)
    );
    终端实体;
    冷却器的结构V1为
    T型状态为(S_OUT、S_1、S_2、S_3);
    信号状态,下一状态:t状态;
    信号下一个crs:std逻辑向量(3到0);--添加以确保输出与时钟和状态同步。
    恒温_P25:整数:=25;--增加了可读性和可维护性。
    恒温_P35:整数=35;
    恒温_P40:整数=40;
    恒温_P45:整数=45;
    常数RPS_0:std_逻辑_向量(3到0):=“0000”——增加了可读性和可维护性。
    常数RPS_4:std_逻辑_向量(3到0):=“0100”;
    常数RPS_6:std_逻辑_向量(3到0):=“0110”;
    常数RPS_8:std_逻辑_向量(3到0):=“1000”;
    开始
    --
    --状态寄存器和输出寄存器
    --
    过程(时钟、复位)
    开始
    如果重置,则
    陈述
    如果i_temperature>temperature_P35,则
    
    下一步_state由于您只需要设计右侧状态机(冷却器),因此您应该专注于与左侧状态机(主控制器)分离的部分

    与正在设计主控制器的同事交谈,添加名为
    enable\u cooler
    的输出,以启用冷却器状态机。
    孵化器
    实体可以包括两个名为
    MainController
    冷却器
    的实体

    我已将cooler状态机逻辑提取到一个名为
    cooler
    的单独实体中。它分为三个过程,保持输出与时钟和状态同步:

  • 状态寄存器和输出寄存器
  • 下一状态逻辑
  • 接下来输出逻辑
  • 我还添加了一些
    else
    子句以防止推断锁存,并添加了一些常量以使其更具可读性和可维护性

    冷却器状态机 状态图 图1–冷却器状态机


    VHDL
    ieee库;
    使用ieee.std_logic_1164.all;
    使用ieee.numeric_std.all;
    实体冷却器是
    港口
    (
    时钟:标准逻辑;
    复位:在标准逻辑中;
    启用:在std_逻辑中;--添加:来自修改的左侧状态机的冷却器启用信号。
    温度:在标准逻辑向量(7到0)中——我假设这是一个有符号的温度。
    crs:输出标准逻辑向量(3到0)
    );
    终端实体;
    冷却器的结构V1为
    T型状态为(S_OUT、S_1、S_2、S_3);
    信号状态,下一状态:t状态;
    信号下一个crs:std逻辑向量(3到0);--添加以确保输出与时钟和状态同步。
    恒温_P25:整数:=25;--增加了可读性和可维护性。
    恒温_P35:整数=35;
    恒温_P40:整数=40;
    恒温_P45:整数=45;
    常数RPS_0:std_逻辑_向量(3到0):=“0000”——增加了可读性和可维护性。
    常数RPS_4:std_逻辑_向量(3到0):=“0100”;
    常数RPS_6:std_逻辑_向量(3到0):=“0110”;
    常数RPS_8:std_逻辑_向量(3到0):=“1000”;
    开始
    --
    --状态寄存器和输出寄存器
    --
    过程(时钟、复位)
    开始
    如果重置,则
    陈述
    如果i_temperature>temperature_P35,则
    
    下一步,也许你可以问一些具体的问题?(
    有人能告诉我哪里做错了吗?
    不具体,fsm也不能正常工作。)通过一点故障排除,您会发现。(您应该能够将培养箱信号添加到您的波形中,就像这里所做的那样。您会发现您的信号没有达到S3,因为温度变为更高的值。)std_logic_1164包提供的std_logic_vector的关系运算符不是数字。您的意思是我在测试台上设置了错误的信号吗@USER1155120关于你的第二条评论,你是什么意思?它会干扰输出吗@用户11551
    library IEEE;
    use IEEE.std_logic_1164.all;
    
    entity INCUBATOR2 is
        port(temperature: in std_logic_vector(7 downto 0);
        CLK,RESET: in std_logic;
        on_cooler,on_heater: out std_logic;
        CRS:out std_logic_vector(3 downto 0));
    
    end entity INCUBATOR2;
    
    architecture ARCH of INCUBATOR2 is
    
    
    
    TYPE STATE_TYPE_left IS (S1, S2, S3);
    SIGNAL STATE,NEXT_STATE   : STATE_TYPE_left;
    
    TYPE STATE_TYPE_right IS (S_OUT,S_1, S_2, S_3);
    SIGNAL cooler_STATE,cooler_NEXT_STATE   : STATE_TYPE_right;
    
    
    begin
        --T<= temprature;
        REG: process (clk, reset) begin
            if reset='1' then
                STATE <= S1 ;
                cooler_STATE<=S_OUT;
            elsif clk'event and clk='1' then
                STATE <= NEXT_STATE ;
                cooler_STATE<=cooler_NEXT_STATE;
            end if ;    
        end process REG ;
       
        CMB:process(STATE,temperature   ,cooler_STATE) 
        begin
            case STATE is
                when S1 => 
                    if(temperature  > "00100011" ) then
                        NEXT_STATE<=S2;
                        
                    elsif(temperature < "00001111") then
                        NEXT_STATE<= S3;
                    end if;
                    --cooler_NEXT_STATE<=S_OUT;
                when S2 =>
                    if(temperature < "00011001" ) then
                        NEXT_STATE<=S1;
                    end if;
                    case cooler_STATE is
                        when S_OUT=>
                            if(temperature>"00100011") then
                                cooler_NEXT_STATE<=S_1;
                            end if;
                        when S_1=>
                            if(temperature>"00101000") then
                                cooler_NEXT_STATE<=S_2;
                            elsif(temperature<"00011001") then
                                cooler_NEXT_STATE<=S_OUT;
                            end if;
                        when S_2=>
                            if(temperature>"00101101") then
                                cooler_NEXT_STATE<=S_3;
                            elsif(temperature<"00100011") then
                                cooler_NEXT_STATE<=S_1;
                            end if;
                        when S_3=>
                            if(temperature<"00101000") then
                                cooler_NEXT_STATE<=S_2;
                            end if;
                    end case;
                    
    
                    
                when S3 => 
                    if(temperature>"00011110" ) then
                        NEXT_STATE<=S1;
                    end if;
                    --cooler_NEXT_STATE<=S_OUT;
            end case;
            
        end process CMB;
      --  with STATE select
    --  heater<= '0' when S1|S2,
    --      '1' when S3;
    --  cooler<= '0' when S1|S3,
    --      '1' when S2;
      --  label if( cooler='1') generate
        --  modul: COOLER port  map(temprature=>T,CRS=>CRS,clk=>clk,reset=>reset);
         --end generate;
        
        OUTPUT : process(STATE,cooler_STATE) 
        begin
                
            case STATE is
                when S1 =>
                    on_heater<='0';
                    on_cooler<='0';
                    
                when S2 =>
                    on_cooler<='1';
                    on_heater<='0';
    
                    
                    case cooler_STATE is
                        when S_OUT =>
                            CRS<="0000";
                        when S_1 =>
                            CRS<="0100";
                        when S_2 =>
                            CRS<="0110";
                        when S_3 =>
                            CRS<="1000";
                        when others=>
                            CRS<="0000";
                    end case;
                    
                when S3 =>
                    on_heater<='1';
                    on_cooler<='0';
    
            end case;
            
        end process OUTPUT;
    
        
    end ARCH;
    
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    
    entity incubator_tb is
    end entity;
    
    architecture testbench of incubator_tb is
    
    component INCUBATOR2 is
        port(temperature: in std_logic_vector(7 downto 0);
        CLK,RESET: in std_logic;
        on_cooler,on_heater: out std_logic;
        CRS:out std_logic_vector(3 downto 0));
    end component INCUBATOR2;
    
    signal  CLK, reset: std_logic;
    signal  on_cooler,on_heater:std_logic;
    signal temperature:std_logic_vector(7 downto 0);
    signal CRS: std_logic_vector(3 downto 0);
    begin
    
    modul: INCUBATOR2 port map(
    temperature => temperature, clk => clk, reset => reset,
    on_cooler => on_cooler,on_heater=>on_heater,CRS=>CRS);
    
    stim: process
    begin
    
    temperature <= "00100110";
    clk <= '0';
    reset <= '1';
    wait for 20 ns;
    
    temperature <= "00100110";
    clk <= '1';
    reset <= '0';
    
    wait for 20 ns;
    
    reset <= '0';
    clk <= '0';
    temperature <= "00001010";
    wait for 20 ns;
    
    reset <= '0';
    clk <= '1';
    temperature <= "00001010";
    wait for 20 ns;
    
    reset <= '0';
    clk <= '0';
    temperature <= "00100110";
    wait for 20 ns;
    --clk <= '1';
    
    reset <= '0';
    clk <= '1';
    temperature <= "00100110";
    wait for 20 ns;
    
    reset <= '0';
    clk <= '1';
    temperature <= "00101010";
    wait for 20 ns;
    
    
    wait;
    
    end process;
    end architecture testbench;