带VHDL/Quartus Prime Lite代码优化的最大10个ADC

带VHDL/Quartus Prime Lite代码优化的最大10个ADC,vhdl,fpga,adc,quartus,Vhdl,Fpga,Adc,Quartus,首先,我必须说,我是一个完整的VHDL初学者,所以如果这是一个非常愚蠢的问题,我想提前道歉。 我正在努力使ADC软IP正常工作。我只想使用ADC,所以没有FIFO或其他任何东西。 因此,我用qsys文件生成了IP核心,并将其包含到我的项目中。我还用预分频器激活了通道8。 我试图从连接到通道8的可变电阻器读取值,并用led打印出5个最高有效位。 case语句应创建激活adc所需的模式,如MAX 10 adc指南中所示 library ieee; use ieee.std_logic_1164.al

首先,我必须说,我是一个完整的VHDL初学者,所以如果这是一个非常愚蠢的问题,我想提前道歉。 我正在努力使ADC软IP正常工作。我只想使用ADC,所以没有FIFO或其他任何东西。 因此,我用qsys文件生成了IP核心,并将其包含到我的项目中。我还用预分频器激活了通道8。 我试图从连接到通道8的可变电阻器读取值,并用led打印出5个最高有效位。 case语句应创建激活adc所需的模式,如MAX 10 adc指南中所示

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



entity main is
    port ( CLK_50   : in  std_logic;
          LEDR  : out std_logic_vector(4 downto 0));
end;


architecture behave of main is

    signal Cnt : integer := 0;
    signal pCnt : integer := 0;

    signal lock : std_logic;
    signal CLK_10 : std_logic;
    signal CLK_1 : std_logic;
    signal set : std_logic ;

    signal RESET : std_logic ;

    signal CMDVal : std_logic;
    signal CMDCH : std_logic_vector (4 downto 0);
    signal CMDSOP : std_logic;
    signal CMDEOP : std_logic;
    signal CMDRDY : std_logic;
    signal RESVal : std_logic;
    signal RESCH : std_logic_vector (4 downto 0);
    signal RESData : std_logic_vector (11 downto 0);
    signal RESSOP : std_logic;
    signal RESEOP : std_logic;

    component myadc is
        port (
            clock_clk              : in  std_logic                     := 'X';             -- clk
            reset_sink_reset_n     : in  std_logic                     := 'X';             -- reset_n
            adc_pll_clock_clk      : in  std_logic                     := 'X';             -- clk
            adc_pll_locked_export  : in  std_logic                     := 'X';             -- export
            command_valid          : in  std_logic                     := 'X';             -- valid
            command_channel        : in  std_logic_vector(4 downto 0)  := (others => 'X'); -- channel
            command_startofpacket  : in  std_logic                     := 'X';             -- startofpacket
            command_endofpacket    : in  std_logic                     := 'X';             -- endofpacket
            command_ready          : out std_logic;                                        -- ready
            response_valid         : out std_logic;                                        -- valid
            response_channel       : out std_logic_vector(4 downto 0);                     -- channel
            response_data          : out std_logic_vector(11 downto 0);                    -- data
            response_startofpacket : out std_logic;                                        -- startofpacket
            response_endofpacket   : out std_logic                                         -- endofpacket
        );
    end component myadc;

begin

    CMDCH <= "01000";
    RESET <= '0';
    set <= '1';

    mPLL : entity work.pll 
        port map(
        areset => set,
        inclk0 => CLK_50,
        c0 => CLK_10,
        c1 => CLK_1,
        locked => lock
    );


    mADC : component myadc
        port map (
            clock_clk              => CLK_50,                  --          clock.clk
            reset_sink_reset_n     => RESET,                     --     reset_sink.reset_n
            adc_pll_clock_clk      => CLK_10,                   --  adc_pll_clock.clk
            adc_pll_locked_export  => lock,                          -- adc_pll_locked.export
            command_valid          => CMDVal,                    --        command.valid
            command_channel        => CMDCH,                    --               .channel
            command_startofpacket  => CMDSOP,                    --               .startofpacket
            command_endofpacket    => CMDEOP,                   --               .endofpacket
            command_ready          => CMDRDY,                  --               .ready
            response_valid         => RESVal,                   --       response.valid
            response_channel       => RESCH,                     --               .channel
            response_data          => RESData,             --               .data
            response_startofpacket => RESSOP,                    --               .startofpacket
            response_endofpacket   => RESEOP                    --               .endofpacket
        );

