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

Я уже предложил добавить на вход вашего сдвигового регистра еще один триггер, чтобы породить там стандартный синхронизатор.

 

Добавим.

module in_out_flag
(
input  in_flag,
input  out_clk,
output ena_out_flag
);

reg          dff_a = 1'b0;
reg [2:0] shift_rg = 3'b000;

always @(posedge out_clk or posedge in_flag)
begin
if(in_flag)            dff_a <= 1'b1;
else                dff_a <= 1'b0;
end

always @(posedge out_clk)
begin
shift_rg <= {shift_rg[1:0], dff_a};
end

assign ena_out_flag = ~shift_rg[2] && shift_rg[1];

endmodule

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


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

Понятно, что можно написать там и без if, и синтезатор наверняка поймет правильно.

Хотелось узнать причину использования вами такой конструкции.

Не поймет. Квартусовский, например, на такие конструкции ругается.

 

post-37354-1302467004.jpg

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

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


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

Не поймет. Квартусовский, например, на такие конструкции ругается.

 

Значит, я был лучшего мнения о вашем кактусе.

 

И про верилог я могу сказать только "фи". Описание асинхронного сброса через posedge in_flag - это экономия за счет естественности описания. В VHDL, конечно, требуются отдельно описывать списки чувствительности процесса, что иногда напрягает, но необходимо для симуляции, но сама логика с разделенными асинхронными и синхронной ветками if гораздо прозрачнее получается.

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


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

Значит, я был лучшего мнения о вашем кактусе.

 

А причем тут квартус. Это конструкция рекомендована xst.pdf. И моделсим не против.

Приведите свой пример. Достойный ваших знаний.

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


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

Приведите свой пример. Достойный ваших знаний.

 

Вот описание этой схемы синхронизатора на VHDL. В VHDL-2008 будут доступны некоторые дополнительные упрощения, но ISE его пока что не синтезирует.

 

library ieee;
use ieee.numeric_bit.all;

entity in_out_flag is
    port(
        in_flag : in bit;
        
        out_clk : in bit;
        ena_out_flag : out bit
    );
end in_out_flag;

architecture Behavioral of in_out_flag is
    -- На S6 схема получается проще, если начальное состояние триггера с задействованной асинхронной установкой равно 1
    signal shift_reg : bit_vector( 1 to 4 ) := (others => '1');
begin

process( in_flag, out_clk )
begin
    if rising_edge( out_clk ) then
        shift_reg <= shift_reg srl 1;
    end if;
    
    if in_flag = '1' then
        shift_reg( 1 ) <= '1';
    end if;
end process;

ena_out_flag <= shift_reg( 3 ) and not shift_reg( 4 );

end Behavioral;

 

Пример на самом деле немного учебный, потому что в промышленном коде нужно вместо двух внутренних триггеров вставить обычный синхронизатор как отдельный компонент, тайминги в котором тщательно обконстрейнены, и прописаны у его триггеров все необходимые атрибуты, чтобы отключить оптимизацию через них логики.

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


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

Не поймет. Квартусовский, например, на такие конструкции ругается.

А на такие (код от Oldring) - нет.

Кто из нас неправ?

post-10362-1302505539_thumb.jpg

Надеюсь, честь Quartus'а спасена? :)

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


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

А на такие (код от Oldring) - нет.

Кто из нас неправ?

Надеюсь, честь Quatus'а спасена? :)

Какая связь между кодом Oldring на VHDL и возможностью проглатывания синтезатором предложенной Oldring'ом же замены в верилоговском описании? o_O

 

Было

always @(posedge C or posedge R)
begin
  if(R) O<=1;
  else O<=0;
end

 

Предложено

always @(posedge C or posedge R)
begin
  O<=R;
end

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

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


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

Вот описание этой схемы синхронизатора на VHDL.

 

Снимаю шляпу. Помню Вашу реализацию Barrel Shifters. Чтобы понять, что Вы написали, мне пришлось задействовать rtl просмотрщик.

И в этом примере Вы все поставили с ног на голову, применив сдвиг вправо.

Вы ведь прекрасно понимаете, что Ваше описание нечитаемо для пользователя среднего уровня развития.

(Два if в одном процессе). И опять я полез в RTL просмотрщик.

А потом гадай, как другие синтезаторы к такому описанию отнесутся.

Интересно, есть у Вас работники, которые в состоянии подхватить Ваши проекты.

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


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

Чтобы понять, что Вы написали, мне пришлось задействовать rtl просмотрщик.

А потом гадай, как другие синтезаторы к такому описанию отнесутся.

Вот и я, из любопытства скомпилировал код Oldring и показал картинку.

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


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

Вот и я, из любопытства скомпилировал код Oldring и показал картинку.

 

Картинка у него другая. Это не его код.

 

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


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

Какая связь между кодом Oldring на VHDL и возможностью проглатывания синтезатором предложенной Oldring'ом же замены в верилоговском описании? o_O

Вы показали картинку, и написали, что на такое Quartus ругается. Я показал картинку, на которую Quartus "не ругается". Они что, сильно отличаются? Поясните, что вы хотели сказать в первом случае, и только что.

 

Картинка у него другая. Это не его код.

Как это не его? Скопировал. Создал файл *.vhd. Скомпилировал. Картинку извлек. В сообщение забросил.

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


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

Картинка у него другая. Это не его код.

 

Мой! Сам писал! Мамой клянусь! :biggrin:

 

 

Вы ведь прекрасно понимаете, что Ваше описание нечитаемо для пользователя среднего уровня развития.

(Два if в одном процессе). И опять я полез в RTL просмотрщик.

 

Да, к сожалению "средний уровень развития" желает лучшего.

 

Тем не менее, этот код не должен быть очень сложным для профессионального программиста, занявшегося HDL и не поленившегося прочитать стандарт языка. Люди "от железа" просто смотрят на HDL как на "описание схемы", от программирования - как на описание поведения. И, кстати, согласитесь, моё описание на VHDL проще и естественнее, когда в нём разобраться - просто сдвиговый регистр на 4 бита, у которого состояние первого регистра асинхронно устанавливается в единицу отдельным асинхронным входом.

 

Два if - кажется, встречал такое даже в рекомендациях по стилю не помню каких тулзов.

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


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

Создал файл *.vhd. Скомпилировал. Картинку извлек. В сообщение забросил.

 

Тогда в догон версия пакета и целевой кристалл.

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


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

..Кто из нас неправ?

Прямо буря в стакане воды!

Вот что требовалось ...по рис 8!

Код, предложенный мной в начале, описывает два выходных регистра. Первый триггер - делитель. Схема достаточно универсальна для любых частот...

sch_imp.bmp

Изменено пользователем Мур

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


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

Да, к сожалению "средний уровень развития" желает лучшего.

 

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

 

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


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

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

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

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

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

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

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

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

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

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