| Автор |
Съобщение |
|
Telekinesis
Ранг: Минаващ
Регистриран на: Чет Мар 15, 2007 6:59 pm Мнения: 47 Местоположение: sf
|
 Въпрос за Verilog:
Въпрос за хора занимаващи се с verilog (начинаещ съм):
Имам
output reg A;
как мога да кажа че искам А да си запази предишната стойност?????
A <= A; - не работи при синтез (може и да работи но дава нежелани warnings)
А <= 1'bx; - do not care също не работи
F1!! Че вече се побърквам... Изглежда баси кретенизма, а незнам как се прави.
|
| Вто Ное 27, 2007 6:35 pm |
|
 |
|
BrainStorm
Ранг: Почетен член
Регистриран на: Пон Юли 04, 2005 11:51 pm Мнения: 651 Местоположение: София
|
Как така искаш да запазиш предишната стойност ? Ако няма някакво условие то смисъла се губи  т.е ако A<=A винаги, се едно имаш wire (не случаино ти дава warning)
Когато е зададено в уеловие ще работи .. примерно :
always@(posedge clk)
if(EN) A<=A;
else A<=B;
_________________ От наше село са види връо, ама от връо се невиди наше село ... що така и я незнам .. ?!?
|
| Вто Ное 27, 2007 7:32 pm |
|
 |
|
woody
Ранг: Форумен бог
Регистриран на: Вто Юли 31, 2007 2:55 pm Мнения: 1792 Местоположение: София
|
Да се запази предишната стойност ... кога? То без твоя намеса не се променя и без друго. 
|
| Вто Ное 27, 2007 9:08 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
@Telekinesis, надявам се знаеш що е туй логика с памет и има ли почва у нас
Те такива животни е добре да се описват в процес и като за начало добре е едно животно да го рисуваш само в един процес. Ако ги пипаш извън процес или в повече от един процес - хапят 
|
| Вто Ное 27, 2007 9:27 pm |
|
 |
|
Telekinesis
Ранг: Минаващ
Регистриран на: Чет Мар 15, 2007 6:59 pm Мнения: 47 Местоположение: sf
|
Явно съм го обяснил много съкратено.
Въпроса е следния:
Имам 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
|
| Сря Ное 28, 2007 11:01 am |
|
 |
|
BrainStorm
Ранг: Почетен член
Регистриран на: Пон Юли 04, 2005 11:51 pm Мнения: 651 Местоположение: София
|
Ми ако ти дава само warning може да го игнорираш ... кой софт ползваш ?
_________________ От наше село са види връо, ама от връо се невиди наше село ... що така и я незнам .. ?!?
|
| Сря Ное 28, 2007 11:49 am |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
от къв зор o_phy e в сенсивити листа?
|
| Сря Ное 28, 2007 12:28 pm |
|
 |
|
BrainStorm
Ранг: Почетен член
Регистриран на: Пон Юли 04, 2005 11:51 pm Мнения: 651 Местоположение: София
|
И принципно е хубави да стробираш по някъв клок а не по промяна на сигнала .. защото ако имаш бърз FPGA жална ти маика  и най-малкия шум по линията ще го ошашка ..
_________________ От наше село са види връо, ама от връо се невиди наше село ... що така и я незнам .. ?!?
|
| Сря Ное 28, 2007 1:16 pm |
|
 |
