| Микроконтролери и електроника 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 ] |
| Заглавие: | |
Как така искаш да запазиш предишната стойност ? Ако няма някакво условие то смисъла се губи Когато е зададено в уеловие ще работи .. примерно : always@(posedge clk) if(EN) A<=A; else A<=B; |
|
| Автор: | woody [ Вто Ное 27, 2007 9:08 pm ] |
| Заглавие: | |
Да се запази предишната стойност ... кога? То без твоя намеса не се променя и без друго. |
|
| Автор: | 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 ] | |||||||||
| Заглавие: | ||||||||||
от къв зор o_phy e в сенсивити листа? |
||||||||||
| Автор: | BrainStorm [ Сря Ное 28, 2007 1:16 pm ] |
| Заглавие: | |
И принципно е хубави да стробираш по някъв клок а не по промяна на сигнала .. защото ако имаш бърз FPGA жална ти маика |
|
| Автор: | Telekinesis [ Сря Ное 28, 2007 2:22 pm ] |
| Заглавие: | |
@ BrainStorm: Бате, тука не става дума за софта (quartus)... Дава ми варнинги че синтезира latch-ове, а не искам. Писал ли си fsm? С тоя always се опитвам да правя комбинационна логика, затова не ползвам клок. А ако ползвам резултата на изходите се забавя с още един клок, което също не го искам. И какво означава бърз FPGA? @ miro_atc: от o_phy <= {o_phy[48:0],1'b1}; o_phy се чете (дясната страна на равенството е) => в листа. |
|
| Автор: | BrainStorm [ Сря Ное 28, 2007 2:46 pm ] |
| Заглавие: | |
Немога да схвана какво точно искаш да направиш Latch-овете няма как да ги избегнеш ... o_phy е регистър. Ако искаш целия този механизам да се синтезира като чиста логика (без регистри) то няма да се получи с always ... Но от друга страна няма как да направиш бягащата 1'ца на o_phy без state machine |
|
| Автор: | miro_atc [ Сря Ное 28, 2007 3:06 pm ] | |||||||||
| Заглавие: | ||||||||||
Виж сега, аз не го чувам много тоя verilog, ама на vhdl в листа на процес се слагат сигнали чиято променя стартира процеса. Доколкото си спомням quartusa имаше help, вземи и прочети внимателно как се пишат процеси и какво се слага в листа им... Така не става и трудно някой ще ти помогне... Все едно да търсиш грешка в С-код а да не си наясно как работи if/then/else. |
||||||||||
| Автор: | Telekinesis [ Сря Ное 28, 2007 6:13 pm ] | |||||||||
| Заглавие: | ||||||||||
SOLVED Не съм обяснил точно какво искам. А и това което съм сложил не е достатъчно да се разбере проблема. Сори за което Исках да се запазва стойността на регистър, а не можеше да стане защото при комбинационната логика за синтез ми иска default от което се прее*ава сичко. Абе съвсем оплетох обяснението
Човече, говориш ми като на кретен Зацикляне има естествено. Как да направя бягаща 0 в стейт машина иначе? Цикли между два стейта (инкрементира -> изпраща) докато стигне условие след което излиза. За PLL-а: естествено че можеш да му зададеш работна честотта Айде |
||||||||||
| Автор: | woody [ Сря Ное 28, 2007 6:21 pm ] | |||||||||
| Заглавие: | ||||||||||
Малко си прекалил с дименсиите, и в двете посоки. |
||||||||||
| Автор: | 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:
На това място се предполага че искаш обратна врьзка.
а тук се изисква запазване на предишно сьстояние. Както се сещаш няма да минеш само с комбинаторика И докато вьв втория случай FF-а ще се синтезира, в пьрвия, не е точно така. Но си напьлно прав, че това което си сложил не е достатъчно за да се разбере проблема. Не сме гадатели, ако искаш помощ поствай достатьчно код. |
||||||||||||||||||||||||||||
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|