Itch 0 18 января, 2007 Опубликовано 18 января, 2007 · Жалоба Как на Verilog HDL задать начальное значение регистра, при включении питания? Внешних сигналов для этого не придусмотренно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
daemonDX 0 18 января, 2007 Опубликовано 18 января, 2007 · Жалоба В Xilinx ISE при объявлении регистра : reg [ 7 : 0 ] cnt = 8'd15; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 18 января, 2007 Опубликовано 18 января, 2007 · Жалоба В 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Itch 0 20 января, 2007 Опубликовано 20 января, 2007 · Жалоба Спасибо, будем пробовать! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
daemonDX 0 22 января, 2007 Опубликовано 22 января, 2007 · Жалоба 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 не знаю. Так что наверное в доках по среде нужно выяснить, а не "Наверно так не стоит делать на верилоге". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 22 января, 2007 Опубликовано 22 января, 2007 · Жалоба Что у Альтеры - я знаю. Думал, что мне про Xilinx подробно расскажут. Недождался. Согласно Вашей выдержки из xst.pdf на самом деле следует, что XILINX опирается на собственный атрибут INIT (точно также как и ALTERA на свой) И поэтому наверно корректно было бы написать (* INIT = "0110" *) reg [3:0] d_out; При этом я хотел услышать от xilinx пользователей: Прослеживается ли это в функциональном моделировании как и во временном. Это работает с FPGA кристаллами, а работает ли с CPLD кристаллами фирмы xilinx. Ведь что я хотел сказать. Использование различных аттрибутов уже ограничивает использование такого описания в различных пакетах. Причем вся это атрибутика базируется на возможности установить все регистры в ноль в интервале инициализации. Иначе эти атрибуты работать не будут. Наверно в ACTEL нет таких атрибутов, наверно потому что нельзя все регистры в ноль установить. Я предложил простое решение, базирующееся на возможности установки в ноль всех регистров, независящее от среды разработи, которое должно наверно удовлетворить как минимум и altera и xilinx. Видите сколько слов наверно. И все наверно потому, что больше одной строчки из пользователей не выдавить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Itch 0 23 января, 2007 Опубликовано 23 января, 2007 · Жалоба 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 В чем ошибка? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 23 января, 2007 Опубликовано 23 января, 2007 · Жалоба ответ на вопрос, в зависимости от структуры фпга и синтезатора. Если хотите что бы было не зависимо от синтезатора, то ручками вставить компонент из юнисима и прописать атрибут инит. Если хотите что бы было не зависимо от структуры фпга, то введите сброс. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
daemonDX 0 23 января, 2007 Опубликовано 23 января, 2007 · Жалоба sazh, вы правильно подметили, инициализация в Xilinx реализуется с помощью прозрачной для пользователя XST замены конструкции на атрибут INIT. Собственно, именно это и написано в приведенном куске User Guide :) . При моделировании в ModelSim поведенческая модель и генерируемая XST cтруктурная модель с временными характеристиками в отношении инициализации регистров ведут себя одинаково. Т.е. при использовании связки ISE(XST) + ModelSim у меня заковык с инициализацией не возникало. С CPLD не работал, поэтому определенно сказать не могу. Предполагаю, что если у примитивов CPLD есть атрибуты INIT, то велика вероятность, что и для CPLD подобный подход сработает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
daemonDX 0 23 января, 2007 Опубликовано 23 января, 2007 · Жалоба Itch, вы бы разобрались с присвоениями. В коде в одном синхронном процессе намешаны blocking (<=) и non-blocking (=) присвоения сигналов. Если пока не разбираетесь, что синтез нагенерит на non-blocking в синхронном процессе, то ограничтесь блокирующими (<=). Сюрпризов будет меньше :). Ну и мысли вслух :) . Уж коли триггеров с Z-состояниями вроде бы пока нет, и синтез поставит латч/триггер с тристабильным буфером по выходу, то лучше так и описать - как триггер, выход которого через assign вне процесса назначается по некоторому условию в Z. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 23 января, 2007 Опубликовано 23 января, 2007 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Itch 0 24 января, 2007 Опубликовано 24 января, 2007 · Жалоба 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; не происходит Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 24 января, 2007 Опубликовано 24 января, 2007 · Жалоба Так ведь и не сказали. В какой среде работает, с каким кристаллом. Если это 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Itch 0 26 января, 2007 Опубликовано 26 января, 2007 · Жалоба sazh, Спасибо Вам большое! получил результат который хотел, регистры на выход выставляют при включении питания нужные значения. Работаю с Altera Flex 10K, среда Quartus II 6.0 Web Edition Full Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 26 января, 2007 Опубликовано 26 января, 2007 · Жалоба To Itch Ваш проект рабочий. Просто синтезатор Квартуса 6.0 принципиально игнорирует строчку в блоке инициализации- reg [15:0] rele1 = 16'hF0F0; Нужного результата можно в Вашем случае добиться с помощью редактора ассигнований Assigment Editor в Logic Option, вытащить нужные разряды регистра и назначить им Power-Up High. Что интересно, в Quartus 6.1 синтезатор предупреждает, что в блоке инициализации так делать нельзя,но отрабатывает назначение для FPGA. Качайте 6.1. Пробуйте. Или делайте, как уже сделали. Главное понимать, что Вы сделали. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться