Strona 1 z 1

[FPGA] MAXIMATOR obsługa ADC

: czwartek 17 mar 2016, 23:14
autor: PROTON
Obsługa ADC na kanale ANAIN1, czyli tam gdzie jest podłączony potencjometr.
Podczas kręcenia potencjometrem w prawo zapalaną się diody na płytce.

ADC.7z

Re: [FPGA] MAXIMATOR obsługa ADC

: czwartek 17 mar 2016, 23:59
autor: dambo
mógłbyś coś więcej o tym napisać? widzę, że jest tu użyty gotowy ip-core do adc-ka, tak samo będzie z innymi "peryferiami" wewnętrznymi w MAX10?

Re: [FPGA] MAXIMATOR obsługa ADC

: piątek 18 mar 2016, 09:22
autor: PROTON
Wersja poprawiona kodu VHDL, okazuje się że nie potrzeba automatu skończonego (FSM) do obsługi ADC.
Wystarczy sprawdzać czy response_valid = '1'

Kod: Zaznacz cały

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

ENTITY Test_ADC IS

   PORT(
      CLK : IN  STD_LOGIC;
      LED : OUT STD_LOGIC_VECTOR(3 downto 0)
   );

   END Test_ADC;

ARCHITECTURE logic OF Test_ADC IS

   signal reset_reset_n : STD_LOGIC;
   signal command_valid : STD_LOGIC;
   signal command_channel : STD_LOGIC_VECTOR(4 DOWNTO 0);
   signal command_startofpacket : STD_LOGIC;
   signal command_endofpacket : STD_LOGIC;
   signal command_ready : STD_LOGIC;
   signal response_valid : STD_LOGIC;
   signal response_channel : STD_LOGIC_VECTOR(4 DOWNTO 0);
   signal response_data : STD_LOGIC_VECTOR(11 DOWNTO 0);
   signal response_startofpacket : STD_LOGIC;
   signal response_endofpacket : STD_LOGIC;


   component adc_qsys is
      port (
         clk_clk                : in  std_logic                     := 'X';             -- clk
         reset_reset_n          : in  std_logic                     := 'X';             -- reset_n
         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 adc_qsys;

   begin
   
   u0 : component adc_qsys
      port map (
         clk_clk                => CLK,                --        clk.clk
         reset_reset_n          => reset_reset_n,          --      reset.reset_n
         command_valid          => command_valid,          --    command.valid
         command_channel        => command_channel,        --           .channel
         command_startofpacket  => command_startofpacket,  --           .startofpacket
         command_endofpacket    => command_endofpacket,    --           .endofpacket
         command_ready          => command_ready,          --           .ready
         response_valid         => response_valid,         --   response.valid
         response_channel       => response_channel,       --           .channel
         response_data          => response_data,          --           .data
         response_startofpacket => response_startofpacket, --           .startofpacket
         response_endofpacket   => response_endofpacket   --           .endofpacket
      );
      
      command_channel <= "00000";
      reset_reset_n <= '1';
      command_valid <= '1';
      command_startofpacket <= '1';
      command_ready <= '1';
      
      process(CLK)
      
      begin
      
         if rising_edge(CLK) and response_valid = '1' then
            
            if response_data > 512 then
               LED(0) <= '0';
            else
               LED(0) <= '1';
            end if;
         
            if response_data > 1536 then
               LED(1) <= '0';
            else
               LED(1) <= '1';
            end if;
            
            if response_data > 2560 then
               LED(2) <= '0';
            else
               LED(2) <= '1';
            end if;
            
            if response_data > 3584 then
               LED(3) <= '0';
            else
               LED(3) <= '1';
            end if;
      
         end if;
      
      end process;
END logic;

Re: [FPGA] MAXIMATOR obsługa ADC

: piątek 18 mar 2016, 09:34
autor: PROTON
dambo pisze:mógłbyś coś więcej o tym napisać? widzę, że jest tu użyty gotowy ip-core do adc-ka, tak samo będzie z innymi "peryferiami" wewnętrznymi w MAX10?

Nie jest to typowy IP-Core, został wygenerowany przy użyciu konfiguratora Qsys ( w menu: Tools->Qsys ), do wszystkich wbudowanych peryferiów używa się tego konfiguratora.