vhdl编码中hdl编译器错误的解决

vhdl编码中hdl编译器错误的解决,vhdl,Vhdl,不熟悉vhdl,不知道如何解决在尝试运行Synthesis时遇到的这些错误 hdlcompiler 37:此表达式中不能使用unsigned hdlcompiler 1731:=无法确定确切的重载匹配定义 hdlcompiler 303:字符“2”不在std\U逻辑类型中 任何关于代码示例的建议都会大有帮助 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.

不熟悉vhdl,不知道如何解决在尝试运行Synthesis时遇到的这些错误 hdlcompiler 37:此表达式中不能使用unsigned

hdlcompiler 1731:=无法确定确切的重载匹配定义

hdlcompiler 303:字符“2”不在std\U逻辑类型中

任何关于代码示例的建议都会大有帮助

 library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;

    entity acqeng is
    Port (
        Mclk : in STD_LOGIC;
        Rst : in STD_LOGIC;
        Sclk : in STD_LOGIC;
        SDI : in STD_LOGIC;
        SDO : out STD_LOGIC;
        CS : in STD_LOGIC_VECTOR(1 downto 0);
        Int : out STD_LOGIC;
        ADC_LRCK : out STD_LOGIC;
        ADC_BCK : out STD_LOGIC;
        ADC_Data : in STD_LOGIC;
        ADC_CS : out STD_LOGIC;
        nvSRAM_CS : out STD_LOGIC;
        ENG_Sck : out STD_LOGIC;
        ENG_SI : in STD_LOGIC;
        ENG_SO : out STD_LOGIC;
        LaserHiLow : out STD_LOGIC
        );
    end acqeng;

    architecture Behavioral of acqeng is
        signal seqcount : unsigned(10 downto 0) := "00000000000";
        signal Eng_Sck_en : STD_LOGIC := '0';
        signal clkdiv2: STD_LOGIC :='0';
        signal Eng_State: STD_LOGIC_VECTOR(2 downto 0) := "000";
        CONSTANT IDLE : std_logic_vector(2 downto 0 ) :="000";
        CONSTANT OUTPUT_SRAM_HEADER: std_logic_vector(2 downto 0 ) :="001";
        CONSTANT SET_LRCK_HIGH:std_logic_vector(2 downto 0 ) :="010";
        CONSTANT CLEAR_LRCK_HIGH: std_logic_vector(2 downto 0 ) :="011";
        CONSTANT GET_CHANNEL_DATA: std_logic_vector(2 downto 0 ) :="100";
        CONSTANT WAIT_FOR_SAMPLE:std_logic_vector(2 downto 0 ) :="101";
        CONSTANT CHECK_SAMPLE_COUNT: std_logic_vector(2 downto 0 ) :="110";
        CONSTANT CHECK_FOR_IDLE: std_logic_vector(2 downto 0 ) :="111";
      signal CycleCnt: unsigned(10 downto 0):="11111111111";

        signal SPIbitCnt: unsigned(2 downto 0):= "000";
        signal InputReg: std_logic_vector(7 downto 0):= "00000000";
        signal NewInput: STD_LOGIC :='0';

        signal Run: STD_LOGIC :='0';

        CONSTANT DE_SELECT:         std_logic_vector(1 downto 0) := "11";
        CONSTANT ADC_CS_LOW:            std_logic_vector(1 downto 0) := "00";
        CONSTANT nvSRAM1_CS_LOW:    std_logic_vector(1 downto 0) := "01";
        CONSTANT CPLD_SELECT:       std_logic_vector(1 downto 0) := "10";

    begin

    ClkDivseq : process(Mclk,Rst)
        begin
            if Rst ='0' then
                clkdiv2 <= '0';
            elsif Mclk ='0'  and Mclk'event then
                clkdiv2 <= not(clkdiv2);
            end if;
        end process;

    SPILatchseq : process(Sclk, CS, SDI)
        begin
            if CS /= CPLD_SELECT then
                SPIbitCnt <="111";
                NewInput <='0';
            elsif Sclk ='0' and Sclk'event then
                InputReg <= InputReg(6 downto 0)& SDI;
            if SPIbitCnt = (unsigned*("000")) then
                NewInput <='1';
            else
                SPIbitCnt <=SPIbitCnt-'1';
            end if;
            end if;
        end process;

     AcqEngseq: process(clkdiv2, Rst, CS, NewInput, InputReg)
        begin
                if Rst= '0' then 
                    Eng_State <=IDLE;
                    LaserHiLow <='0';
                    ADC_LRCK <='0';
                    Eng_Sck_en<='0';
                    Int<='0';
                    seqcount<= "00000000000";
                elsif clkdiv2 ='0' and clkdiv2'event then
                    seqcount <= seqcount +'1';
                case Eng_State is
                when IDLE =>
                    int <='0';
                if NewInput ='1' then
                    Run <= InputReg(7);
                    CycleCnt <= unsigned*(InputReg(6 downto 0)&"1111");
                end if;
                if Run ='1' then
                    Eng_state <= OUTPUT_SRAM_HEADER;
                    Eng_Sck_En<='1';
                    seqcount<= "00000000000";
                end if;
        when OUTPUT_SRAM_HEADER =>
                if seqcount(6 downto 0)= unsigned*("1000000") then
                    Eng_Sck_En<='0';
                    Eng_State<= SET_LRCK_HIGH;
                    seqcount <= "00000000000";
                end if;
        when SET_LRCK_HIGH =>
                if seqcount( 6 downto 0) = unsigned*("0000001") then
                    ADC_LRCK <='1';
                    LaserHiLow <= not seqcount(10);
                    Eng_State<=CLEAR_LRCK_HIGH;
                end if ;
        when CLEAR_LRCK_HIGH => 
                    Eng_State<= GET_CHANNEL_DATA;
        when GET_CHANNEL_DATA =>
                    ADC_LRCK <='0';
                    Eng_Sck_En <='1';
                    Eng_State <= WAIT_FOR_SAMPLE;
        when WAIT_FOR_SAMPLE=>
                if seqcount (6 downto 0)= unsigned*("1000011")then
                    Eng_Sck_En <='0';
                    Eng_State <= CHECK_SAMPLE_COUNT;
                end if;
        when CHECK_SAMPLE_COUNT =>
                if seqcount( 10 downto 7) = unsigned*("1111") then
                    Eng_State <= CHECK_FOR_IDLE;
                else
                    Eng_State<= SET_LRCK_HIGH;
                end if;
        when CHECK_FOR_IDLE=>
                if CycleCnt= unsigned*("00000000000") then
                    Run <='0';
                    Eng_State <= IDLE;
                    Int <='1';
                else
                    CycleCnt <= CycleCnt -'1';
                    Eng_State <= SET_LRCK_HIGH;
                end if;
        when OTHERS =>
                end case;
                end if;
        end process;

        --eng spi bus
        ENG_Sck <=(seqcount(0) and Eng_Sck_En) when Run ='1' else Sclk;
        ENG_SO <='1' when ( Eng_State = OUTPUT_SRAM_HEADER and
            (seqcount(5 downto 0 ) = unsigned*("001011") or
            seqcount( 5 downto 0) = unsigned*("001100")))
            else '0' when( EngState = OUTPUT_SRAM_HEADER)
            else ADC_Data when run ='1'; else SDI;
            nvSRAM_CS <='0'; when (Run ='1' or CS = nvSRAM1_CS_LOW) else '1';
            ADC_CS <='0'; when ( CS= ADC_CS_LOW and Run= '0') else '1';
            --SDO is either SDo or Eng_SI
            SDO <= ENG_SI when CS(1) ='0' else Run when CS = CPLD_SELECT '2';
            ADC_BCK <= seqcount(0);
    end Behavioral;




    testbench



     LIBRARY ieee;
      USE ieee.std_logic_1164.ALL;
      USE ieee.numeric_std.ALL;
      USE ieee.std_logic_unsigned.all;

      ENTITY testbench IS
      END testbench;

      ARCHITECTURE behavior OF testbench IS 
              COMPONENT <component name>
              PORT(
       Mclk : in STD_LOGIC;
        Rst : in STD_LOGIC;
        Sclk : in STD_LOGIC;
        SDI : in STD_LOGIC;
        SDO : out STD_LOGIC;
        CS : in STD_LOGIC_VECTOR(1 downto 0);
        Int : out STD_LOGIC;
        ADC_LRCK : out STD_LOGIC;
        ADC_BCK : out STD_LOGIC;
        ADC_Data : in STD_LOGIC;
        ADC_CS : out STD_LOGIC;
        nvSRAM_CS : out STD_LOGIC;
        ENG_Sck : out STD_LOGIC;
        ENG_SI : in STD_LOGIC;
        ENG_SO : out STD_LOGIC;
        LaserHiLow : out STD_LOGIC;
                      );
              END COMPONENT;

            signal Mclk : std_logic :='0';
            signal Rst : std_logic :='0';
            signal Sclk : std_logic :='0';
            signal SDI : std_logic :='0';
            signal CS : std_logic_vector(1 downto 0) := ( others =>'0');
            signal ADC_Data : std_logic :='0';
            signal ENG_SI : std_logic :='0';

            signal SDO : std_logic;
            signal Int : std_logic;
            signal ADC_LRCK : std_logic;
            signal ADC_BCK : std_logic;
            signal ADC_CS : std_logic;
            signal nvSRAM_CS : std_logic;
            signal ENG_sck : std_logic;
            signal ENG_SO : std_logic;
            signal LaserHiLow : std_logic;

            constant Mclk_period: time := 1 us;
            constant Sclk_period: time := 1 us;


      BEGIN
              uut:  acqeng PORT MAP(
                      Mclk => Mclk,
                            Rst => Rst,
                            Sclk => Sclk,
                            SDI => SDI,
                            SDO => SDO,
                            CS => CS,
                            Int => Int,
                            ADC_LRCK => ADC_LRCK,
                            ADC_BCK => ADC_BCK,
                            ADC_Data => ADC_Data,
                            ADC_CS => ADC_CS,
                            nvSRAM_CS => nvSRAM_CS,
                            ENG_Sck =>ENG_Sck,
                            ENG_SI =>ENG_SI,
                            ENG_SO =>ENG_SO,
                            LaserHiLow => LaserHiLow
              );

    Mclk_process : process
    begin
        Mclk <='0';
        wait for Mclk_period/2;
        Mclk <='1';
        wait for Mclk_period/2;
        end process;

        Sclk_process:process
        begin
        Sclk <='0';
        wait for Sclk_period/2;
        Sclk <='1';
        wait for Sclk_period/2;
        end process

        stim_proc : process
        begin

        wait for 100ms

        wait for Mclk_period*10;

        wait;
        end process;

      END;
