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

Инициализация регистров в Verilog

Как на Verilog HDL задать начальное значение регистра, при включении питания? Внешних сигналов для этого не придусмотренно.

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


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

В Xilinx ISE при объявлении регистра :

reg [ 7 : 0 ] cnt = 8'd15;

//////////////////////////////////////////////////////////////////////

Наверно так не стоит делать на верилоге. при использовании в FPGA функциональное моделироване

неидентично временному (для регистров, объявленных таким способом). А с СPLD, например в Квартусе, не работает. Наверно и с другими синтезаторами будут проблемы.

Можно явным образом сделать назначения, эквивалентные выше приведенным.

 

 

 

/*

Power-Up Level

This logic option causes a register (flip-flop) to power up with the

specified logic level, either High (1) or Low (0). Registers in the device

core hardware power up to 0 in all Altera devices. For the register to

power up with a logic level High specified using this option, the

Compiler performs an optimization referred to as NOT-gate push back on

the register. NOT-gate push back adds an inverter to the input and the

output of the register so that the reset and power-up conditions will

appear to be high and the device operates as expected. The register itself

actually still powers up low, but the register output is inverted so the

signal arriving at all destinations is high.

///////////////////////////////////////////////////////////

Note that the Quartus II software, like most synthesis tools, does

not synthesize Verilog HDL initial blocks. Therefore, the tool

does not synthesize variables that are assigned values in initial

blocks into power-up conditions.

*/

 

module rg_xor_c

(

input clk,

input [3:0] in_data_a, in_data_b,

input enable_clk,

output reg [3:0] out_data_a, out_data_b

);

 

reg [3:0] rg_data_a = 4'd3; // Power-Up 4'd3 (FPGA only); functional !== timing;

reg [3:0] rg_data_b;

 

 

always @ (posedge clk)

begin

if (enable_clk) begin

rg_data_a <= in_data_a;

rg_data_b <= in_data_b ^ 4'd3; end // Power-Up 4'd3

out_data_a <= rg_data_a;

out_data_b <= rg_data_b ^ 4'd3;

end

 

endmodule

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


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

XST User Guide:

When you give a register an initial value in a declaration, XST sets this value on the output

of the register at global reset, or at power up. A value assigned this way is carried in the

NGC file as an INIT attribute on the register, and is independent of any local reset.

 

У Altera не знаю. Так что наверное в доках по среде нужно выяснить, а не "Наверно так не стоит делать на верилоге".

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


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

Что у Альтеры - я знаю. Думал, что мне про Xilinx подробно расскажут. Недождался.

Согласно Вашей выдержки из xst.pdf на самом деле следует, что XILINX опирается на собственный атрибут INIT (точно также как и ALTERA на свой)

И поэтому наверно корректно было бы написать

(* INIT = "0110" *) reg [3:0] d_out;

При этом я хотел услышать от xilinx пользователей:

Прослеживается ли это в функциональном моделировании как и во временном.

Это работает с FPGA кристаллами, а работает ли с CPLD кристаллами фирмы xilinx.

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

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

Я предложил простое решение, базирующееся на возможности установки в ноль всех регистров, независящее от среды разработи, которое должно наверно удовлетворить как минимум и altera и xilinx.

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

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


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

module decoder
(     
     rele, Adr, Date, CS, W, R, clk_in
);

     input CS, W, R, clk_in;
     input [3:0] Adr;
     
     inout [15:0] Date;

     output [15:0] rele;
          
     reg [15:0] rele;
     reg [15:0] rele1 = 16'hF0F0;
     reg [15:0] Date = 16'hZZZZ; 

always @(posedge clk_in)
begin
     case({CS,W,R,Adr[3:0]})

          7'b0_0_1_0010 :
          begin     
               rele1 = Date; 
end

          7'b0_1_0_0010 : 
          begin     
               Date = rele1; 
          end

          default :
          begin     
               Date <= 16'hZZZZ; 
          end

     endcase
rele = rele1;

end
endmodule

 

в регистр rele, при включении питания надо выставить определенное значение, допустим 16'hF0F0;

при включении он заходит в условие

    7'b0_0_1_0010 :

    begin     
            rele1 = Date; 
        end

пробывал коментировать это условие rele1 = Date;

