titus 0 19 сентября, 2006 Опубликовано 19 сентября, 2006 · Жалоба Возникли такие трудности: Проект тактируется сигналом clock. Есть необходимость считывать данные по другому синхросигналу, внешнему. Вопросы: 1. Почему не работает конструкция signal'event 2. Как явно указывать в ISE сигнал тактирования? В некоторых проектах он не определяется. Спаибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 15 19 сентября, 2006 Опубликовано 19 сентября, 2006 · Жалоба Проект тактируется сигналом clock. Есть необходимость считывать данные по другому синхросигналу, внешнему. Вопросы: 1. Почему не работает конструкция signal'event Телепаты в перманентном отпуске. Код в студию. 2.Как явно указывать в ISE сигнал тактирования? В некоторых проектах онне определяется. Что значит "не определяется"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
titus 0 19 сентября, 2006 Опубликовано 19 сентября, 2006 · Жалоба Сейчас сделано так: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity adc_driver is port( CLK :IN STD_LOGIC; DCO :IN STD_LOGIC; DCO180 :IN STD_LOGIC; CE :IN STD_LOGIC; DA :IN STD_LOGIC_VECTOR(9 DOWNTO 0); DB :IN STD_LOGIC_VECTOR(9 DOWNTO 0); DOUT :OUT STD_LOGIC_VECTOR(9 DOWNTO 0) ); end adc_driver; architecture Behavioral of adc_driver is signal dco_prev : std_logic; signal dco180_prev : std_logic; begin process (CLK) begin if CLK'event and CLK = '1' then if (CE = '1') then if DCO = '1' and dco_prev = '0' then DOUT <= DA; elsif DCO180 = '1' and dco180_prev = '0' then DOUT <= DB; end if; else DOUT <= "ZZZZZZZZZZ"; end if; dco_prev <= dco; dco180_prev <= dco180; end if; end process; end Behavioral; А хотелось бы отвязаться от сигнала clk. Т.е. выставлять на DOUT данные по положительным фронтам DCO и DCO180. Дело в том, что введение сигналов _prev значительно замедляет работу схемы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vetal 0 19 сентября, 2006 Опубликовано 19 сентября, 2006 · Жалоба А так разве не устраивает: DOUT<= DA when DCO = '1' and CE='1' else DB when DCO180 = '1' and CE='1' else (others=>'Z'); ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 15 19 сентября, 2006 Опубликовано 19 сентября, 2006 · Жалоба process (CLK) begin if CLK'event and CLK = '1' then if (CE = '1') then ... else DOUT <= "ZZZZZZZZZZ"; end if; end if; end process; Нет таких триггеров, на выходе которых было бы третье состояние. Перепишите так, как советует vetal. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 19 сентября, 2006 Опубликовано 19 сентября, 2006 · Жалоба А хотелось бы отвязаться от сигнала clk. /////////////////////// Непонятно как можно отвязаться от сигнала clk, если надо считывать эти мультиплексированные данные тем же clk. Один путь. Повышать частоту clk. (Обратите внимание: сигналы разрешения записи в регистр у Вас будут переменной длительности от периода к периоду clk). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gate 0 19 сентября, 2006 Опубликовано 19 сентября, 2006 · Жалоба process (CLK) begin if CLK'event and CLK = '1' then if (CE = '1') then if DCO = '1' and dco_prev = '0' then DOUT <= DA; elsif DCO180 = '1' and dco180_prev = '0' then DOUT <= DB; end if; else DOUT <= "ZZZZZZZZZZ"; end if; dco_prev <= dco; dco180_prev <= dco180; end if; end process; Хотелось бы еще отметить, что если clk и dco асинхронны, то возможна ситуация, когда setup или hold time для dco или dco180 относительно clk не будут выдержаны и Вы получите метастабильность. Поэтому для синтеза так писать нельзя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
titus 0 20 сентября, 2006 Опубликовано 20 сентября, 2006 · Жалоба Всем спасибо за советы. Уже понял, что написанный код неудачный. Сама же задача такая: Плис тактирует ацп сигналом clk. Ацп, в свою очередь, поочередно выставляет данные на две шины и выдает внешний дифференциальный клок DCO и DCO180. По фронтам которых надо считывать данные(так что гарантии синхронности clk и dco, как я понимаю, нет). Потом плиса должна эти данные запихивать в фифо. Я так понимаю, лучше это делать с частотой DCO х 2. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beg 0 20 сентября, 2006 Опубликовано 20 сентября, 2006 · Жалоба ...Уже понял, что написанный код неудачный... ... Плис тактирует ацп сигналом clk... Схема тоже неудачная. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 20 сентября, 2006 Опубликовано 20 сентября, 2006 · Жалоба Плис тактирует ацп сигналом clk. Ацп, в свою очередь, поочередно выставляет данные на две шины и выдает внешний дифференциальный клок DCO и DCO180. По фронтам которых надо считывать данные(так что гарантии синхронности clk и dco, как я понимаю, нет). Потом плиса должна эти данные запихивать в фифо. Я так понимаю, лучше это делать с частотой DCO х 2.////////////////////// Что касается принципов формирования clk для АЦП, его jitterа - это отдельная тема. Что касется приема данных с последующей записью в фифо. это стандартный подход при переходе из одного клокового домена в другой. Если данные сопровождаются клоком, не нужно никакого CE. Удвоенной частотой тоже не отделаться. У Вас два потока данных, плюс третье состояние по шине, плюс метастабильность. Есть другой подход (используется при одноразрядном потоке данных). Записываем например по 8 в сдвигающий регистр и записываем в фифо на пониженной частоте. Но с Вашей разрядностью это нерационально. module adc_driver ( input CLK_x8, input DCO, input DCO180, input [9:0] DA, input [9:0] DB, output [9:0] DOUT, output reg enable_fifo_da, output reg enable_fifo_db ); reg [3:0] dco_prev; reg [3:0] dco180_prev; reg [9:0] data_rg; reg int_da_rg; reg int_db_rg; wire interval_da; wire e_wr_a; wire interval_db; wire e_wr_b; assign interval_da = ~dco_prev[3] & dco_prev[1]; assign e_wr_a = ~dco_prev[2] & dco_prev[1]; assign interval_db = ~dco180_prev[3] & dco180_prev[1]; assign e_wr_b = ~dco180_prev[2] & dco180_prev[1]; always @(posedge CLK_x8) begin dco_prev <= {dco_prev[2:0], DCO}; dco180_prev <= {dco180_prev[2:0], DCO180}; int_da_rg <= interval_da; int_db_rg <= interval_db; enable_fifo_da <= e_wr_a; enable_fifo_db <= e_wr_b; if (e_wr_a | e_wr_b) begin if (interval_da) data_rg <= DA; else data_rg <= DB; end end assign DOUT = (int_da_rg | int_db_rg) ? data_rg : 10'hzzz; endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться