Jump to content
    

Начальные значения

У меня сложилась такое понимание что все пытаются описать слона с завязанными глазами.

 

Сразу скажу про инициализацию. У Quartus II прописано всё четко он синтезирует согласно стандартам Verilog HDL and VHDL.

Так что если какой-то там синтезатор не следует стандартам это его проблемы.

 

Inferred Power-Up Levels

 

Quartus II Integrated Synthesis reads default values for registered signals defined in

Verilog HDL and VHDL code, and converts the default values into Power-Up Level

settings. The software also synthesizes variables with assigned values in Verilog HDL

initial blocks into power-up conditions. Synthesis of these default and initial

constructs allows synthesized behavior of your design to match, as closely as possible,

the power-up state of the HDL code during a functional simulation.

The following register declarations all set a power-up level of VCC or a logic value “1”,

as shown in Example 14–39:

Example 14–39.

signal q : std_logic = '1'; -- power-up to VCC

reg q = 1'b1; // power-up to VCC

 

reg q;

initial begin q = 1'b1; end // power-up to VCC

 

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

Зато если синтезатор частот должен включаться через ПЛИС, то надо делать свой ресет. Если мы делаем ASIC, то должны продумать ресет в виде гипервизора. Который будет встроен или будет внешнем устройством.

Один из вариантов создания гипервизора в виде счётчика.

 

 

Share this post


Link to post
Share on other sites

кстати насчет ПЛЛ

 

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

 

Вроде бы удачная схема, поудачнее счетчиков в коде грея вроде как?

Share this post


Link to post
Share on other sites

так как к тому времени как закночится программирование клок будет стабилизирован.

 

Откуда такая уверенность? Берем ПЛИС LFXP2-5E-5MN132C.

 

Flash Download Time (from On-Chip Flash to SRAM)
    min typ max
XP2-5 — 1.8 2.1 ms

 

Вы уверены, что всегда и любой осциллятор полностью выйдет на режим за 1.8 ms?

 

Вроде бы удачная схема, поудачнее счетчиков в коде грея вроде как?

 

Ну как сказать... В этом случае, скорее всего, PLL будет в режиме bypass, что вошло, то вышло, а сигнал LOCK всегда в 1. Если Вы заставите PLL работать в режиме именно PLL с клоком 1:1, то да, это вариант.

 

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

 

Чем не устраивает обычный счетчик, работающий от on-chip осциллятора ПЛИСы? Без всяких греев, гарантированно считающий с момента POR? Ничего не стОит, и 100% работает, и джиттер в клок не довносит.

Share this post


Link to post
Share on other sites

Чем не устраивает обычный счетчик, работающий от on-chip осциллятора ПЛИСы? Без всяких греев, гарантированно считающий с момента POR? Ничего не стОит, и 100% работает, и джиттер в клок не довносит.

Боюсь, что не устраивает тем, что для его использования придётся переползать под Латтис, так как больше ни у кого доступа к on-chip осциллятору, насколько я знаю, нет. А напрасно.

Share this post


Link to post
Share on other sites

ну и как план Б, пусть ПЛЛ делает 1 к 2 или как хочет. Использовать от него только сигнал клок стабилен, для разрешения запуска схемы, если нам дорог исходный мего качественный клок.

 

 

Share this post


Link to post
Share on other sites

так как больше ни у кого доступа к on-chip осциллятору, насколько я знаю, нет. А напрасно.

 

У Альтеры тоже без проблем осциллятор, мегафункция ALTINT_OSC. У xilinx у знающих людей надо спросить, или документацию перекопать... Там, вероятно, надо поставить STARTUP блок и взять GCLK с него. У латиса OSCE. В общем, есть у всех, нету в старых ПЛИС времен FLEX/ACEX

 

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

 

Я не уверен что то, что PLL залочилась от клока, есть гарантия того, что этот клок вошел в норму для питания всего клокового дерева... Однако счетчик от этой PLL считать уже обязан корректно - резет можно им сгенерировать, резету на джиттер наплевать. То есть на резет счетчика резета :) подать в качестве резета !LOCK :) и затактировать его от PLL. Но IMHO это все извращение против внутреннего осциллятора.

 

UPD: В таком случае еще можно получить нежданный резет, если по какой нибудь причине PLL вылетит из захвата во время работы на какое то время. При этом с клоком на ее выходе будет все в относительном порядке, но LOCK-ом она дернет.

Share this post


Link to post
Share on other sites

UPD: В таком случае еще можно получить нежданный резет, если по какой нибудь причине PLL вылетит из захвата во время работы на какое то время. При этом с клоком на ее выходе будет все в относительном порядке, но LOCK-ом она дернет.

 

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

 

а кстати вот такой вопрос, а вообще работать от внутреннего клока можно? То есть внешнего вообще ничего не ставить? Он медленный или потом выключается?

