Какво е предимството на писане VHDL, че може да бъде разпознат

C

CMOS

Guest
Какво е предимството на писане VHDL, че може да бъде разпознат (заключи) от XST?Написах програма VHDL, описващи ограничен държавна машина, аз се опитах да го напиша, както бе предложено от ръководството XST но това не бе разпознат като ФЩМ ...значи аз трябва да се промени програмата до един ФЩМ да се заключи?

 
Ако XST признава ФЩМ, може да получите по-бърз или по-малко дизайн.В зависимост от целите си, че може да бъде оправдан.

Може ли да публикувате код тук?Може би някой може да видите на проблема.

 
Общо казано, synthesizable стил VHDL могат да бъдат синтезирани от синтезатор.И поведенчески VHDL описание може да се recogized от симулатор само ...

Не можех да хвана ключови точки.Може да се опише по-подробно.

 
Кодът описва брашнен ФЩМ сериен усойница, както е показано в държавната схема ..

Код:IEEE библиотека;

употреба ieee.std_logic_1164.all;лице е FSM

порт (

CLK, Reset: В std_logic;

вход: в std_logic_vector (1 downto 0);

сума: OUT std_logic);

края лице;архитектура beh1 на ФЩМ е

тип state_type е (S1, S2);

сигнал състояние, next_state: state_type;сигнал i_input: std_logic_vector (1 downto 0);

започвамsequential_process: процес (CLK, нулиране)

започвам

ако (Reset = '1 '), тогава

държавни <= S1;

