Gas Wilson 67 3 июля, 2008 Опубликовано 3 июля, 2008 · Жалоба Хочу воспользоваться ЦАПом на 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) т.к. я новичок - прошу более-менее понятно объяснить. Буду оч. благодарен :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 4 июля, 2008 Опубликовано 4 июля, 2008 · Жалоба Вопрос вам : схема моделировалась ? не знаю интерфейс вашего ЦАПА, но если он берет данные по положительному фронту сигнала 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) это уже слишком для обычного сдвигового регистра. Думаю что данной информации вам будет достаточно для размышления %) Удачи! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gas Wilson 67 4 июля, 2008 Опубликовано 4 июля, 2008 (изменено) · Жалоба Большое спасибо! :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; Изменено 4 июля, 2008 пользователем Gas Wilson Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться