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

Автоматический сброс на System Verilog

Добрый день!

Являюсь новичком в Verilog и SV. До этого только подключал ip блоки к проекту, используя SV и писал простенькие testbench.

Возникли трудности в банальном описании сброса. Внешний сброс приходит с процессора, доступ к которому сейчас не имею. Хочу проверить работоспособность "железа" путем автоматического сброса - допустим после 100 клоков сигнал reset переходит из 0 в 1 и далее никак не изменяется.

Первая идея была использовать счетчик, который, досчитывая до 100, ставит сигнал reset в 1. Но, этот счетчик со временем обнулится, и сброс произойдет снова, что мне не подходит.

Вопрос: возможно ли синтезировать данный сброс или надо искать другой путь?

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


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

вам железе или в симуляции?

потому что в симуляции просто делаются

reset = 0;

#100;

reset = 1;

 

где #100 - задержка в 100 ваших единиц, нсек обычно.

 

если в железе то что вам мешает счетчик остановить:)?

 

if(counter < 100)
  begin
    reset_n <= 1'b0;
    counter <= counter + 1'b1;
  end
else
  reset_n <= 1'b1;

 

 

досчитает до 100, поднимет ресет и встанет, начальное значение надо только не забыть не во всех платформах оно 0 по умолчанию

 

 

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


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

Хочу проверить работоспособность "железа" путем автоматического сброса - допустим после 100 клоков сигнал reset переходит из 0 в 1 и далее никак не изменяется.

Если нужна симуляция сброса можно попробовать такой вариант:

integer i;
initial
    begin
        reset = 0;
        for(i = 0; i < 100; i = i+1)
            @(posedge clk);            
        reset = 1;
    end

После 100 клоков reset навсегда перейдет в 1.

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


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

module reset_modul ( clk ,reset );
output reset;
wire reset;
input clk;
wire clk;    
reg [15:0] a=16'b0110000000000000;
always @(posedge clk)    a<=a>>1;
    assign reset=a[0];
endmodule

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


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

Всем привет, подниму тему.

Написал модуль сброса:

module StartUp (
	input clk,
	output wire reset );
	
	reg [4 : 0] delay;

	assign reset = !delay[4];
	always @(posedge clk) if (reset) delay <= delay + 1;

endmodule

При старте должен выдавать положительный на выход и позже сбрасывается в 0.

Этот модуль не работает, синтезатор пишет:

@N: CL189 :"D:\Dropbox\Sources\Codes\Libraries\Verilog\StartUp.v":8:1:8:6|Register bit delay[4] is always 1.
@N: CL159 :"D:\Dropbox\Sources\Codes\Libraries\Verilog\StartUp.v":2:7:2:9|Input clk is unused.

Подскажите почему не работает?

Спасибо.

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


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

13 минут назад, RadiatoR сказал:

Подскажите почему не работает?

вам же написали - когда delay[4]=1 , тогда reset = 0 и ветка с клоком не работает никогда, наверное по этому синтезатор выкинул эти неиспользуемые вещи.

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


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

22 минуты назад, RadiatoR сказал:

Всем привет, подниму тему.

Написал модуль сброса:


module StartUp (
	input clk,
	output wire reset );
	
	reg [4 : 0] delay;

	assign reset = !delay[4];
	always @(posedge clk) if (reset) delay <= delay + 1;

endmodule

 

Подскажите почему не работает?

 

Ну и при этом не факт, что регистр delay по исходному равен нулю... Такое может быть при загрузке ПЛИС, но может и не быть... 

При этом, вы хотите, чтобы модуль сработал только один раз после включения. Т.е. при холодном старте. А вот потом, в процессе работы кто-то захочет перезапустить устройство. Т.е. сделать горячий старт. Но увы, здесь как говорится "но пасаран"! 

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


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

7 minutes ago, iosifk said:

А вот потом, в процессе работы кто-то захочет перезапустить устройство.

Ножка ресет у меня выведена. Мне приходится каждый раз тыкать кнопку (это пока всего лишь отладка) чтобы всё завести.

Я ожидаю, что delay[4], как и весь delay будет на старте равен 0. Возможно я ошибаюсь и это не так. Собственно я оцениваю по отладочным светодиодам. У меня их 16 штук и все они assigned к разным регистрам. И все они после конфигурации фпга не горят, из чего я делаю вывод, что после конфигурации все регистры в 0.

