реклама на сайте
подробности

 
 
> Подключение AD7478A к ПЛИС по SPI, Совет, помощь,подсказка.
Hit
сообщение Mar 28 2013, 04:54
Сообщение #1





Группа: Участник
Сообщений: 13
Регистрация: 7-03-13
Пользователь №: 75 933



Здравствуйте! Необходимо подключить АЦП AD7478А к ПЛИС. На вход ацп подается последовательность импульсов с частотой 4кГц, длительностью 1 мкс. Момент прихода импульса не известен. Т.е. необходимо поставить пороговое устройство(ПУ). Поясните, пожалуйста, как в этом случае необходимо считывать данные? На форуме нашел этот код. Правда он косячный. Необходимо сформировать cs-сигнал в момент прихода разрешающего сигнала с ПУ, и в этот же момент запустить тактовые импульсы, так? Просто нужно сформировать 12 импульсов,ацп выдаст по ним данные, которые придут в регистр?
Код
d:\zwork\tlc548(9)\top_lev.vhd
1 libraryIEEE;
2 useIEEE.STD_LOGIC_1164.ALL;
3 useIEEE.STD_LOGIC_ARITH.ALL;
4 useIEEE.STD_LOGIC_UNSIGNED.ALL;
5
6 entitytop_lev is
7 port(
8 clk : in std_logic; -- External clock
9 Data_adc: in std_logic; -- Data from ADC
10 cs : in std_logic; -- External ChipSelect
11 cs_adc : out std_logic; -- ChipSelect for ADC ==-Active Low-==
12 clk_adc : out std_logic; -- Clock for ADC
13 Data_out: out std_logic_vector(7 downto 0) -- Output Vector 8 bits
14 );
15 endtop_lev;
16
17 architectureBehavioral oftop_lev is
18
19 signalD_reg : std_logic_vector(7 downto 0);
20 signalcnt : std_logic_vector(2 downto 0);
21
22 begin
23
24 clk_adc <=clk;
25 cs_adc <=cs;
26
27 process(clk)
28 begin
29 if rising_edge(clk) then
30 ifcs ='0' then
31 D_reg <=D_reg(6 downto 0) &Data_adc;
32 --else
33 --D_reg <= (others => '0');
34 end if;
35 end if;
36 end process;
37
38 process(clk,cs)
39 begin
40 ifcs ='1' then
41 cnt <= (others =>'0');
42 elsif rising_edge(clk) then
43 cnt <=cnt +'1';
44 end if;
45 end process;
46
47 Data_out <=D_reg whencnt = "00000000";
48
49 endBehavioral;
50

Прикрепил временную диаграмму АЦП.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Hit
сообщение Mar 31 2013, 16:37
Сообщение #2





Группа: Участник
Сообщений: 13
Регистрация: 7-03-13
Пользователь №: 75 933



Помогите. Голова уже не соображает. Вот диаграмма. Код.
CODE
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity SPI_Master is
Generic ( Quarz_Taktfrequenz : integer := 96000000;
SPI_Taktfrequenz : integer := 48000000;
Laenge : integer := 16
);
Port (
RX_Data : out STD_LOGIC_VECTOR (Laenge-1 downto 0);
MISO : in STD_LOGIC;
SCLK : out STD_LOGIC;
SS : out STD_LOGIC;
TX_Start : in STD_LOGIC;
TX_Done : out STD_LOGIC;
clk : in STD_LOGIC
);
end SPI_Master;

architecture Behavioral of SPI_Master is
signal delay : integer range 0 to (Quarz_Taktfrequenz/(2*SPI_Taktfrequenz));
constant clock_delay : integer := (Quarz_Taktfrequenz/(4*SPI_Taktfrequenz));

type spitx_states is (spi_stx,spi_txactive,spi_etx);
signal spitxstate : spitx_states := spi_stx;

signal spiclk : std_logic;
signal spiclklast: std_logic;

