Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программируемая логика: ПЛИС, ПАИС
Войти
Регистрация
Восстановить пароль
 
ctakah3112
1 / 1 / 0
Регистрация: 26.10.2014
Сообщений: 72
1

Нестабильная работа проекта на VHDL

31.07.2018, 18:54. Просмотров 187. Ответов 6

Добрый день всем!

Управляю контроллером WizNet W5100 с помощью ПЛИС Xilinx, пишу код управления на VHDL в среде Xilinx Vivado 2017.4. Обмениваюсь данными между ПК и блочной памятью ПЛИС с помощью UDP протокола через этот WizNet.

Иногда проект работает как надо, обмен идет стабильный с нужной скоростью. Но иногда, после очередной компиляции, даже без существенных изменений в проекте, обмен не протягивает и пары секунд. На диаграмме приведен момент, когда проект впадает в ступор.
Код на VHDL:
Кликните здесь для просмотра всего текста

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
architecture Behavioral of WModule is
 
    shared VARIABLE step : integer range 1 to 65535 := 1;
    shared variable cnt : integer := 0;
    signal test_sign : std_logic := '0';
    signal error_sign : std_logic := '0';
    CONSTANT Active: std_logic := '0';
    CONSTANT Inactive: std_logic := '1';
    shared variable IND_AINC_data_MR : std_logic_vector(7 downto 0) := x"03";
    
    p1: process (clk, reset) is
    procedure Write_MR (variable cnt: inout integer;
                        variable ddata: in std_logic_vector(7 downto 0)) is 
    begin
        case cnt is
            when (1) => 
                A1 <= '0';
                A0 <= '0';
                Data <= ddata;
                                nCS <= Active;
                nWR <= Active;
            when (2) =>
                nWR <= Inactive;
                nCS <= Inactive;
            when (3) =>
                cnt := 0;
                step := step + 1;
            when others =>
                error_sign <= '1';
        end case;
    end procedure;
    
    begin--начало процесса p1
    
    if (reset = '1') then
        step := 100;
        test_sign <= '0';
    elsif (rising_edge(clk)) then
        if (nINT = '1') then
            --perform copying of data
            test_sign <= '0';
        else 
            if (step = 100) then
                cnt := cnt + 1;
                Write_MR(cnt, IND_AINC_data_MR); --write into common register
            elsif (step = 101) =>
                cnt := cnt + 1;
                -- ... 
            end if;
            test_sign <= '1';
                end if;
        end if;
    end process p1; 
end Behavioral;


У меня нет сомнений, что я нахожусь именно в этой части кода, я тщательно всё проверил. Но на диаграмме видно, что происходят странные вещи - переменная cnt не обнуляется после cnt = 2, переменная step не инкрементируется. При этом сигналы А1 и А0, data, test_sign встают в правильные значения, но WR_sign - нет, а спустя какое-то время вываливается error_sign.

Откуда берутся такие аномалии? Хочется иметь стабильный обмен при каждой компиляции, а не через раз.
Спасибо

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Миниатюры
Нестабильная работа проекта на VHDL  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2018, 18:54
Ответы с готовыми решениями:

Являются ли корректные временные диаграммы проекта VHDL гарантом того, что на железе всё так и будет работать?
Собственно, в этом и вопрос. У меня есть проект, в котором согласно временным...

Нестабильная работа загрузчика PinBoard 1.1
Понимаю что наверное фантастику сейчас скажу но с чем может быть связана...

VHDL
для моделирование использую Active-HDL, и возникла такая проблема, нужно...

Тестбенчи на VHDL
Может посоветует кто-нибудь какую-нибудь книжку, где можно почерпнуть советы по...

Задание на VHDL
К плис подключены 6 светодиодов , каждый имеет свой выход, переключать их в...

6
Caruso
30 / 30 / 3
Регистрация: 22.03.2010
Сообщений: 106
01.08.2018, 09:54 2
А на картинке временное или функциональное моделирование?
0
ctakah3112
1 / 1 / 0
Регистрация: 26.10.2014
Сообщений: 72
01.08.2018, 10:16  [ТС] 3
Цитата Сообщение от Caruso Посмотреть сообщение
А на картинке временное или функциональное моделирование?
Если я правильно понимаю термины, временное. Это на реальном железе после полной компиляции и разводки проекта
0
Caruso
30 / 30 / 3
Регистрация: 22.03.2010
Сообщений: 106
01.08.2018, 10:41 4
Первый фронт CLK: Write_MR(0, IND_AINC_data_MR)
Второй фронт CLK: Write_MR(1, IND_AINC_data_MR)
Третий фронт CLK: Write_MR(2, IND_AINC_data_MR)
четвертый фронт CLK: Write_MR(3, IND_AINC_data_MR)
пятый фронт CLK: не вызывается
шестой фронт CLK: Write_MR(1, IND_AINC_data_MR)
и т.д.

Зачем вам самый первый раз вызывать Write_MR c cnt=0.

Добавлено через 3 минуты
Если логическое моделирование (до компиляции) работает, а временное не стабильно работает, то это точно указывает на то что плис не успевает отрабатывать вашу схему. Надо делать временной анализ. Это делается средствами сапра в котором вы ведете проектирование. Вы делали временной анализ?

Добавлено через 9 минут
Могу еще посоветовать при появлении таких аномалий попробовать снизить тактовую частоту в несколько раз (2-5). Если ошибки пропадут, то это точно проблемы с времянкой.
0
ctakah3112
1 / 1 / 0
Регистрация: 26.10.2014
Сообщений: 72
01.08.2018, 10:43  [ТС] 5
Цитата Сообщение от Caruso Посмотреть сообщение
Вы делали временной анализ?
Нет, к сожалению с этим не знаком. Можно подробнее, как его делать? Это constraint-ы надо менять?
0
Caruso
30 / 30 / 3
Регистрация: 22.03.2010
Сообщений: 106
01.08.2018, 10:58 6
В VIVADO не знаю как это делать. Смысл такой, что вы задаете входную тактовую частоту ПЛИС, а САПР вам должен посчитать все временные задержки распространения сигналов внутри ПЛИС. Так вот эти временные задержки должны быть меньше одного периода тактовой частоты. Мое объяснение очень примитивно и на самом деле там все несколько сложнее, но суть примерно такая. Читайте документацию.
1
ctakah3112
1 / 1 / 0
Регистрация: 26.10.2014
Сообщений: 72
27.08.2018, 18:07  [ТС] 7
Проблема решена. Каждый сигнал, приходящий и выходящий из модуля, отвечающего за обмен, пришлось пропустить сквозь синхронный триггер задержки. Также сигналы внутри модуля были выведены на отладку:
Pascal
1
attribute mark_debug of source_adr_sign: signal is "TRUE";
Так вот подобный вывод позволительно было делать только для сигналов после этого триггера, то есть уже синхронных.
Теперь обмен работает сколь угодно долго без сбоев
0
27.08.2018, 18:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2018, 18:07

периоды vhdl
Здравствуйте, не могли бы вы подсказать как в поведенческом стиле задать...

VHDL. Мультиплексор
1.Описать на поведенческом VHDL двоичный дешифратор «1 из n» с входным портом...

VHDL. D-триггер
Помогите пожалуйста описать на VHDL D-триггер, который находится в Process_2. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru