编辑-可以';t推断寄存器,因为它';的行为与任何受支持的寄存器模型VHDL不匹配

编辑-可以';t推断寄存器,因为它';的行为与任何受支持的寄存器模型VHDL不匹配,vhdl,fpga,intel-fpga,Vhdl,Fpga,Intel Fpga,这是我问的另一个问题的一个分支。我将更深入地解释我正在尝试做什么以及它不喜欢什么。这是一个学校项目,不需要遵循标准 我正在尝试制作SIMON游戏。现在,我想做的是使用一个电平开关盒,每个电平都应该更快(因此不同的分频器)。第一级应该是第一频率,LED的模式应该是亮起和消失。在我放入开关盒之前,第一层是独立的(没有第二层的东西),它像它应该的那样亮起来消失了。我还使用了compare=0来比较输入和输出。(用户应该按照他们看到的灯光模式翻转开关)。这在第一个级别单独运行时起作用,但现在它位于开关盒

这是我问的另一个问题的一个分支。我将更深入地解释我正在尝试做什么以及它不喜欢什么。这是一个学校项目,不需要遵循标准

我正在尝试制作SIMON游戏。现在,我想做的是使用一个电平开关盒,每个电平都应该更快(因此不同的分频器)。第一级应该是第一频率,LED的模式应该是亮起和消失。在我放入开关盒之前,第一层是独立的(没有第二层的东西),它像它应该的那样亮起来消失了。我还使用了
compare=0
来比较输入和输出。(用户应该按照他们看到的灯光模式翻转开关)。这在第一个级别单独运行时起作用,但现在它位于开关盒中,它不喜欢
compare
。我不知道如何绕过这一点,以便将输出与输入进行比较

我得到的错误与以前类似:

错误(10821):FP处的HDL错误。vhd(75):无法推断“比较”的寄存器,因为其行为与任何支持的寄存器模型都不匹配

错误(10821):FP处的HDL错误。vhd(75):无法推断“计数[0]”的寄存器,因为其行为与任何支持的寄存器模型都不匹配

错误(10821):FP处的HDL错误。vhd(75):无法推断“计数[1]”的寄存器,因为其行为与任何支持的寄存器模型都不匹配

错误(10821):FP处的HDL错误。vhd(75):无法推断“计数[2]”的寄存器,因为其行为与任何支持的寄存器模型都不匹配

错误(10822):FP处的HDL错误。vhd(80):无法在此时钟边缘上实现分配寄存器

错误(10822):FP处的HDL错误。vhd(102):无法在此时钟边缘上实现分配寄存器

错误(12153):无法详细说明顶级用户层次结构

我也知道,它不喜欢上升沿(切换),但我需要它,以使LED图案亮起并消失

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_unsigned.all;

entity FP is
    port(
    clk, reset : in std_logic;
    QF : out std_logic_vector (3 downto 0);
    checkbtn : in std_logic;
    Switch : in std_logic_vector(3 downto 0);
    sel : in std_logic_vector (1 downto 0);
    score : out std_logic_vector (6 downto 0)

    );
end FP;

architecture behavior of FP is

signal time_count: integer:=0;
signal toggle : std_logic;
signal toggle1 : std_logic;
signal count : std_logic_vector (2 downto 0);
signal seg : std_logic_vector (3 downto 0);
signal compare : integer range 0 to 1:=0;
type STATE_TYPE is (level1, level2);
signal level : STATE_TYPE;    
--signal input : std_logic_vector (3 downto 0);
--signal sev : std_logic_vector (6 downto 0);
begin

process (clk, reset, sel)
    begin
        if (reset = '0') then
            time_count <= 0;
            toggle <= '0';
        elsif rising_edge (clk) then
            case sel is
            when "00" =>
                if (time_count = 1249999) then
                        toggle <= not toggle;
                        time_count <= 0;
                    else
                        time_count <= time_count+1;
                    end if;            
            when "01" =>
                if (time_count = 2499999) then
                    toggle1 <= not toggle1;
                    time_count <= 0;
                else
                    time_count <= time_count+1;
                    end if;
            when "10" =>
                if (time_count = 4999999) then
                    toggle <= not toggle;
                    time_count <= 0;
                else
                    time_count <= time_count+1;
                    end if;
            when "11" =>
                if (time_count = 12499999) then
                    toggle <= not toggle;
                    time_count <= 0;
                else
                    time_count <= time_count+1;
                end if;
            end case;
        end if;
    end process;