signal bitcounter : integer range 0 to Laenge; -- wenn bitcounter = Laenge --> alle Bits uebertragen
signal rx_reg : std_logic_vector(Laenge-1 downto 0) := (others=>'0');

begin

process begin
wait until falling_edge(CLK);
if(delay>0) then delay <= delay-1;
else delay <= clock_delay;
end if;
spiclklast <= spiclk;

case spitxstate is
when spi_stx =>
SS <= '1';
TX_Done <= '0';
bitcounter <= Laenge;
spiclk <= '1';
if(TX_Start = '1') then
spitxstate <= spi_txactive;
SS <= '0';
delay <= clock_delay;
end if;

when spi_txactive =>
if (delay=0) then
spiclk <= not spiclk;
if (bitcounter=0) then
spiclk <= '1';
spitxstate <= spi_etx;
end if;
if(spiclk='1') then
bitcounter <= bitcounter-1;
end if;
end if;

when spi_etx =>
SS <= '1';
TX_Done <= '1';
if(TX_Start = '0') then
spitxstate <= spi_stx;
end if;
end case;
end process;

process begin
wait until falling_edge(CLK);
if (spiclk='1' and spiclklast='0' ) then
rx_reg <= rx_reg(rx_reg'left-1 downto 0) & MISO;
end if;
end process;


SCLK <= spiclk;
RX_Data <= rx_reg;

end Behavioral;


И тестБенч.
CODE
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;

ENTITY tb_SPI_Master_vhd IS
END tb_SPI_Master_vhd;

ARCHITECTURE behavior OF tb_SPI_Master_vhd IS

COMPONENT SPI_Master
Port ( RX_Data : out STD_LOGIC_VECTOR (15 downto 0);
MISO : in STD_LOGIC;
SCLK : out STD_LOGIC;
SS : out STD_LOGIC;
TX_Start : in STD_LOGIC;
TX_Done : out STD_LOGIC;
clk : in STD_LOGIC
);
END COMPONENT;

SIGNAL MISO : std_logic := '0';
SIGNAL TX_Start : std_logic := '0';
SIGNAL clk : std_logic := '0';



SIGNAL RX_Data : std_logic_vector(15 downto 0);
SIGNAL SCLK : std_logic;
SIGNAL SS : std_logic;
SIGNAL TX_Done : std_logic;

SIGNAL rxsrslave : std_logic_vector(15 downto 0) := x"0000";

BEGIN

uut: SPI_Master PORT MAP(
RX_Data => RX_Data,
MISO => MISO,
SCLK => SCLK,
SS => SS,
TX_Start => TX_Start,
TX_Done => TX_Done,
clk => clk
);

clk <= not clk after 5.2 ns; -- 96 MHz

process (sclk) begin
if (falling_edge(SCLK)) then
rxsrslave <= rxsrslave(14 downto 0) & MISO;
end if;
end process;




b : PROCESS BEGIN

wait for 3035 ns;
MISO<='1';

wait for 106688 ns;
MISO<='0';
wait;
END PROCESS;



tb : PROCESS BEGIN

wait for 3 us;
TX_Start <= '1';

wait until TX_Done='1';
TX_Start <= '0';
wait for 100000 ns;


wait for 3 us;
TX_Start <= '1';

wait until TX_Done='1';
TX_Start <= '0';
wait for 100000 ns;


wait for 3 us;
TX_Start <= '1';

wait until TX_Done='1';
TX_Start <= '0';
wait;
END PROCESS;

END;


В Rx_date записывается лишнее значение. rxrslave прописан в тестбенче, он тактируется SCLK , поэтому там правильно записывается(по заднему фронту). Rx_date тактируется clk, запись туда производится при spiclk='1' and spiclklast='0' . И в самом конце он производит лишнюю запись. Как исправить ? Никак не соображу что понаделал.

Сообщение отредактировал des00 - Mar 31 2013, 17:48
Причина редактирования: используйте тег codebox для больших участков кода (с) модератор

Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 15:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01409 секунд с 7
ELECTRONIX ©2004-2016