Share this post


Link to post
Share on other sites

а кстати вот такой вопрос, а вообще работать от внутреннего клока можно? То есть внешнего вообще ничего не ставить? Он медленный или потом выключается?

Для всей схемы смысла нет, внешний генератор копеечный по сравнению с FPGA, а если работать от внутреннего, придётся подрезать рабочие частоты в соответствии с разбросом частоты внутреннего осциллятора, а это порядка +-20%. Хотя я работаю иногда, но только при отладке, потому что плата тактируется от внешнего источника через разъём и всё это влом включать:).

Share this post


Link to post
Share on other sites

а кстати вот такой вопрос, а вообще работать от внутреннего клока можно? То есть внешнего вообще ничего не ставить? Он медленный или потом выключается?

 

Можно. Он включается сразу, от него же ведь ПЛИС загружает себя при старте. Он гарантировано работает все время, когда работает ПЛИС. Частоты... Ну тут я не знаю, у кого как, читайте даташиты... У LatticeXP2 выбор из вот таких значений: 2.5, 3.1, 4.3, 5.4, 6.9, 8.1, 9.2, 10, 13, 15, 20, 26, 32, 40, 54, 80, 163 МГц. Единственный недостаток этого клока, это низкая стабильность, +-30% от установленной частоты, он же RC-генератор. У Altera MAX-V, другой пример, там все проще. Частота не задается параметром, а фиксирована, и может быть 3.9–5.3 МГц (технологической разброс). У LatticeECP3 выбор частот тоже довольно широкий, но другой ряд - 2.5, 4.3, 5.4, 6.9, 8.1, 9.2, 10, 13, 15, 20, 26, 30, 34, 41, 45, 51, 55, 60, 130 МГц, но поточнее, +-15%. Но все равно, разброс плюс минус километр, по сравнению с 10-20ppm средепаршивого кварца. То есть, если такая точность частоты устраивает, то никаких проблем.

Share this post


Link to post
Share on other sites

У меня сложилась такое понимание что все пытаются описать слона с завязанными глазами.

 

Сразу скажу про инициализацию. У Quartus II прописано всё четко он синтезирует согласно стандартам Verilog HDL and VHDL.

Так что если какой-то там синтезатор не следует стандартам это его проблемы.

 

 

 

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

Зато если синтезатор частот должен включаться через ПЛИС, то надо делать свой ресет. Если мы делаем ASIC, то должны продумать ресет в виде гипервизора. Который будет встроен или будет внешнем устройством.

Один из вариантов создания гипервизора в виде счётчика.

РЕСЕТ нужен не только для начальной установки автомата.

Єто даже не его главное назначение.

Он нужен для перезапуска цифри после аварийних ситуаций.

Как частний случай, типичной аварией есть провал питания.

при єтом:

1) встроенний в ПЛИС супервизор такое плохо отслеживает - смотрите его характеристики

2) начальние значения с прошивки не помогут, ибо перепрошивка может и не начаться.

3) специальние микросхеми супервизоров питания имеют точную тримировку уровней для детектирования ресета.

Хоть єто и аналоговая микросхема внешне, но внутри у нее может бить встроена EEPROM для хранения тримировочних коефициентов, и соответственно - спец процедура при производстве... В ПЛИС такого конечно-же нет.

 

ВИВОД

Если у вас неважна чувствительность устройства к сбоям (например у меня єто Altera USB-Blaster) - можно и встроенний супервизор использовать (что-то не так - ничего, перезапущу процесс)... при условии что все внешние штуки стабилизируются к моменту снятия ресета....

Если у вас критическое приложение (у меня єто гигабитний свич, при остановке которого провайдер влетит на бабки) - то тут только внешний качественний супервизор

Share this post


Link to post
Share on other sites

1) встроенний в ПЛИС супервизор такое плохо отслеживает - смотрите его характеристики

 

Ну тут не совсем так, встроенный супервизор гарантирует, что в пределах его разброса конфигурация ПЛИС останется целой и невредимой, исходя из этого разброс его параметров и проектируется. Да и в случае чего, всякие там подсистемы, такие как например Soft Error Detection, инициируют перезагрузку ПЛИС сами при сбое в конфигурационной SRAM.

Share this post


Link to post
Share on other sites

Ну тут не совсем так, встроенный супервизор гарантирует, что в пределах его разброса конфигурация ПЛИС останется целой и невредимой, исходя из этого разброс его параметров и проектируется. Да и в случае чего, всякие там подсистемы, такие как например Soft Error Detection, инициируют перезагрузку ПЛИС сами при сбое в конфигурационной SRAM.

Короче, вот пример, почему встроенний POR плохой (учтите, доля нормальной работи должно бить VCCINT (1.71-1.89)V):

 