Process (toggle, compare, switch)
    begin                

    case level is
    when level1 =>
        if sel = "00" then
            count <= "001"; 
            seg <= "1000";
        elsif (rising_edge (toggle)) then
            count <= "001";
            compare <= 0;
            if (count = "001") then
                count <= "000";
            else
            count <= "000";
            end if;
        end if;

        if (switch = "1000") and (compare = 0) and (checkbtn <= '0') then
            score <= "1111001";
            level <= level2;
        else
            score <= "1000000";
            level <= level1;
        end if;

    when level2 =>
        if sel = "01" then
            count <= "010";
            seg <= "0100";
        elsif (rising_edge (toggle1)) then
            count <= "010";
            compare <= 1;
            if (count = "010") then
                count <= "000";
            else
            count <= "000";
            end if;
        end if;

        if (switch = "0100") and (compare = 1) and (checkbtn <= '0') then
            score <= "0100100";
        else
            score <= "1000000";
            level <= level1;
        end if;
    end case;


    case count is
        when "000"=>seg<="0000";
        when "001"=>seg<="1000";
        when "010"=>seg<="0100";
        when "011"=>seg<="0110";
        when "100"=>seg<="0011";
        when others=>seg<="0000";
    end case;    
end process;


QF <= seg;
end behavior;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
使用ieee.std_logic_unsigned.all;
实体FP是
港口(
时钟,复位:在标准逻辑中;
QF:输出标准逻辑向量(3到0);
检查BTN:在标准逻辑中;
开关:标准逻辑向量(3到0);
sel:标准逻辑向量(1到0);
分数:输出标准逻辑向量(6到0)
);
结束FP;
FP的体系结构行为是
信号时间_计数:整数:=0;
信号切换:标准逻辑;
信号切换1:std_逻辑;
信号计数:标准逻辑向量(2到0);
信号段:标准逻辑向量(3到0);
信号比较:整数范围0到1:=0;
类型状态_类型为(级别1、级别2);
信号电平:状态_型;
--信号输入:标准逻辑向量(3到0);
--信号sev:std_逻辑_向量(6到0);
开始
过程(时钟、复位、选择)
开始
如果(重置='0'),则

时间计数好吧。。。很难判断出什么是错误的,因为这个状态机是以错误的方式编写的。您应该在VHDL中查找有关FSM正确建模的参考资料。一个很好的例子是。 如果您使用Quartus,还可以查找Altera关于如何专门为其编译器建模FSM的描述

我现在只给你两个建议。首先,你不应该(或者也许你甚至不能)使用is 2

if rising_edge (clk)
签入一个进程。如果你的进程在时钟边缘是敏感的,在开始时写一次

第二件事是,若你们想用一个同步复位的进程来模拟FSM,那个么就把clk放在灵敏度列表上

问题和代码编辑后编辑:

好了,现在好多了。但还有几件事:

  • 你的FSM仍然不像它应该的那样。再看一次我在上面给你的源代码中的例子,并对它进行编辑,使其与那里相似,或者使其成为一个流程FSM,如本例中的示例
  • 打算!非常重要。在我对您的代码进行适当的编辑之前,我无法发现一些明显的错误。这让我想到
  • 看看这些地方,在那里你可以给count赋值,特别是if语句。不管怎样,您都会指定相同的值“000”
  • 与另一个信号seg类似。在这个过程中,你给它分配了一些值,然后在这个过程的末尾,有一个case语句,你给它分配了一些其他的值,使得之前的分配变得无关紧要
  • 在进程中仅使用上升沿一次,仅用于时钟,并且仅在进程的最开始,或者在第一个进程中使用异步重置的方式。在第二个过程中,你们做了这三件事
  • 在具有上升沿的顺序过程中,就像第一个一样,您不必在灵敏度列表中输入时钟以外的任何内容,如果它是异步的,则需要重置,就像您的情况一样
  • 第二个过程中的灵敏度列表。这是一个并行的过程,所以你们应该把信号放在那个里,你们在一个过程中检查,并且可以在它之外改变。这不是比较的情况。但应该有信号:电平、选择和切换1

  • 因为我仍然不确定你想要实现什么,我不会告诉你具体要做什么。根据以上几点修改你的代码,也许它就可以工作了。

    好吧。。。很难判断出什么是错误的,因为这个状态机是以错误的方式编写的。您应该在VHDL中查找有关FSM正确建模的参考资料。一个很好的例子是。 如果您使用Quartus,还可以查找Altera关于如何专门为其编译器建模FSM的描述

    我现在只给你两个建议。首先,你不应该(或者也许你甚至不能)使用is 2

    if rising_edge (clk)
    
    签入一个进程。如果你的进程在时钟边缘是敏感的,在开始时写一次

    第二件事是如果你