тогда по идее rele = rele1; (которое reg [15:0] rele1 = 16'hF0F0, те rele = 16'hF0F0,

а он свое значение вообще не меняет и в компилятор выдает предупреждение:

Warning (10030): Tied undriven net "rele1[15]" at decoder.v(29) to 0

.

.

Warning (10030): Tied undriven net "rele1[0]" at decoder.v(29) to 0

для всех битов rele1

 

и

Warning: Reduced register "decoder:inst|rele[15]" with stuck data_in port to stuck value GND

.

.

Warning: Reduced register "decoder:inst|rele[0]" with stuck data_in port to stuck value GND

для всех битов rele

 

 

В чем ошибка?

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


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

ответ на вопрос, в зависимости от структуры фпга и синтезатора.

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

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


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

sazh, вы правильно подметили, инициализация в Xilinx реализуется с помощью прозрачной для пользователя XST замены конструкции на атрибут INIT. Собственно, именно это и написано в приведенном куске User Guide :) . При моделировании в ModelSim поведенческая модель и генерируемая XST cтруктурная модель с временными характеристиками в отношении инициализации регистров ведут себя одинаково. Т.е. при использовании связки ISE(XST) + ModelSim у меня заковык с инициализацией не возникало. С CPLD не работал, поэтому определенно сказать не могу. Предполагаю, что если у примитивов CPLD есть атрибуты INIT, то велика вероятность, что и для CPLD подобный подход сработает.

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


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

Itch, вы бы разобрались с присвоениями. В коде в одном синхронном процессе намешаны blocking (<=) и non-blocking (=) присвоения сигналов. Если пока не разбираетесь, что синтез нагенерит на non-blocking в синхронном процессе, то ограничтесь блокирующими (<=). Сюрпризов будет меньше :).

Ну и мысли вслух :) . Уж коли триггеров с Z-состояниями вроде бы пока нет, и синтез поставит латч/триггер с тристабильным буфером по выходу, то лучше так и описать - как триггер, выход которого через assign вне процесса назначается по некоторому условию в Z.

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


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

To Itch

Конечно нужно понимать разницу в назначении сигналу не блокирующее (<=) и присваивание переменной блокирующее (=) b и как это отразится на синтезе. В процессе по клоку в 99% случаях используйте неблокирующее назначение. Всегда получите то, что задумали.

Но в данном случае для оператора case это безразлично. Ошибка в самом использовании связки двунаправленная шина - регистр. Нет необходимости в двух регистрах.

 

module decoder

(

Adr, Date, CS, W, R, clk_in

);

 

input CS, W, R, clk_in;

input [3:0] Adr;

 

inout [15:0] Date;

 

 

reg [15:0] rele1 = 16'hF0F0;

 

always @(posedge clk_in)

begin