When power is applied to a MAX V device, the POR circuit monitors VCCINT and

begins SRAM download at 1.55 V for MAX V devices

 

For MAX V devices, the POR circuitry does not monitor the VCCINT and VCCIO voltage

levels after the device enters user mode.

 

If there is a VCCINT voltage sag below 1.4 V

during user mode, the functionality of the device is not guaranteed and you must

power down VCCINT to 250 mV for a minimum of 10 μs before powering VCCINT and

VCCIO up again.

 

Помоему очевидно, что єот супервизор не отслеживает VCCINT (1.71-1.89)V ето рас, а во вторих он тупо виключен после загрузки.

При віходе напряжения немного вне VCCINT (1.71-1.89)V (похоже гдето до 1.55 V), конфигурация может и не теряется, а вот set-up\hold тайминги идут нафик...

Такчто - встроенний ресет - ФИГНЯ

Share this post


Link to post
Share on other sites

Такчто - встроенний ресет - ФИГНЯ

Видимо, смотря где, надо внимательно рассматривать каждый конкретный случай. Для LatticeXP2 явно указано, что POR активен, когда VCC или VCCAUX уходят за пределы допуска. И что за то, чтобы VCCIO были уже в норме к этому времени, отвечает уже разработчик. А что он не отключается после загрузки, так это я сам экспериментально проверял (об этом даташит умалчивает)

Share this post


Link to post
Share on other sites

У Альтеры тоже без проблем осциллятор, мегафункция ALTINT_OSC. У xilinx у знающих людей надо спросить, или документацию перекопать... Там, вероятно, надо поставить STARTUP блок и взять GCLK с него. У латиса OSCE. В общем, есть у всех, нету в старых ПЛИС времен FLEX/ACEX

Действительно, я слегка отстал от жизни. У Ксайлинкс 6 серии осциллятор выводится из STARTUP(а вот у Спартан 3 нет такого). У Альтеры на Циклоне 3 осциллятор можно сделать новым мегавизардом(а у меня старый, там нет:)), или вручную поставить библиотечный компонент.

Share this post


Link to post
Share on other sites

Вы не поверите как влияет отсутствие интернета на продуктивность работы. Два дня провёл без интернета по независящим от меня обстоятельствам. в результате просидел в квартусе. Изучая verilog.

Проект простой модель супервизора. Которая при старте плиса делает ресет всей оставшейся части.

Так же на вход принимает внешний не синхронный ресет синхронизирует его с клоком.

И функция задержки, которая блокирует глобальный клок до тех пор пока не пройдёт пауза.

 

// Starter
// Pause for stabilization clock
// Power On Reset
// Starter - стартер
// Пауза для стабилизации напряжения и клока
// Выполняет функция ресета при подаче питания

module Starter(  
input Clock ,
input Reset,
output wire OutClock,
output wire OutReset
); 

                             
// Reset sinhronization
// Синхронизация ресета c клоком                             
reg r1,r2;
always @(posedge Clock)
begin : SynRST
r1<=Reset;
r2<=r1;
end


reg [11:0] Counter=0; // !!!  In sintezer maybe not support.
                      // !!!  У  синтезаторов может не работать   
assign OutReset=Counter == 12'hFFF ? 1:0;
assign OutClock=Clock & OutReset; // блокируем клок.

always @ (posedge Clock)
begin  :delay            // Задержка для стабилизации в виде счётчика     
  if (r2 == 1'b0) 
    begin
    Counter <=0;
    end else
  if (Counter != 12'hFFF)
    begin     
    Counter <=Counter + 1'b1;
    end
end


endmodule

 

Пример использования супервизора.

//Micro processor
//Микро процессор
module MP32(
input  clock,
input  reset,
output wire [31:0] reg4 
); 
wire  GlobalClock;
wire  ResetSyn;

Starter Stater1(.Reset(reset),.Clock(clock),.OutReset(ResetSyn),.OutClock(GlobalClock));
reg [31:0] reg1; 
reg [31:0] reg2; 
wire [31:0] reg3; 


ALU ALU1(reg1,reg2,reg3);



assign  reg4=reg1;
always@(posedge GlobalClock)
begin
  if (!ResetSyn)
    begin 
    reg1<=0;
    reg2<=1;
     end else
    reg1<=reg3;
end 

endmodule

 

Прошу проверить на ошибки.

Правильно ли выполнена синхронизация? Вроде нет ошибок, сделал по книжке.

А вот второй вопрос правильно ли я использую синхронный ресет? Должен ли я его применять через if?

И ещё как бы вопрос по использованию else в коде. Когда его надо применять а когда нет?

К примеру если я его опущу в стартере то синтез не меняется а если уберу в MP32 , то схема меняется кардинально синтезатор совсем ресет выкидывает.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...