В топе у меня сделано так:

	wire initReset, reset;
	StartUp startup(.clk(clk), .reset(initReset));
	assign reset = initReset | rst;

rst - это внешний ресет

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

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


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

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

Ножка ресет у меня выведена. Мне приходится каждый раз тыкать кнопку (это пока всего лишь отладка) чтобы всё завести.

Я ожидаю, что delay[4], как и весь delay будет на старте равен 0. Возможно я ошибаюсь и это не так. Собственно я оцениваю по отладочным светодиодам. У меня их 16 штук и все они assigned к разным регистрам. И все они после конфигурации фпга не горят, из чего я делаю вывод, что после конфигурации все регистры в 0.

Сложно то как! Светодиоды? Это примерно как записку для похода в магазин высекать на каменной плите и потом тащить ее на горбу с собой... А как проекты побольше будут? А как компилятор линии к светодиодам проложит? Сейчас - так, а в следующей итерации проекта - по другому... И тогда - "вот только что работало, час назад, а как начальник пришел - перестало"... А симулятор для чего сделан? 

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


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

16 minutes ago, iosifk said:

А как проекты побольше будут?

С fpga я столкнулся не по основному направлению. За исключением текущего проекта на ~70LE имею на нее виды только в рамках хобби.

16 minutes ago, iosifk said:

А как компилятор линии к светодиодам проложит?

Не понял этот момент. Как внешний ресет, который создается также как и линии во время конфигурации как-то влияет на саму конфигурацию?

 

16 minutes ago, iosifk said:

А симулятор для чего сделан?

ModelSim (использовал только его) без принудительного ресета через initial не знает начального состояния регистров и не симулирует. Это логично, я понимаю.

На самом деле код у меня не сложный. Особо с проблемами я не сталкиваюсь и пишу с первого раза. Не комильфо, не в рамках стандартной парадигмы разработки, понимаю, но если сталкиваюсь с проблемами - они либо для меня понятны и симулятор не требуется, либо симулятор не помогает. Как и произошло сейчас (без initial блока не пройдет симуляция).

 

А в этом проекте я использую lattice с внутренним hard SPI блоком. Мне нечего скормить ModelSim в качестве описания этого SPI, вот и использовал для отладки светодиоды. К слову с SPI я разобрался.

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


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

PS упрощу вопрос: на практике есть решение с внутренним стартовым сбросом или же это решается внешними средствами?

Спасибо.

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


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

1 minute ago, RadiatoR said:

PS упрощу вопрос: на практике есть решение с внутренним стартовым сбросом или же это решается внешними средствами?

Спасибо.

Смотря что вы имеете в виду.

Практически все supervisor'ы со счётчиками внутри не имеют наружного сигнала сброса, и сбрасываются при подаче питания.

Многие микроконтроллеры имеют несколько источников сброса: PowerUp Reset, сброс c помощью  внешнего вывода RST (который может быть отключён, и больше не будет выполнять Power-Up Clear, а будет генерировать лишь прерывание). А также возможности программного сброса, который тоже настраивается либо на PowerUp Clear либо на простое направление счётчика программ на вектор сброса.

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


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

RadiatoR,

Можно глупый вопрос?

Вот так не пробовали:

reg [4 : 0] delay = 4'b0000;

?

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


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

С ресетом мк я знаком. С ними проще - железо детерминировано и цепи сброса сформированы. А с фпга как? Такое решение (внутреннее) мне не попадалось. Вот и задался написать...

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


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

9 минут назад, RadiatoR сказал:

PS упрощу вопрос: на практике есть решение с внутренним стартовым сбросом или же это решается внешними средствами?

Все зависит от разработки. 

Скажем домофон "завис", ну так плюнули, начали в дверь стучать...

Или другой вариант - висит контроллер связи и периферия, которая от него работает не доступна. Вот тогда микроконтроллер может подать сигнал на сброс и повторную программную инициализацию.  

Я же написал "холодный сброс" и "горячий сброс". 

А что касается " нечего скормить ModelSim в качестве описания этого SPI", то на несинтезируемых конструкциях имитатор SPI делается за 10 мин. Хотя я уверен, что модель SPI производитель предоставляет. Ведь даже изготовители микросхем памяти дают модели памяти для совместной симуляции проекта.

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


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

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

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

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

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

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

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

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

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

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