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

Максимальная частота тактирования

не ради холивара

посоветую автору темы, если он еще не определился, взять язык Verilog (SV) а не VHDL

описание второго (простого) счетчика из ответа Maverick_ будет как-то так 

module cntr(input logic clk, en, rst, output logic [63:0] count);

always @(posedge clk or negedge rst)

if(!rst) count<='0; else if (en) count<=count+64'd1;

endmodule

что, по моему, большой плюс - краткость, то есть меньше шансов ошибиться

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


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

1 минуту назад, yes сказал:

краткость

В VHDL тоже можно писать в одну строку.

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


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

Just now, andrew_b said:

В VHDL тоже можно писать в одну строку.

сомневаюсь, что символов выйдет мало - станет только хуже с ясностью.

и даже если навставлять переводов строк после ; в верилоге - то все равно - сильно лучше с лаконичностью будет

 

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


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

11 minutes ago, andrew_b said:

В VHDL тоже можно писать в одну строку.

Все новые IP Cores от Xilinx'а сделаны Verilog'е. И это жжж, неспроста..

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


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

7 минут назад, yes сказал:

сильно лучше с лаконичностью будет

 

Зато с другим сильно хуже.

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


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

2 часа назад, blackfin сказал:

Все новые IP Cores от Xilinx'а сделаны Verilog'е.

Так индусы херак-херак и в продакшн.

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


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

21 minutes ago, andrew_b said:

Так индусы херак-херак и в продакшн.

Да, это сильный аргумент, чтобы переписать индусские написать свои IP Cores для 25/50/100G Ethernet'а на VHDL.


А свои IP Cores для PCIe Gen3/Gen4 вы уже на VHDL написали?

 

А как насчет IP Cores для DDR3/DDR4 ? У вас тоже всё своё и на VHDL ?

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


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

6 minutes ago, andrew_b said:

Не постигаю вашей логики.

Логика простая:

Вы заявили, что индусы пишут кривые IP Cores, но быстро.

Очевидно, эти кривые IP Cores вас не устраивают.

Тогда вам нужно написать свои IP Cores на замену этим "херак-херак" IP Cores.


Так, понятнее?

 

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


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

12 минут назад, blackfin сказал:

Вы заявили

Вы поднимите глаза на первое сообщение на этой странице. Там нам заявляют, что верилог хорош уж тем, что надо букавок меньше писать. И из-за этого якобы меньше ошибок будет. Я говорю, что это иллюзия.

14 минут назад, blackfin сказал:

индусы пишут кривые IP Cores

То, что энтерпрайздный код местами, мягко говоря, далёк от совершенства, никто, надеюсь, спорить не будет. Что софт (привет Некрософту), что хард (привет Интелу).

Безотносительно индусов и кривизны корок, Верилог просто провоцирует на написание такого говнокода, который на VHDL в принципе невозможен. Аргументы против Верилога я уже тут приводил, повторяться неохота. Нравится стрелять себе по ногам из гранотомёта -- ну удачи.

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


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

14 minutes ago, andrew_b said:

Вы поднимите глаза на первое сообщение на этой странице. Там нам заявляют, что верилог хорош уж тем, что надо букавок меньше писать. И из-за этого якобы меньше ошибок будет. Я говорю, что это иллюзия.

Я с этим и не спорил. Я лишь подчеркнул, что длина кода это не единственный аргумент в споре.

Суровая реальность состоит в том, что если хочется использовать готовые IP Cores от вендора, то вам никуда не уйти от изучения Verilog'а.

Ибо готовые тестбенчи, примеры готовых проектов с этими IP Cores и все мануалы на эти IP Cores, всё это Xilinx дает на языке Verilog.

А написать криво и быстро можно на любом языке. Даже здесь, на форуме, многие не могут написать без ошибок и двух слов на языке, на котором пишут и говорят уже практически всю жизнь. ))

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


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

Все мы читаем как verilog так и  vhdl

Кому то удобнее писать на verilog  или на vhdl и как говориться на вкус и цвет товарищей нет.

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

Мне удобнее писать на vhdl потому что мне нравиться строгая типизация и на уровне проверки ошибок убираются многие опечатки (например я не смогу соеденить шины разной разрядности).

Не для спора...

13 hours ago, blackfin said:

Да, это сильный аргумент, чтобы переписать индусские написать свои IP Cores для 25/50/100G Ethernet'а на VHDL.