第71行:

    if SPIbitCnt = (unsigned*("000")) then
该星号表示您正试图将一个无符号类型乘以一个值000。这在我所见过的任何语言中都是毫无意义的

如果你指的是未签名的'000,那就简单多了

    if SPIbitCnt = 0 then

这是最好的。使用数字标准库代替非标准库;它重载了unsigned和natural之间的比较,这使它能够工作。在您识别的其他行中有多个类似的错误。

建议。识别第37、303和1731行并理解错误消息的含义。我们不能为你这样做;代码中没有1731行是为了开始而发布的。但最后一个错误很明显:std_逻辑表示一个位,它可以是“0”或“1”。因此,不要尝试将其设置为“2”,否则将不起作用。错误表示我无法使用此特定表达式。我需要帮助,因为我不确定我可以使用什么其他表达式。您仍然没有确定错误所指的行,甚至没有确定错误所指的实体。我不知道您所指的是哪个表达式。除非你从根本上改进这个问题,否则你是不可能在这里得到帮助的。首先,制作一个简单的示例,并用完整的错误消息和正确的行号具体询问错误。在您的示例中,我们不会计算行数!您需要在问题中识别并标记这些行。请更正你的缩进。正如错误消息已经告诉您的,“2”不是位值std_逻辑的一部分。进一步说明:使用枚举类型来表示状态,而不是常量。“2”之前缺少一个else。不要使用像1000011这样的神奇数字。切勿使用STD_LOGIC_ARITH和STD_LOGIC_UNSIGNED软件包。这是无效的VHDL:未签名*1000000。你是说一个限定表达式吗?您的设计不应使用异步重置。为什么您的设计工作在下降沿?否则adc_数据在运行时为='1';else-sdi;分号排除了其他字符的位置。sdo