Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Въпрос за Verilog:
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=5135
Страница 1 от 2

Автор:  Telekinesis [ Вто Ное 27, 2007 6:35 pm ]
Заглавие:  Въпрос за Verilog:

Въпрос за хора занимаващи се с verilog (начинаещ съм):
Имам

output reg A;
как мога да кажа че искам А да си запази предишната стойност?????
A <= A; - не работи при синтез (може и да работи но дава нежелани warnings)
А <= 1'bx; - do not care също не работи

F1!! Че вече се побърквам... Изглежда баси кретенизма, а незнам как се прави.

Автор:  BrainStorm [ Вто Ное 27, 2007 7:32 pm ]
Заглавие: 

Как така искаш да запазиш предишната стойност ? Ако няма някакво условие то смисъла се губи :) т.е ако A<=A винаги, се едно имаш wire (не случаино ти дава warning)

Когато е зададено в уеловие ще работи .. примерно :

always@(posedge clk)
if(EN) A<=A;
else A<=B;

Автор:  woody [ Вто Ное 27, 2007 9:08 pm ]
Заглавие: 

Да се запази предишната стойност ... кога? То без твоя намеса не се променя и без друго. :D

Автор:  miro_atc [ Вто Ное 27, 2007 9:27 pm ]
Заглавие: 

@Telekinesis, надявам се знаеш що е туй логика с памет и има ли почва у нас ;-)

Те такива животни е добре да се описват в процес и като за начало добре е едно животно да го рисуваш само в един процес. Ако ги пипаш извън процес или в повече от един процес - хапят ;-)

Автор:  Telekinesis [ Сря Ное 28, 2007 11:01 am ]
Заглавие: 

Явно съм го обяснил много съкратено.

Въпроса е следния:
Имам 50 wires между два FPGA. Искам единия да е мастър другия слейв. Мастъра трябва да първо да подава команда към слейва (за да го установи в даден режим) след което да подаде бягаща 0. След което става алабала. За целта мога да използвам единствено 50те жици (и клок).
Долния always описва част от крайния автомат който трябва да прави нещото - в PHY_CMD стейта в зависимост от cnt_phy се подава командата към слайва. След това в стейт Z1 o_phy се установява в 50'b1111...1110. PHY_INC_DRV шифтва с едно o_phy. Машината цикли между PHY_INC_DRV и друг стейт и зилиза след като се извъртят.
Незнам колко стана ясно, но проблема е че за синтез ми пищи че в показания always няма default стойност. Аз незнам каква трябва да е след като o_phy искам да не се нулира (ако default:o_phy <= 50'h0;) защото го ползвам в други стейтове.

always @ (current_state or cnt_phy or o_phy)
case (current_state)
PHY_CMD:
case (cnt_phy)
3'b000: o_phy <= 50'h0;
3'b001: o_phy <= 50'hE7E7E7_E7E7E7;
3'b010: o_phy <= 50'hA5A5A5_A5A5A5;
3'b011: o_phy <= 50'hC3C3C3_C3C3C3;
default: o_phy <= 50'h0;
endcase

Z1: o_phy <= ~1;

PHY_INC_DRV: o_phy <= {o_phy[48:0],1'b1};
default: o_phy <= 50'b0;
endcase

Автор:  BrainStorm [ Сря Ное 28, 2007 11:49 am ]
Заглавие: 

Ми ако ти дава само warning може да го игнорираш ... кой софт ползваш ?

Автор:  miro_atc [ Сря Ное 28, 2007 12:28 pm ]
Заглавие: 

Telekinesis написа:

always @ (current_state or cnt_phy or o_phy)


от къв зор o_phy e в сенсивити листа?

Автор:  BrainStorm [ Сря Ное 28, 2007 1:16 pm ]
Заглавие: 

И принципно е хубави да стробираш по някъв клок а не по промяна на сигнала .. защото ако имаш бърз FPGA жална ти маика :) и най-малкия шум по линията ще го ошашка ..

Автор:  Telekinesis [ Сря Ное 28, 2007 2:22 pm ]
Заглавие: 

@ BrainStorm: Бате, тука не става дума за софта (quartus)... Дава ми варнинги че синтезира latch-ове, а не искам.
Писал ли си fsm? С тоя always се опитвам да правя комбинационна логика, затова не ползвам клок. А ако ползвам резултата на изходите се забавя с още един клок, което също не го искам.
И какво означава бърз FPGA? :) Колко са бързи зависи от теб (PLL-а).

@ miro_atc:

от
o_phy <= {o_phy[48:0],1'b1};

o_phy се чете (дясната страна на равенството е) => в листа.

Автор:  BrainStorm [ Сря Ное 28, 2007 2:46 pm ]
Заглавие: 

Немога да схвана какво точно искаш да направиш :) но така както си го написал се получава някво суперр зацикляне .. примерно ако current_state = PHY_INC_DRV на o_phy ще почнат да се джуркат 1'ци с няква невероятна скорост :) ... това за PLL-а не го схванах? Ти на FPGA'то неможеш да зададеш работна честота .. логиката в него се клати на максимума които може (обикновенно при синетз софта ти изчислява тази честота)

Latch-овете няма как да ги избегнеш ... o_phy е регистър. Ако искаш целия този механизам да се синтезира като чиста логика (без регистри) то няма да се получи с always ...

