我用于实现某些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;