if (~CS & ~W & R & (Adr == 4'd2)) rele1 <= Date;

end

 

assign Date = (~CS & W & ~R & (Adr == 4'd2)) ? rele1 : 16'hzzzz;

 

endmodule

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


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

sazh, переделал работу с двунаправленой шиной так, как ты советуеш:

module decoder
( 
rele,lamp, LCD, bottom, Adr, Date, CK_is, CK_zn, V1, V2, V3, V4, CS, W, R, clk_in 
);

     input CS, W, R, clk_in;
     input [3:0] Adr;
     input [15:0] CK_is;
     input [15:0] CK_zn;
     input [15:0] V1;
     input [15:0] V2;
     input [15:0] V3;
     input [15:0] V4;
     input [15:0] bottom;

     inout [15:0] Date;

     output [15:0] rele;
     output [15:0] lamp;
     output [15:0] LCD;
          
     reg [15:0] rele;
     reg [15:0] rele1 = 16'hF0F0;
     reg [15:0] lamp;
     reg [15:0] lamp1 = 16'h55AA;
     reg [15:0] LCD;

always @(posedge clk_in)//(CS,W,R,Adr[3:0])
begin
     if           (~CS & ~W & R & (Adr == 4'b0000)) rele1 <= Date; //запись в регистр реле
     else if (~CS & ~W & R & (Adr == 4'b0001)) lamp1 <= Date; //запись в регистр индикации
     else if (~CS & ~W & R & (Adr == 4'b1001)) LCD <= Date; //запись в регистр LCD
end

always @(negedge clk_in)
begin
     lamp <= ~lamp1; 
     rele <= rele1;
end

assign Date =     (~CS & W & ~R)?
                    (Adr == 4'b0000)? rele1 :
                      (Adr == 4'b0001)? lamp1:
                    (Adr == 4'b0010)? ~CK_is:
                    (Adr == 4'b0011)? ~CK_zn:
                    (Adr == 4'b0100)? V1:
                    (Adr == 4'b0101)? V2:
                    (Adr == 4'b0110)? V3:
                    (Adr == 4'b0111)? V4:
                    (Adr == 4'b1000)? bottom : 16'hzzzz : 16'hzzzz;
endmodule

оставил правда второй регистр rele, он определен как выход и к нему подключены ключи управления.

проблему не удалось решить - при включении питания и без сигналов записи (~CS & ~W & R & (Adr == 4'b0000)) rele1 <= Date;

на выход rele не выставляются значения rele1 = 16'hF0F0

так же пробывал коментировать условие изменения rele1, тогда опять же выдаеться предупреждение

Warning (10030): Tied undriven net "rele1[15]" at decoder.v(26) to 0

.

.

Warning (10030): Tied undriven net "rele1[0]" at decoder.v(26) to 0

и

Warning: Reduced register "decoder:inst|rele[15]" with stuck data_in port to stuck value GND

.

.

Warning: Reduced register "decoder:inst|rele[0]" with stuck data_in port to stuck value GND

 

те задание начальных значений регистра reg [15:0] rele1 = 16'hF0F0; не происходит

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


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

Так ведь и не сказали. В какой среде работает, с каким кристаллом. Если это FPGA на базе флеш, то наверно без внешего сигнала установки не обойтисью Судя по предупреждением, это не Quartus. В нем Ваш проект выдает нужные значения по включению. Но не все синтезаторы одинаково реагируют на объявление регистров rele[15:0] и rele1[15:0]. Для многих это эквивалентно rele[15:0], rele[115:10].

В результате пересечение шин и возможно если не ошибка то минимизация. Всегда вместо цифры в имени цепи ставьте букву. Если это кристалл FPGA на базе статической ячейки памяти, переименуйте цепь. Должна заработать.

У меня просьба. Озвучьте Вашу среду разработки, Ваш кристалл и огласите для меня результаты работы следующего модуля:

 

module decoder_a

(

rele,lamp, LCD, bottom, Adr, Date, CK_is, CK_zn, V1, V2, V3, V4, CS, W, R, clk_in

);

 

input CS, W, R, clk_in;

input [3:0] Adr;

input [15:0] CK_is;

input [15:0] CK_zn;

input [15:0] V1;

input [15:0] V2;

input [15:0] V3;

input [15:0] V4;

input [15:0] bottom;

 

inout [15:0] Date;

 

output [15:0] rele;

output [15:0] lamp;

output [15:0] LCD;

 

reg [15:0] rele;

reg [15:0] rele_a; // = 16'hf0f0;

reg [15:0] lamp;

reg [15:0] lamp_a; // = 16'h55aa;

reg [15:0] LCD;

/////////////////////////////////

reg [15:0] data_out;

reg enable;

 

always @(posedge clk_in)//(CS,W,R,Adr[3:0])

begin

if({CS, W, R, Adr} == 7'b0_0_1_0000) rele_a <= Date ^ 16'hf0f0;

if({CS, W, R, Adr} == 7'b0_0_1_0001) lamp_a <= Date ^ 16'h55aa;

if({CS, W, R, Adr} == 7'b0_0_1_1001) LCD <= Date;

 

lamp <= ~(lamp_a ^ 16'h55aa);

rele <= rele_a ^ 16'hf0f0;

end

 

always @ (CS or W or R or Adr or rele_a or lamp_a or CK_is or CK_zn or V1 or V2 or V3 or V4 or bottom)

begin

case ({CS, W, R, Adr})

7'b0_1_0_0000 : {data_out, enable} <= {rele_a ^ 16'hf0f0, 1'b1};

7'b0_1_0_0001 : {data_out, enable} <= {lamp_a ^ 16'h55aa, 1'b1};

7'b0_1_0_0010 : {data_out, enable} <= {~CK_is, 1'b1};

7'b0_1_0_0011 : {data_out, enable} <= {~CK_zn, 1'b1};

7'b0_1_0_0100 : {data_out, enable} <= {V1, 1'b1};

7'b0_1_0_0101 : {data_out, enable} <= {V2, 1'b1};

7'b0_1_0_0110 : {data_out, enable} <= {V3, 1'b1};

7'b0_1_0_0111 : {data_out, enable} <= {V4, 1'b1};

7'b0_1_0_1000 : {data_out, enable} <= {bottom, 1'b1};

default : {data_out, enable} <= {16'h0000, 1'b0};

endcase

end

 

assign Date = enable ? data_out : 16'hzzzz;

 

endmodule

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


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

sazh, Спасибо Вам большое! получил результат который хотел, регистры на выход выставляют при включении питания нужные значения. Работаю с Altera Flex 10K, среда Quartus II 6.0 Web Edition Full

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


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

To Itch

Ваш проект рабочий.

Просто синтезатор Квартуса 6.0 принципиально игнорирует строчку в блоке инициализации-

reg [15:0] rele1 = 16'hF0F0;

Нужного результата можно в Вашем случае добиться с помощью редактора ассигнований

Assigment Editor в Logic Option, вытащить нужные разряды регистра и назначить им Power-Up High.

Что интересно, в Quartus 6.1 синтезатор предупреждает, что в блоке инициализации так делать нельзя,но отрабатывает назначение для FPGA.

Качайте 6.1. Пробуйте. Или делайте, как уже сделали. Главное понимать, что Вы сделали.

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


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

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

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

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

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

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

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

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

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

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