|
Telekinesis
Ранг: Минаващ
Регистриран на: Чет Мар 15, 2007 6:59 pm Мнения: 47 Местоположение: sf
|
@ BrainStorm: Бате, тука не става дума за софта (quartus)... Дава ми варнинги че синтезира latch-ове, а не искам.
Писал ли си fsm? С тоя always се опитвам да правя комбинационна логика, затова не ползвам клок. А ако ползвам резултата на изходите се забавя с още един клок, което също не го искам.
И какво означава бърз FPGA?  Колко са бързи зависи от теб (PLL-а).
@ miro_atc:
от
o_phy <= {o_phy[48:0],1'b1};
o_phy се чете (дясната страна на равенството е) => в листа.
|
| Сря Ное 28, 2007 2:22 pm |
|
 |
|
BrainStorm
Ранг: Почетен член
Регистриран на: Пон Юли 04, 2005 11:51 pm Мнения: 651 Местоположение: София
|
Немога да схвана какво точно искаш да направиш  но така както си го написал се получава някво суперр зацикляне .. примерно ако current_state = PHY_INC_DRV на o_phy ще почнат да се джуркат 1'ци с няква невероятна скорост  ... това за PLL-а не го схванах? Ти на FPGA'то неможеш да зададеш работна честота .. логиката в него се клати на максимума които може (обикновенно при синетз софта ти изчислява тази честота)
Latch-овете няма как да ги избегнеш ... o_phy е регистър. Ако искаш целия този механизам да се синтезира като чиста логика (без регистри) то няма да се получи с always ...
Но от друга страна няма как да направиш бягащата 1'ца на o_phy без state machine  ... а за нея трябва регистър
_________________ От наше село са види връо, ама от връо се невиди наше село ... що така и я незнам .. ?!?
|
| Сря Ное 28, 2007 2:46 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
Виж сега, аз не го чувам много тоя verilog, ама на vhdl в листа на процес се слагат сигнали чиято променя стартира процеса.
Доколкото си спомням quartusa имаше help, вземи и прочети внимателно как се пишат процеси и какво се слага в листа им...
Така не става и трудно някой ще ти помогне... Все едно да търсиш грешка в С-код а да не си наясно как работи if/then/else.
|
| Сря Ное 28, 2007 3:06 pm |
|
 |
|
Telekinesis
Ранг: Минаващ
Регистриран на: Чет Мар 15, 2007 6:59 pm Мнения: 47 Местоположение: sf
|
SOLVED
Не съм обяснил точно какво искам. А и това което съм сложил не е достатъчно да се разбере проблема. Сори за което
Исках да се запазва стойността на регистър, а не можеше да стане защото при комбинационната логика за синтез ми иска default от което се прее*ава сичко. Абе съвсем оплетох обяснението
Човече, говориш ми като на кретен  Ненам защо така.
Зацикляне има естествено. Как да направя бягаща 0 в стейт машина иначе? Цикли между два стейта (инкрементира -> изпраща) докато стигне условие след което излиза.
За PLL-а: естествено че можеш да му зададеш работна честотта  Има си умножители и щуротии. Нали тва му е смисъла на ПЛЛ-а. Ако примерно му подаваш клок 100Хз вътрешно можеш да работиш на 1ГХз примерно (съответно да вадиш навънка денни с 1ГХз). В quartus на altera има mega function wizard alabala с който можеш да го правиш тва.
Айде  Със здраве 
|
| Сря Ное 28, 2007 6:13 pm |
|
 |
|
woody
Ранг: Форумен бог
Регистриран на: Вто Юли 31, 2007 2:55 pm Мнения: 1792 Местоположение: София
|
Малко си прекалил с дименсиите, и в двете посоки.
|
| Сря Ное 28, 2007 6:21 pm |
|
 |
|
Trigger
Ранг: Минаващ
Регистриран на: Съб Окт 22, 2005 1:18 am Мнения: 54
|
Може да пробваш по следния начин:
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 логика
|
| Сря Ное 28, 2007 6:38 pm |
|
 |
|
HCL
Ранг: Форумен бог
Регистриран на: Вто Дек 14, 2004 1:31 pm Мнения: 3849
|
Доколкото хващам синтаксиса на verilog, този код би трябва да изглежда по следния начин на VHDL:
На това място се предполага че искаш обратна врьзка.
а тук се изисква запазване на предишно сьстояние.
Както се сещаш няма да минеш само с комбинаторика
И докато вьв втория случай FF-а ще се синтезира, в пьрвия, не е точно така.
Но си напьлно прав, че това което си сложил не е достатъчно за да се разбере проблема.
Не сме гадатели, ако искаш помощ поствай достатьчно код.
|
| Чет Ное 29, 2007 12:43 pm |
|
|