реклама на сайте
подробности

 
 
> ModelSim, вопросы новичка
Sprite
сообщение May 18 2018, 11:26
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



Доброго всем времени суток!

Решил отложить стандартный квартус-симулятор и изучить ModelSim. Отлаживаю модуль SPI, но картинка не та, которую я вижу в квартус-симуляторе, сигналы addr, data, miso в неопределенном состоянии. В чем может быть дело? Не заданы начальные условия или код модуля кривой? Картинка такая:



Исходный файл и тестбенч к нему во вложении. Заранее спасибо.
Прикрепленный файл  SPI_slave2.v ( 4.49 килобайт ) Кол-во скачиваний: 31
Прикрепленный файл  SPI_slave2_tb.v ( 1.15 килобайт ) Кол-во скачиваний: 36


Сообщение отредактировал Sprite - May 18 2018, 11:27
Go to the top of the page
 
+Quote Post
5 страниц V  « < 2 3 4 5 >  
Start new topic
Ответов (45 - 59)
iosifk
сообщение May 23 2018, 07:10
Сообщение #46


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Sprite @ May 22 2018, 18:54) *
Конечно не в каждом, но зачем лишние заморочки? Данные передаются с начала процесса одной колбасой по SPI, каждое слово ложится в RAM по конкретному адресу и далее используется отдельными блоками (автоматими). Зачем здесь арбитр и дополнительная синхронизация автоматов по выборке данных из одного большого RAM-блока?

То, что "проще" для Вас, совсем не проще для ПЛИС... На 16х16 битов данных необходимо задействовать столько же интерконнектов. И это самый дорогой ресурс в ПЛИС.
И, кстати не говорилось о том, с какой скоростью идет обработка данных. Говорилось о 25 Мгц от АЦП и 100 Мгц тактовой. А сколько тактов в автомате и в скольки тактах он пользуется данными из памяти? И всегда ли арбитр будет задерживать автоматы, если запрос на доступ подать на 1 такт раньше, чтобы ссработал арбитр?
И, кстати, компилятор совершенно прав, когда пытается вместо блочной памяти, применить триггера. Потому как ко входам триггеров идет одна шина в 16 бит, а сами триггера можно разместить в любом месте кристалла. А вот блочная память сидит в центре кристалла и от нее надо гнать 16х16 проводов...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Sprite
сообщение May 23 2018, 11:49
Сообщение #47


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



Flip-fl0p, Иосиф Григорьевич спасибо! Подумаю над Вашим вариантом, сейчас другая проблема возникла - не хочет запускаться pll clock. Делал так:
1. Сгенерил мегавизардом компонент pll с коэффициентом умножения 6. Один клок на входе и один на выходе.
2. Выкинул все из проекта, кроме pll.
3. Скопировал файл altera_mf.v и добавил его в компиляцию (без него ModelSim не может найти altpll).



Нажимаю на "ТЫЦ" - все собирается, проходит компиляция файлов и тестбенча, но выдается ошибка:
Код
** Error: (vsim-3601) Iteration limit reached at time 0 ns.

Сам "ТЫЦ.bat" и файлы проекта во вложении. Отладку провожу в ModelSim 10.3d.

Прошу прощения, нашел ошибку: в строке макроса было задано слишком малое время симуляции:
Код
vsim -t 1ns tb

Прикрепленные файлы
Прикрепленный файл  project.rar ( 192 килобайт ) Кол-во скачиваний: 2
 
Go to the top of the page
 
+Quote Post
nice_vladi
сообщение May 23 2018, 11:51
Сообщение #48


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 7-09-16
Из: Томск
Пользователь №: 93 239



Цитата(Sprite @ May 23 2018, 11:01) *
[b]
Код
** Error: (vsim-3601) Iteration limit reached at time 0 ns.


