Перейти к содержанию
    

Вопрос по неоптимальности процедуры

Хочу воспользоваться ЦАПом на Xilinx Spartan3E Starter Kit

пишу это так

 

entity spi_out is
    Port ( clk : in  STD_LOGIC;
           dr : in  STD_LOGIC;
           data : in  STD_LOGIC_VECTOR (15 downto 0);
           CS : out  STD_LOGIC;
           DCLK : out  STD_LOGIC;
           MOSI : out  STD_LOGIC);
end spi_out;

architecture Behavioral of spi_out is

signal start : std_logic := '0';
signal counter : integer := 0;
signal data_out : std_logic_vector(31 downto 0) := (others => '0');
signal cs_loc : std_logic := '1';
signal dclk_loc : std_logic := '0';
signal mosi_loc : std_logic := '0';

begin

--cs   <= cs_loc;
dclk <= dclk_loc;
mosi <= mosi_loc;


send_data : process(clk)
begin
    if falling_edge(clk) then
        if dr = '1' then
            if start = '0' then
                start <= '1';
                cs <= '0';
                counter <= 0;
                data_out(15 downto 0)  <= data;
                data_out(19 downto 16) <= "0000";
                data_out(23 downto 20) <= "0011";
                data_out(31 downto 24) <= (others => '0');
                report "SPI -> CS <='0'";
            end if;        
        end if;
        if start = '1' then
            if (dclk_loc = '1') then
                report "SPI -> falling_edge";                
                mosi_loc <= data_out(counter);
                if counter = 31 then 
                    report "SPI -> send finish";
                    start <= '0';
                    cs <= '1';                    
                end if;                
            else 
                report "SPI -> rising_edge";
                counter <= counter + 1;
                dclk_loc <= '1';                
            end if;
            dclk_loc <= not dclk_loc;        
        end if;    
    end if;

end process send_data;

end Behavioral;

 

Если кому-нибудь не лень - покритикуйте, что неправильно/неоптимально... И почему при оптимизации среда обрезает некоторые сигналы и потом при маппировании генерит ошибку что их нет... (http://electronix.ru/forum/index.php?showtopic=49831) т.к. я новичок - прошу более-менее понятно объяснить. Буду оч. благодарен :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос вам : схема моделировалась ?

 

не знаю интерфейс вашего ЦАПА, но если он берет данные по положительному фронту сигнала dclk (т.е. при переходе 0 -> 1) то ИМХО работать корректно не будет. Будет пропуск младшего бита и код выставляемый на цап будет в 2 раза меньше.

 

причина вот здесь

if (dclk_loc = '1') then
  mosi_loc <= data_out(counter)

 

и разберитесь с сигналом dclk. Вот это место

                dclk_loc <= '1';                
            end if;

 

работать не будет %)

 

 

По оптимальности

 

mosi_loc <= data_out(counter);

 

мультиплексор 32в1 (правда в вашем случае 16в1 + LUT) это уже слишком для обычного сдвигового регистра.

 

 

Думаю что данной информации вам будет достаточно для размышления %)

 

Удачи!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Большое спасибо! :a14:

 

Переписал код

entity spi_out is
    Port ( clk : in  STD_LOGIC;
           dr : in  STD_LOGIC;
           data : in  STD_LOGIC_VECTOR (15 downto 0);
           CS : out  STD_LOGIC;
           DCLK : out  STD_LOGIC;
           MOSI : out  STD_LOGIC);
end spi_out;

architecture Behavioral of spi_out is


signal counter : integer range 0 to 32 := 0;
signal cs_loc : std_logic := '1';
signal dclk_loc : std_logic := '1';
signal mosi_loc : std_logic := '0';

signal dac_value : std_logic_vector(11 downto 0) := (others => '0');
signal dac_command : std_logic_vector(3 downto 0) := (others => '0');
signal dac_addr : std_logic_vector(3 downto 0) := (others => '0');


begin

cs   <= cs_loc;
dclk <= dclk_loc;
mosi <= mosi_loc;


send_data : process(clk)
variable start : std_logic := '0';
begin
    if falling_edge(clk) then
        if dr = '1' then
            if start = '0' then
                start := '1';
                cs_loc <= '0';
                counter <= 0;
                dac_value <= data(15 downto 4);
                dac_command <= "0011";
                dac_addr <= "0000";                
                report "SPI -> CS <= '0'";
            end if;        
        end if;
        if start = '1' then
            dclk_loc <= not dclk_loc;        
            if (dclk_loc = '1') then
                report "SPI -> falling_edge";                
                if counter >=0 and counter <4 then
                    mosi_loc <= dac_command(3 - counter);
                elsif counter < 8 then
                    mosi_loc <= dac_addr(7 - counter);
                elsif counter < 20 then
                    mosi_loc <= dac_value(19 - counter);
                else 
                    mosi_loc <= '0';
                end if;
                
                if counter = 31 then                 
                    start := '0';
                    cs_loc <= '1';        
                    report "SPI -> CS <= '1'";
                end if;                
            else 
                counter <= counter + 1;                
            end if;            
        end if;    
    end if;

end process send_data;

end Behavioral;

Изменено пользователем Gas Wilson

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...