Но от друга страна няма как да направиш бягащата 1'ца на o_phy без state machine :) ... а за нея трябва регистър

Автор:  miro_atc [ Сря Ное 28, 2007 3:06 pm ]
Заглавие: 

Telekinesis написа:
от
o_phy <= {o_phy[48:0],1'b1};

o_phy се чете (дясната страна на равенството е) => в листа.


Виж сега, аз не го чувам много тоя verilog, ама на vhdl в листа на процес се слагат сигнали чиято променя стартира процеса.

Доколкото си спомням quartusa имаше help, вземи и прочети внимателно как се пишат процеси и какво се слага в листа им...
Така не става и трудно някой ще ти помогне... Все едно да търсиш грешка в С-код а да не си наясно как работи if/then/else.

Автор:  Telekinesis [ Сря Ное 28, 2007 6:13 pm ]
Заглавие: 

SOLVED

Не съм обяснил точно какво искам. А и това което съм сложил не е достатъчно да се разбере проблема. Сори за което :P
Исках да се запазва стойността на регистър, а не можеше да стане защото при комбинационната логика за синтез ми иска default от което се прее*ава сичко. Абе съвсем оплетох обяснението :? :D :D


BrainStorm написа:
Немога да схвана какво точно искаш да направиш :) но така както си го написал се получава някво суперр зацикляне .. примерно ако current_state = PHY_INC_DRV на o_phy ще почнат да се джуркат 1'ци с няква невероятна скорост :) ... това за PLL-а не го схванах? Ти на FPGA'то неможеш да зададеш работна честота .. логиката в него се клати на максимума които може (обикновенно при синетз софта ти изчислява тази честота)

Latch-овете няма как да ги избегнеш ... o_phy е регистър. Ако искаш целия този механизам да се синтезира като чиста логика (без регистри) то няма да се получи с always ...

Но от друга страна няма как да направиш бягащата 1'ца на o_phy без state machine :) ... а за нея трябва регистър


Човече, говориш ми като на кретен :) :) :) Ненам защо така.
Зацикляне има естествено. Как да направя бягаща 0 в стейт машина иначе? Цикли между два стейта (инкрементира -> изпраща) докато стигне условие след което излиза.
За PLL-а: естествено че можеш да му зададеш работна честотта :) Има си умножители и щуротии. Нали тва му е смисъла на ПЛЛ-а. Ако примерно му подаваш клок 100Хз вътрешно можеш да работиш на 1ГХз примерно (съответно да вадиш навънка денни с 1ГХз). В quartus на altera има mega function wizard alabala с който можеш да го правиш тва.

Айде :) Със здраве :)

Автор:  woody [ Сря Ное 28, 2007 6:21 pm ]
Заглавие: 

Telekinesis написа:
Ако примерно му подаваш клок 100Хз вътрешно можеш да работиш на 1ГХз примерно (съответно да вадиш навънка денни с 1ГХз)


Малко си прекалил с дименсиите, и в двете посоки.

Автор:  Trigger [ Сря Ное 28, 2007 6:38 pm ]
Заглавие: 

Може да пробваш по следния начин:

always @ (current_state or cnt_phy)
casex({current_state,cnt_phy})
5'b00_000: o_phy = 50'h0;
5'b00_001: o_phy = 50'hE7E7E7_E7E7E7;
5'b00_010: o_phy = 50'hA5A5A5_A5A5A5;
5'b00_011: o_phy = 50'hC3C3C3_C3C3C3;
5'b01_xxx: o_phy = ~1;
5'b11_xxx: o_phy = {o_phy[48:0],1'b1};
default: o_phy = 50'b0;
endcase

като трябва да си оправиш съответсвието за current state: 00 = PHY_cmd;
01 = Z1; 11 = PHY_INC_DRV или както ти харесва


И един съвет: използвай non blocking assignments само при edge driven логика

Автор:  HCL [ Чет Ное 29, 2007 12:43 pm ]
Заглавие: 

Доколкото хващам синтаксиса на verilog, този код би трябва да изглежда по следния начин на VHDL:

Код:
process (current_state, cnt_phy, o_phy)
begin
case curent_state is
  when PHY_CMD =>
   case cnt_phy is
    when "001" => o_phy <= "00" & x"e7e7e7_e7e7e7";
    when "010" => o_phy <= "00" & x"a5a5a5_a5a5a5";
    when "011" => o_phy <= "00" & x"c3c3c3_c3c3c3";
    when OTHERS => null;
   end case;
  when Z1 => o_phy <= x"ffff_ffff" & "10";
  when PHY_INC_DRV => o_phy <= o_phy(48 downto 0) & '1';
  when OTHERS => null;
end case;
end process;


Код:
when PHY_INC_DRV => o_phy <= o_phy(48 downto 0) & '1';

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

Код:
when OTHERS => null;

а тук се изисква запазване на предишно сьстояние.

Както се сещаш няма да минеш само с комбинаторика :)
И докато вьв втория случай FF-а ще се синтезира, в пьрвия, не е точно така.
Но си напьлно прав, че това което си сложил не е достатъчно за да се разбере проблема.
Не сме гадатели, ако искаш помощ поствай достатьчно код.

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/