А свои IP Cores для PCIe Gen3/Gen4 вы уже на VHDL написали?

 

А как насчет IP Cores для DDR3/DDR4 ? У вас тоже всё своё и на VHDL ?

Вы работали с 10g от интел/альтера?

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


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

1 hour ago, Maverick_ said:

Вы работали с 10g от интел/альтера?

Нет, с 10G от Интела не работал. Но читал мануалы Альтеры на их IP Core для 10G.

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


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

1 minute ago, blackfin said:

Нет, с 10G от Интела не работал. Но читал манулы Альтеры на их IP Core для 10G.

Жаль ... У меня просто одна корка работает супер. Добавляю вторую корку (копия первой)  которая работает паралельно с первой то вторая переодически теряет линк.

Почему не могу понять....

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


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

01.07.2021 в 00:37, Maverick_ сказал:

спорно (выделил жирным) это особенно если брать обработку данных в 32 бита и выше... :) и делать описание схемы с помощью языка HDL. Стараться не использовать готовые IP core производителя для обеспечения переносимости код

Приведу пример на основе 64 битного счетчика

Так сказать "Новороченный" счетчик:


library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity PipelinedCounter is
    generic (
        width_g: natural := 64; -- Must be divisible by parts_g.
        parts_g: natural := 4
    );
    
    port (
        clk:            in std_logic;
        rst:          in std_logic;
        
        clear:          in std_logic;
        enable:         in std_logic;
        
        count:          out std_logic_vector(width_g - 1 downto 0);
        tick:           out std_logic
    );
end entity;

architecture rtl of PipelinedCounter is
    constant part_width_c:      natural := width_g / parts_g;
    signal almost_tick_r:       std_logic_vector(parts_g - 1 downto 0);
    signal count_r:             std_logic_vector(width_g - 1 downto 0);
begin
    count <= count_r;

    process (all)
        variable part_v:        unsigned(part_width_c - 1 downto 0);
        variable tick_v:        std_logic;
    begin
        if rst = '1' then
            count_r <= (others => '0');
            almost_tick_r <= (others => '0');
            tick <= '0';
        elsif rising_edge(clk) then
            
            tick_v := enable;
            for i in 0 to parts_g - 1 loop
                part_v := unsigned(count_r((i + 1) * part_width_c - 1 downto i * part_width_c));
                
                if tick_v = '1' then
                    -- Value is max - 1?
                    if part_v = to_unsigned(2**part_width_c - 2, part_width_c) then
                        almost_tick_r(i) <= '1';
                    else
                        almost_tick_r(i) <= '0';
                    end if;
                
                    part_v := part_v + 1;
                end if;
                
                count_r((i + 1) * part_width_c - 1 downto i * part_width_c) <=
                    std_logic_vector(part_v);
                
                tick_v := tick_v and almost_tick_r(i);
            end loop;
            tick <= tick_v;
            
            if clear = '1' then
                count_r <= (others => '0');
                almost_tick_r <= (others => '0');
                tick <= '0';
            end if;
        end if;
    end process;
end architecture;

и тот же счечик описанный стандартно:


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity PipelinedCounter is
    Port ( clk : in std_logic;
           en : in std_logic;
           rst : in std_logic;
           count : out std_logic_vector(63  downto 0));
end PipelinedCounter;

architecture behavioral of PipelinedCounter is
signal cnt: std_logic_vector (63  downto 0):= (others => '0');
begin 
pr_d_e: process (clk, en, cnt, rst)
begin
if (rst = '0') then
cnt <= (others => '0');
elsif (clk'event and clk = '1') then
if (en = '1') then
cnt <= cnt + "0000000000000000000000000000000000000000000000000000000000000001";
end if;
end if;
count <= cnt;
end process pr_d_e;
end behavioral;

обычный счетчик дает

image.thumb.png.47fbdf022dc694896e9bd266e5191790.png

так сказать "Новороченный" счетчик

image.thumb.png.a7cf790fc5aedf1f4318b09999431057.png

 

PS Не для халивара. Это мое личное мнение/опыт. Все выше мною сказанное касается только если не использовать готовые IP core производителя, а стараться самому описать все вычислительные блоки на HDL, чтобы была переносимость.

 

 

 

1. Это не серьезно. 

2. Вот в таких случаях и нужно знать особенности ПЛИС.

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


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

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

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

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

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

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

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

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

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

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