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

Вопрос внешнего тактирования.

Возникли такие трудности:

 

Проект тактируется сигналом clock.

Есть необходимость считывать данные по другому синхросигналу, внешнему.

 

Вопросы:

1. Почему не работает конструкция signal'event

2. Как явно указывать в ISE сигнал тактирования? В некоторых проектах он не определяется.

 

Спаибо.

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


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

Проект тактируется сигналом clock.

Есть необходимость считывать данные по другому синхросигналу, внешнему.

 

Вопросы:

1. Почему не работает конструкция signal'event

Телепаты в перманентном отпуске. Код в студию.

 

2.Как явно указывать в ISE сигнал тактирования? В некоторых проектах онне определяется.
Что значит "не определяется"?

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


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

Сейчас сделано так:

 

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 значительно замедляет работу схемы.

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


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

А так разве не устраивает:

DOUT<= DA when DCO = '1' and CE='1' else
DB when DCO180 = '1' and CE='1' else (others=>'Z');

?

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


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

process (CLK)
begin
if CLK'event and CLK = '1' then
    if (CE = '1') then
        ...
    else
        DOUT <= "ZZZZZZZZZZ";
    end if;
end if;
end process;

Нет таких триггеров, на выходе которых было бы третье состояние. Перепишите так, как советует vetal.

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


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

А хотелось бы отвязаться от сигнала clk.

///////////////////////

Непонятно как можно отвязаться от сигнала clk, если надо считывать эти мультиплексированные данные тем же clk. Один путь. Повышать частоту clk. (Обратите внимание: сигналы разрешения записи в регистр у Вас будут переменной длительности от периода к периоду clk).

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


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

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 не будут выдержаны и Вы получите метастабильность. Поэтому для синтеза так писать нельзя.

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


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

Всем спасибо за советы.

Уже понял, что написанный код неудачный.

 

Сама же задача такая:

 

Плис тактирует ацп сигналом clk. Ацп, в свою очередь, поочередно выставляет данные на две шины и выдает внешний дифференциальный клок DCO и DCO180. По фронтам которых надо считывать данные(так что гарантии синхронности clk и dco, как я понимаю, нет). Потом плиса должна эти данные запихивать в фифо. Я так понимаю, лучше это делать с частотой DCO х 2.

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


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

...Уже понял, что написанный код неудачный...

...

Плис тактирует ацп сигналом clk...

Схема тоже неудачная.

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


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

Плис тактирует ацп сигналом 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

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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