Это modelsim достигает предела итераций моделирования. Из-за того, что в core PLL много подмодулей, и они довольно крупные и для симуляции каждого требуется куча операций. Вот он и наедается. Можно покрутить параметр лимита операций в настройка сабжа, но лучше при моделировании не использовать PLL, а описывать клоки несинтезируемыми конструкциями языка (ИМХО).
Т.е.:
Для симуляции используете "искусственные" клоки;
Для синтеза - корку Альтеры;

Совсем хорошо будет отбить дефайнами эти области, что бы вручную не комментить каждый раз.
Go to the top of the page
 
+Quote Post
OM-S
сообщение May 23 2018, 11:59
Сообщение #49


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 12-05-05
Из: г. Москва
Пользователь №: 4 944



В tb.v поставьте начальное значение для регистра clk, иначе инверсия неизвестного значения даст неизвестное значение

Не могу запустить ваш пример и проверить, но в в macros.do наверно нужно указать симуляцию с разрешением 1ps.(строка 4 vsim -t 1ps tb).
Pll обычно симулируются с пикосекундными разрешениями.

Сообщение отредактировал OM-S - May 23 2018, 12:15
Go to the top of the page
 
+Quote Post
Sprite
сообщение May 23 2018, 12:24
Сообщение #50


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



Цитата(OM-S @ May 23 2018, 18:59) *
В tb.v поставьте начальное значение для регистра clk, иначе инверсия неизвестного значения даст неизвестное значение

Спасибо! Исправил. Теперь другая проблема: клок вместо умножения начал делиться)



Тестбенч:
Код
`timescale 1ps / 1ps

`include "altera_mf.v"
`include "main.v"
`include "pll.v"

module tb;
    reg clk;
    wire clk_108MHz;
    
    main main_tb(
        .clk(clk),
        .clk_108MHz(clk_108MHz));
    
    always
        #5 clk = !clk;

    initial
    begin
        clk = 0;
        #10000;    
        $stop;
    end
    
endmodule