ELSIF (CLK = '1 'и clk'Event), тогава

държавни <= next_state;

i_input <= вход;

крайна сметка, ако;

sequential_process края процес;nextstate_process: процес (състояние, i_input)

започвам

случай държавата е

когато S1 =>

ако i_input = "00", тогава

next_state <= S1;

ELSIF i_input = "01", тогава

next_state <= S1;

ELSIF i_input = "10", тогава

next_state <= S1;

ELSIF i_input = "11", тогава

next_state <= S2;

крайна сметка, ако;

когато S2 =>

ако i_input = "00", тогава

next_state <= S1;

ELSIF i_input = "01", тогава

next_state <= S2;

ELSIF i_input = "10", тогава

next_state <= S2;

ELSIF i_input = "11", тогава

next_state <= S2;

крайна сметка, ако;края случай;

nextstate_process края процес;output_process: процес (състояние, i_input)

започвам

случай държавата е

когато S1 =>

ако i_input = "00", тогава

сума <= '0 ';

ELSIF i_input = "01", тогава

сума <= '1 ';

ELSIF i_input = "10", тогава

сума <= '1 ';

ELSIF i_input = "11", тогава

сума <= '0 ';

крайна сметка, ако;

когато S2 =>

ако i_input = "00", тогава

сума <= '1 ';

ELSIF i_input = "01", тогава

сума <= '0 ';

ELSIF i_input = "10", тогава

сума <= '0 ';

ELSIF i_input = "11", тогава

сума <= '1 ';

крайна сметка, ако;

края случай;

output_process края процес;

края beh1;

 
Аз не знам VHDL много добре.Се надявате да се създаде напълно синхронизирана дизайн?Обобщение на HDL доклад е излъчване предупреждения за ключалки.XST няма да заключим ФЩМ при асинхронни логика.

 
XST не е inferring един ФЩМ, защото имате само две държави.Добавяне на трета държава, и това ще предположи един ФЩМ.

В случай на ФЩМ, inferring той ви дава възможност да избират вида на ФЩМ.За пример, XST обикновено избират една гореща кодиране, което не е пряко кодирани в твоя пример.Под имоти синтез, HDL опции, можете да изберете различен вид на ФЩМ.

 
Виждам какво причинява на синтез "капаче" предупреждения (Аз съм с ISE 7.1.03i).
Промяна на четири начин "ако" изявления, така че последният е "друг".XST понякога е дребнав за малко неща като това.

Вие сте прав tkbits.Има само един флопа в целия проект.

 
Здрасти,
да се предотврати inferring ключалки уверете се, че в последния отчет, ако структура ELSIF е ИНАЧЕ изявление.Ако това е ELSIF XST тогава непременно ще "подскаже едно капаче.И това, което аз виждам е, че дори output_process изглежда излишна.Можете да запазите на о сума / P в самата nextstate_process.Просто се опитай това.

С най-добри пожелания,

 
Трябва да използвате (когато другите =>) в случай изявление.Това също създава ключалки.

 
Тук имам пренаписал кода!
Надявам се това да ви помага да разберете как да използвате VHDL!

Код:

IEEE библиотека;

употреба ieee.std_logic_1164.all;лице е FSM

порт (

CLK, промените: в std_logic;

вход: в std_logic_vector (1 downto 0);

сума: Няма std_logic);

края лице;архитектура beh1 на ФЩМ е

тип state_type е (S1, S2);

сигнал състояние, next_state: state_type;сигнал i_input: std_logic_vector (1 downto 0);

започвамsequential_process: процес (CLK, нулиране)

започвам

ако (Reset = '1 '), тогава

държавни <= S1;

i_input <= (другите => '0 ');

ELSIF (CLK = '1 'и clk'event), тогава

държавни <= next_state;

i_input <= вход;

крайна сметка, ако;

sequential_process края процес;nextstate_process: процес (състояние, i_input)

започвам

случай държавата е

когато S1 =>

ако i_input = "11", тогава

next_state <= S2;

в противен случай

next_state <= състояние;

крайна сметка, ако;

когато S2 =>

ако i_input = "00", тогава

next_state <= S1;

в противен случай

next_state <= състояние;

крайна сметка, ако;

, когато другите => NULL;

края случай;

nextstate_process края процес;output_process: процес (състояние, i_input)

започвам

случай държавата е

когато S1 =>

сума <= i_input (0) XOR i_input (1);

когато S2 =>

сума <= (не i_input (0) XOR i_input (1));

, когато другите => NULL;

края случай;

output_process края процес;

края beh1;

 
XST все още не се заключи един ФЩМ, освен ако не използвате опция Аз не съм наясно.

Двупосочен случай е еквивалентно на АКО-ТОГАВА-друго, така че след тази оптимизация, резултатът не изглежда като ФЩМ да XST.

 
Код:IEEE библиотека;

употреба ieee.std_logic_1164.all;лице е FSM

порт (

CLK, Reset: В std_logic;

вход: в std_logic_vector (1 downto 0);

i_sum: OUT std_logic);

края лице;архитектура beh1 на ФЩМ е

тип state_type е (S1, S2, S3);

сигнал състояние, next_state: state_type;

- сигнал i_sum: std_logic;

сигнал i_input: std_logic_vector (1 downto 0);

започвамsequential_process: процес (CLK, нулиране)

започвам

ако (Reset = '1 '), тогава

държавни <= S1;

ELSIF (CLK = '1 'и clk'Event), тогава

държавни <= next_state;

i_input <= вход;

- Крайна сметка, ако;

- Ако (CLK = '0 'и clk'event), тогава

- Сума <= i_sum;

крайна сметка, ако;

sequential_process края процес;nextstate_process: процес (състояние, i_input)

започвам

случай държавата е

когато S1 =>

ако i_input = "00", тогава

next_state <= S1;

ELSIF i_input = "01", тогава

next_state <= S1;

ELSIF i_input = "10", тогава

next_state <= S1;

ELSIF i_input = "11", тогава

next_state <= S2;

в противен случай

next_state <= S1;

крайна сметка, ако;

когато S2 =>

ако i_input = "00", тогава

next_state <= S1;

ELSIF i_input = "01", тогава

next_state <= S2;

ELSIF i_input = "10", тогава

next_state <= S2;

в противен случай

next_state <= S2;

крайна сметка, ако;

когато s3 => next_state <= S3;края случай;

nextstate_process края процес;output_process: процес (състояние, i_input)

започвам

случай държавата е

когато S1 =>

ако i_input = "00", тогава

i_sum <= '0 ';

ELSIF i_input = "01", тогава

i_sum <= '1 ';

ELSIF i_input = "10", тогава

i_sum <= '1 ';

ELSIF i_input = "11", тогава

i_sum <= '0 ';

в противен случай

i_sum <= '0 ';

крайна сметка, ако;

когато S2 =>

ако i_input = "00", тогава

i_sum <= '1 ';

ELSIF i_input = "01", тогава

i_sum <= '0 ';

ELSIF i_input = "10", тогава

i_sum <= '0 ';

ELSIF i_input = "11", тогава

i_sum <= '1 ';

в противен случай

i_sum <= '1 ';

крайна сметка, ако;

когато s3 => i_sum <= '0 ';

края случай;

output_process края процес;

края beh1;

 
Това изглежда като много работа.Това ли е типичен за VHDL?Може би това е един академичен проект за учене ФЩМ.
В Verilog аз бих направил нещо подобно (неизпитани):

Код:

модул отгоре (CLK, нулиране, суровини, сума);

въвеждане на CLK, Reset;

вход [1:0] суровини;

обл състояние;

продукция сума;присвоите сума = ^ (състояние, входа);Винаги @ (posedge CLK) започва

държавни <= възстановите?
0: (входа == 'b11)?
1: (суровини == 'B00)?
0: държавата;

приключвам

endmodule
 
Да този проект е за образователна цел и аз ще правя повече упражнения като това, преди да започнем да работим по проект за недвижими ... Мисля, че кода може да бъде по-combact с помощта на два процеса, вместо на три ... си Verilog код изглежда атрактивно

<img src="http://www.edaboard.com/images/smiles/icon_eek.gif" alt="Шокиран" border="0" />

Аз може да научите Verilog прекалено ..

Следващата ми план сега трябва да попълни този образователен проект чрез добавяне на две смени parallel-in/serial-out регистри, чиито резултати (SO пина) са свързани към входовете на този сериен ФЩМ ехидна и изход serial-in/parallel-out смяна Регистрирайте се ..И тогава искам да се изгради контролер (Друг FSM), които ще генерират управляващи сигнали, които са нулиране singal за пореден усойница, Synchronous_Parallel_Load сигнали за въвеждане на промяна на регистрите.

Моите въпроси в момента:
1-Как може да администратора знам, че осем бита са били прехвърлени и резултатът е готова продукция в регистъра, е с 8-битов брояч решение?(запомнете това е образователен проект)

2-Кога трябва да бъде на synchronous_load сигнали, генерирани?Мисля, че ако администраторът ги натрупали по позитивен край, регистърът няма да бъде в състояние да го открият и байт няма да се зареди ..Аз не знам дали това, което искам да кажа, е правилна или не .. ПОМОЩ

<img src="http://www.edaboard.com/images/smiles/icon_neutral.gif" alt="Неутрални" border="0" />
 
1) Да, брояч ще работи много добре.8-бита ще ви позволи да брои до 255, така че е малко на Overkill.

2) В синхронен сигнал натоварване трябва да бъдат генерирани в часовник цикъл предходната актуализация край.Засега ми се струва, че регистрите (или гишета) винаги са натоварени на държавата преход.Така че моето решение е да даде възможност на товара на прехода състояние.Не е необходимо да се регистрирате.

 
nand_gates написа:

Тук имам пренаписал кода!

Надявам се това да ви помага да разберете как да използвате VHDL!Код:nextstate_process: процес (състояние, i_input)

започвам

случай държавата е

когато S1 =>

ако i_input = "11", тогава

next_state <= S2;

в противен случай

next_state <= състояние;

крайна сметка, ако;

когато S2 =>

ако i_input = "00", тогава

next_state <= S1;

в противен случай

next_state <= състояние;

крайна сметка, ако;

, когато другите => NULL;

края случай;

nextstate_process края процес;output_process: процес (състояние, i_input)

започвам

случай държавата е

когато S1 =>

сума <= i_input (0) XOR i_input (1);

когато S2 =>

сума <= (не i_input (0) XOR i_input (1));

, когато другите => NULL;

края случай;

output_process края процес;

края beh1;

 
[цитирам = "Престо] Аз не съм сигурен дали това е просто използват надеждни, за да", когато другите => нула ", тъй като докато е налице една държава липсват в" кога "списък, това ще сигурен, че до извода едно капаче.

В моя навик, аз обикновено се ", когато другите =>", за да генерират по подразбиране възстановите в sequencial част, например ", когато другите => next_state <= S1;", понякога грешка твърдението, както и в комбинаторни част задам право стойност по подразбиране след "започва", например "започва ... сума <= (другите => '0 '); ... случай ...".

Моля, позволете ми да знам дали съм сгрешил. [/ Цитат]
В VHDL, по подразбиране клон на Държавно изявление е НЕ, наложени от IEEE стандарт.Това е "предложи".В synthesisable кодиране стил, процесът на метода на "по подразбиране" зависи от синтеза на инструмент, който използвате.Някои се нуждаят, както и някои Dont.Съдържанието на "по подразбиране" трябва да се избира внимателно.Тя не трябва да застрашават вашия проект.В твоя случай, ако не defualt доза процес навреди вашата цел на проекта, можете да напишете или не, разбира се това, което пишете не е от голямо значение.

 

Welcome to EDABoard.com

Sponsor

Back
Top