process 
begin

    wait until rising_edge(CLK_50);

    pCnt <= pCnt + 1;

    case pCnt is
        when 1 => CMDSOP <= '1';
                     CMDVal <= '1';
        when 114 => CMDRDY <= '1';
        when 115 => CMDSOP <= '0';
                        CMDRDY <= '0';
                        LEDR <= RESData(11 downto 7);
        when 214 => CMDRDY <= '1';
        when 215 => CMDRDY <= '0';
                        LEDR <= RESData(11 downto 7);
        when 314 => CMDRDY <= '1';
        when 315 => CMDRDY <= '0';
                        LEDR <= RESData(11 downto 7);
        when 414 => CMDRDY <= '1';
        when 415 => CMDRDY <= '0';
                        LEDR <= RESData(11 downto 7);
        when 514 => CMDRDY <= '1';
        when 515 => CMDRDY <= '0';
                        LEDR <= RESData(11 downto 7);
        when 614 => CMDRDY <= '1';
        when 615 => CMDRDY <= '0';
                        LEDR <= RESData(11 downto 7);
        when 714 => CMDRDY <= '1';
        when 715 => CMDRDY <= '0';
                        LEDR <= RESData(11 downto 7);
        when 814 => CMDRDY <= '1';
        when 815 => CMDRDY <= '0';
                        LEDR <= RESData(11 downto 7);
        when 914 => CMDRDY <= '1';
        when 915 => CMDRDY <= '0';
                        LEDR <= RESData(11 downto 7);
        when 1014 => CMDRDY <= '1';
        when 1015 => CMDRDY <= '0';
                         LEDR <= RESData(11 downto 7);      
        when 1114 => CMDRDY <= '1';
        when 1115 => CMDRDY <= '0';
                         CMDEOP <= '1';
        when 1116 => CMDEOP <= '0';
                         CMDVal <= '0';


        when 2000 => pCnt <= 0;
        when others => Cnt <= pCnt ;
    end case;
end process;

end;
在VHDL中(基本上在所有硬件描述语言中),您必须记住代码必须是可合成的:它必须描述可编程组件中可用的硬件组件。在您的流程中,情况并非如此

下一行:
等待上升沿(CLK_50)wait
语句,无法合成code>

要创建顺序流程,您需要:

my_seq_proc : process (clk, rst)
begin
     if (rst = '1') then
        ... -- reset your signals
     elsif (rising_edge(clk)) then
        ... -- what you need to do
     end if;
end process;
请注意,您不必使用重置信号。 另外,请注意,您需要在过程声明
(clk,rst)
中列出灵敏度列表,以及您的时钟(clk_50)和可能的重置信号


我还没有检查是否还有错误。您应该首先尝试这样做。

推荐的编码样式和支持的用于推断寄存器的样式之间存在差异。推荐的样式可在第1卷《设计和合成手册》中找到。支持的样式可在撤销的IEEE Std 1076.6-2004 IEEE VHDL寄存器传输级(RTL)合成标准中找到。在此特定情况下,6.1.3.2边缘敏感存储使用单个等待语句,与OP的使用情况相匹配。Altera的合成工具预计将符合已撤销的IEEE标准。据我所知,等待上升沿(clk)是一个完全有效的选项,只要您不想重置。不管怎样,它以前做过合成,没有问题。然而,由于某种原因,当它被合成时,pll被移除了,所以所有的逻辑都不能工作。但我也改变了您推荐的方式,但仍然不起作用。我不知道要等到Altera为Synthesis提供了支持后才能使用
。我很抱歉。一般来说,只有一个声明。在流程开始或结束时(敏感度列表在流程结束时有一个隐式等待语句
wait on
,11.3、10.2)。当您的逻辑在优化过程中被破坏,并且您的输出与导轨相连时,这通常是逻辑设计错误或工具使用错误的标志。在本例中,以用于驱动LEDR值的myadc的ResData为中心。除了myadc可能存在的逻辑问题外,它还可能在精化过程中被解除绑定,导致ResData不被驱动,设计的整个剩余部分被门吃掉(LEDR是唯一的输出)。在合成过程中,您需要检查控制台输出(或日志)是否存在警告和错误。是的,我意识到问题在于输出未被驱动,因此我尝试将adc的数据保存在单独的std_逻辑向量中,并使用每个时钟周期驱动输出,但这并没有改变问题。缺点是我不知道如何更改adc逻辑内部的任何内容,因为它是altera ip核。我只能找到带有示例存储的adc控件的教程。据我所知,altera文档中驱动adc的逻辑应该是正确的,但遗憾的是,我无法确认它是正确的。您的读者似乎不可能在没有被类似攻击的情况下,窥视黑盒并告诉您出了什么问题。您似乎正在处理生成期间的IP核心配置。你说过你没有使用FIFO,在myadc组件声明中显示了一个PLL。第一个问题是,它在模拟中是否正常工作?最有可能的是,当您让它按照预期进行模拟时,允许合成将所有逻辑修剪掉的错误将消失。
my_seq_proc : process (clk, rst)
begin
     if (rst = '1') then
        ... -- reset your signals
     elsif (rising_edge(clk)) then
        ... -- what you need to do
     end if;
end process;