Макрос запуска:
Код
transcript on
vlib work
vlog -sv tb.v
vsim -t 1ps tb
add wave /*
quietly radix unsigned
configure wave -timelineunits ns
run -all
wave zoom full


Причем если в тестбенче явно указываю время, т.е. вместо #5 ставлю #5ns и вместо #10000 ставлю #10000ns - то все работает. В чем проблема?
nice_vladi, похоже Вы правы - для симуляции проще использовать искусственные клоки. По крайней мере один железный плюс я здесь вижу - размер проекта меньше (не включаются файлы типа altera_mf.v и т.д.) Насколько такой подход правильный - не знаю.


Сообщение отредактировал Sprite - May 23 2018, 12:35
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение May 23 2018, 12:38
Сообщение #51


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 646
Регистрация: 15-07-06
Из: г.Донецк ДНР
Пользователь №: 18 832



Что-то у вас входной клок дюже быстро клацает для 18 МГц...
Go to the top of the page
 
+Quote Post
Sprite
сообщение May 23 2018, 13:20
Сообщение #52


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



Цитата(_Anatoliy @ May 23 2018, 19:38) *
Что-то у вас входной клок дюже быстро клацает для 18 МГц...

Это потому что я в тестбенче указываю задержку в тактах, а не в реальном времени, а в качестве величины такта система, как я понимаю, принимает минимальный timescale из всех модулей проекта, в данном случае как правильно заметил OM-S - это pll.

По совету nice_vladi задефайнил все, что касается pll. Теперь при симуляции в modelsim если дефайн активен - то pll волшебным образом исчезает из схемы)). Получилось довольно красиво и главное работает! biggrin.gif

Сообщение отредактировал Sprite - May 23 2018, 13:20
Go to the top of the page
 
+Quote Post
Sprite
сообщение May 25 2018, 13:34
Сообщение #53


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



Добрый день всем!
Еще один нубский вопрос:
Решил промоделировать конечный автомат, но сигнал на выходе (out) в ModelSim отображает как "X", хотя в квартус-симуляторе моделируется все нормально.
Если файлы (конечный автомат и тестбенч) добавлять в ModelSim вручную и - то тоже нормально все, сигнал out отображается так как планировалось. Делаю вывод - дело в макросе.
Конечный автомат:
Код
module generator
(
    input    clk,
    input     ena,
    output reg out
);
    wire     pulse;
    reg     [15:0]    cnt_val = 16'd0;
    reg     [15:0]    cnt_comp_val = 16'hFFFF;
    reg        [1:0]    state = 2'b00;
    parameter S0 = 0, S1 = 1, S2 = 2, S3 = 3;

    reg     [15:0]    comp_val[3:0];
    initial
    begin
        comp_val[0] = 16'd4;
        comp_val[1] = 16'd5;
        comp_val[2] = 16'd6;
        comp_val[3] = 16'd7;
    end

    //----------------------------------------
    always @ (state) begin
        case (state)
            S0:
            begin
                cnt_comp_val = comp_val[0];
                out = 1;
            end
            S1:
            begin
                cnt_comp_val = comp_val[1];
                out = 0;
            end
            S2:
            begin
                cnt_comp_val = comp_val[2];
                out = 1;
            end
            S3:
            begin
                cnt_comp_val = comp_val[3];
                out = 0;
            end
            default:
            begin
                cnt_comp_val = 16'hFFFF;
                out = 0;
            end            
        endcase
    end

    //----------------------------------------    
    always @ (posedge clk)
    begin
        if (!ena)
            state <= S0;
        else
            case (state)
                S0:    state <= pulse? S1:S0;
                S1:    state <= pulse? S2:S1;
                S2:    state <= pulse? S3:S2;
                S3:    state <= pulse? S0:S3;
                default: state <= S0;
            endcase
    end

    //----------------------------------------
    always @(posedge clk)
    begin
        if(ena)
            if(cnt_val==cnt_comp_val)
                cnt_val = 4'b1;
            else
                cnt_val = cnt_val + 1'd1;
        else
            cnt_val = 4'd1;
    end    
    assign pulse = (cnt_val==cnt_comp_val);
    //----------------------------------------        
endmodule


Тестбенч к нему:
Код
`timescale 1ns / 1ns
`include "generator.v"

module tb;
    reg clk;
    reg ena;
    wire out;
    
    generator     generator1(.clk(clk), .ena(ena), .out(out));

    always #1 clk = ~clk;
    initial
    begin
        clk = 0;
        ena = 0;
        #100;
        ena = 1;
        #1000;
        $stop;
    end
    
endmodule


Макрос:
Код
#transcript on
vlib work
vlog -sv tb.v
vsim -t 1ns tb
add wave /tb/*
add wave /tb/generator1/*

#quietly radix unsigned
configure wave -timelineunits ns
run -all
wave zoom full

И картина на выходе (если запускать с помощью макроса):


Что делаю не так - ума не приложу. Вроде бы объявлены начальные состояния регистров. Что это? Глюк ModelSim? Пробовал в 10.3d и в 6.5 - результат один и тот же(
Go to the top of the page
 
+Quote Post
iosifk
сообщение May 25 2018, 14:19
Сообщение #54


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Sprite @ May 25 2018, 16:34) *
Добрый день всем!
Еще один нубский вопрос:
....

Что делаю не так - ума не приложу. Вроде бы объявлены начальные состояния регистров. Что это? Глюк ModelSim? Пробовал в 10.3d и в 6.5 - результат один и тот же(

Мой опыт работы в техподдержке говорит, что если пользователь сначала делает что-то не по шаблону, а как-то по своему, то потом у него появляется богатая возможность для "преодоления", для "трудового подвига", для "порыва души"... Это к стилю описания автомата...
Вот не согласились же Вы узнать, что есть общего у одноглазого бога викингов, у сигналов паритета, у девушки и у симулятора. А если бы знали это, то моментально бы и причину нашли... А это - к "красному" сигналу "out"...
Вот какие дела...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Nieve
сообщение May 25 2018, 15:14
Сообщение #55





Группа: Участник
Сообщений: 13
Регистрация: 29-04-18
Из: Москва
Пользователь №: 103 558



1. У вас в схеме нет сигнала "reset", рекомендуется его сипользовать для начальной инициализации.
2. Не рекомендую вносить в список чувствительности текущее состояние FSM.
3. В модуле "generator", сигнал "out" задан как "output reg", а в модуле "tb" как "wire".
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение May 25 2018, 15:50
Сообщение #56


В поисках себя...
****

Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140



Цитата(Sprite @ May 25 2018, 16:34) *
Что делаю не так - ума не приложу. Вроде бы объявлены начальные состояния регистров. Что это? Глюк ModelSim? Пробовал в 10.3d и в 6.5 - результат один и тот же(

Вот странный Вы человек. Вам же говорили как лучше начинать делать правильно тем кто только встал на путь изучения HDL. https://electronix.ru/forum/index.php?showtopic=146965 Но Вы упорно продолжаете делать по-своему.
Вот я смотрю Вы в прошлой теме описали несчастный счетчик. Теперь Вы описываете счетчик ещё раз. А не проще было создать один отдельный файл счетчика. Добавить необходимые параметры, отладить, и больше к нему не возвращаться ? Таким образом Вы упростите следующие проекты, т.к исключите место где потенциально можно допустить ошибку. А если у Вас будет проект где используется десяток счетчиков, десяток FSM и куча всего ? Как тогда Вы будете все это отлаживать ?
Go to the top of the page
 
+Quote Post
Sprite
сообщение May 25 2018, 16:41
Сообщение #57


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



Цитата(Nieve @ May 25 2018, 22:14) *
1. У вас в схеме нет сигнала "reset", рекомендуется его сипользовать для начальной инициализации.
2. Не рекомендую вносить в список чувствительности текущее состояние FSM.
3. В модуле "generator", сигнал "out" задан как "output reg", а в модуле "tb" как "wire".

1. Не люблю reset. Предпочитаю задавать начальные значения регистрам при их объявлении или в секции initial
2. Не совсем понимаю Вас. Работать только по clk? Пример state-машины брал из шаблона verilog.
3. Модуль tb - это тестбенч. В них если я правильно понимаю выходные сигналы объявляются как wire.

Иосиф Григорьевич, за Вашей мыслю так и не угнался) Слишком уж она сложная и мудреная, а настроения ребусы разгадывать нет.

Цитата
Вот странный Вы человек. Вам же говорили как лучше начинать делать правильно тем кто только встал на путь изучения HDL. https://electronix.ru/forum/index.php?showtopic=146965 Но Вы упорно продолжаете делать по-своему.

Не только странный, но и упрямый - это Вы верно заметили) За наводку на мысль спасибо! Мысль: проблема в описании стейт-машины.

Цитата(Flip-fl0p @ May 25 2018, 22:50) *
Вот я смотрю Вы в прошлой теме описали несчастный счетчик.

Ниче он не несчастный! Счетчик как счетчик - все по фэншую. Или проблема в том, что он находится в одном файле с автоматом? Так это просто пример, код еще будет причесываться и дорабатываться.
Go to the top of the page
 
+Quote Post
Nieve
сообщение May 25 2018, 17:01
Сообщение #58





Группа: Участник
Сообщений: 13
Регистрация: 29-04-18
Из: Москва
Пользователь №: 103 558



1. В таком случае как быть если схема зависла и необходимо ее сбросить? Или необходимо задать другие значения? В таком случае сначала "подать" сброс, а затем, по сигналу загрузки, записать входные данные.
2. Шаблон FSM не всегда является универсальным. Рекомендую использовать FSM "по clk" либо комбинационной логикой " @(*) ".
3. Я о другом. В модуле "generator" выходные сигналы делайте "wire-ми", чтобы могли их связывать с другими модулями (например верними уровнями) или для того, чтобы вывести этот сигнал на ножку ПЛИС и снять значения с "осцила".

Сообщение отредактировал Nieve - May 25 2018, 17:05
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение May 25 2018, 18:19
Сообщение #59


В поисках себя...
****

Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140



Цитата(Sprite @ May 25 2018, 19:41) *
Ниче он не несчастный! Счетчик как счетчик - все по фэншую. Или проблема в том, что он находится в одном файле с автоматом? Так это просто пример, код еще будет причесываться и дорабатываться.

Смысл в том, что зачем описывать ещё раз то, что уже было когда то описано ? Это опять тратить время надо. Опять проверять счетчик надо. Да и схема выглядит в итоге некрасивой, и запутанной.
Вот представьте: у вас есть некий блок, где применяется несколько счетчиков, несколько регистров сдвига и автомат.
В случае если Вы пишете "все в одном" то при тестировании Вам приходится проверять автомат. А ещё придется проверять правильность работы счетчиков и регистров сдвига.
Безусловно, счетчик штука простая, и шансов допустить ошибку мало. Тем не менее ошибку допустить можно и она скорее всего будет laughing.gif . И Вам придется тратить время на проверку, выискивание этой ошибки.
А если бы счетчик был отдельным файлом, который уже протестирован и гарантированно работает, то нет необходимости тратить время на его проверку. Поскольку неправильная работа счетчика говорит лишь о том, что им неправильно управляют.

А ещё счетчик можно сделать универсальным и параметрами настраивать:
1. Направление счета: вверх или вниз.
2. Максимальное значение счета.
3. Будет ли счетчик обновляться при переполнении, или останется в максимальном значении.
4. Можно добавить режим Debug и выводить состояния счетчика на консоль.
Я от такого подхода вижу только преимущества - ускорение разработки, упрощение тестирования, уменьшение риска совершить ошибку.
Да и код становится более понятным. Проще поддерживать его.
Но как поступать - решать Вам. Я все карты раскрыл beer.gif
Go to the top of the page
 
+Quote Post
iosifk
сообщение May 25 2018, 18:35
Сообщение #60


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Sprite @ May 25 2018, 19:41) *
Иосиф Григорьевич, за Вашей мыслю так и не угнался) Слишком уж она сложная и мудреная, а настроения ребусы разгадывать нет.
Не только странный, но и упрямый - это Вы верно заметили) Мысль: проблема в описании стейт-машины.
Ниче он не несчастный! Счетчик как счетчик - все по фэншую. Или проблема в том, что он находится в одном файле с автоматом? Так это просто пример, код еще будет причесываться и дорабатываться.


так вот...
Одноглазого бога звали Один. Именно поэтому мы говорим: один, два, три...
И бит нечетности называется одд, тоже в честь него.
А вот бит четности назван в честь Евы, потому как она дополнила Адама до четного. И для Адама это было большое событие, которые некоторые называют ивент. И именно по ивнтам срабатывает симулятор. А сигнал out у Вас переключается по какому событию?
А вот оно:
always @ (state) begin
case (state)
S0:
begin
cnt_comp_val = comp_val[0];
out = 1;
end........

А переключается ли state???
Смотрим картинку и видим, что? Не переключается state, ни разу... А значит, если не выполняется always, то и до case дело ни разу не доходило.. Так с чего бы выполнилось вот это: out = 1??? Ведь этот out нигде больше не встречается... А почему? Да потому что некоторые маршируют по-Суворовски, через Альпы и при этом заявляют, что "Не люблю reset"... И все в таком же духе...
А когда весь проект в один прекрасный момент раком встанет, то кого любить будете? Или только перезагружаться? И как тогда будете отлаживать железо?


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post

5 страниц V  « < 2 3 4 5 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 10th July 2025 - 13:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01553 секунд с 7
ELECTRONIX ©2004-2016