Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум разработчиков электроники ELECTRONIX.ru _ Языки проектирования на ПЛИС (FPGA) _ FAQ по языкам описания аппаратуры

Автор: makc Aug 27 2006, 12:34

1. Общие вопросы.
1.1. Источники информации
1.1.1. Методические указания
1.1.2. Книги
1.1.3. Ссылки в Интернете
1.2. Готовые примеры
2. Синтезируемое подмножество языка.
3. Несинтезируемое подмножество языка (используется для моделирования, верификации и других целей).
4. Специфические вопросы (особенности синтезаторов, симуляторов, уловки при создании описаний).


1.1.1. Методические указания

<пока не написаны>

1.1.2. Книги

На русском языке:
01) Системы проектирования интегральных схем на основе языка VHDL. StateCAD. ModelSim. LeonardoSpectrum.
http://electronix.ru/redirect.php?http://www.solon-press.ru/shop.html?id=269
02) Основы языка VHDL. Изд. 2
http://electronix.ru/redirect.php?http://www.solon-press.ru/shop.html?id=128
03) Языки VHDL и VERILOG в проектировании цифровой аппаратуры
http://electronix.ru/redirect.php?http://www.solon-press.ru/shop.html?id=131
04) Проектирование цифровых систем на VHDL
http://electronix.ru/redirect.php?http://www.bhv.ru/books/book.php?id=966
05) Проектирование систем на микросхемах с программируемой структурой. 2-е издание
http://electronix.ru/redirect.php?http://www.bhv.ru/books/book.php?id=13328

На английском языке:
01) Circuit Design With VHDL
http://electronix.ru/redirect.php?http://www.amazon.com/gp/product/0262162245/sr=8-1/qid=1151347828/ref=pd_bbs_1/104-0975372-7627941?ie=UTF8
02) Digital Design with CPLD Applications and VHDL
http://electronix.ru/redirect.php?http://www.amazon.com/gp/product/1401840302/qid=1151347915/sr=2-1/ref=pd_bbs_b_2_1/104-0975372-7627941?s=books&v=glance&n=283155
03) VHDL Coding Styles & Methodologies
http://electronix.ru/redirect.php?http://www.amazon.com/gp/product/0792384741/qid=1151348014/sr=1-1/ref=sr_1_1/104-0975372-7627941?s=books&v=glance&n=283155%29
04) Digital Design with VHDL
05) VHDL Programming by example
http://electronix.ru/redirect.php?http://www.amazon.%D1%81om/gp/product/0071400702/qid=1151348316/sr=2-1/ref=pd_bbs_b_2_1/104-0975372-7627941?s=books&v=glance&n=283155
06) The VHDL Cookbook (by Peter J. Ashenden)
07) Digital Design VHDL Laboratory Notes (by Cecil Alford)
08) VHDL Design Representation and Synthesis
http://electronix.ru/redirect.php?http://www.amazon.com/gp/product/0130216704/qid=1151348657/sr=1-1/ref=sr_1_1/104-0975372-7627941?s=books&v=glance&n=283155
09) A VHDL Primer http://electronix.ru/redirect.php?http://www.amazon.com/gp/product/0130965758/qid=1151348755/sr=2-1/ref=pd_bbs_b_2_1/104-0975372-7627941?s=books&v=glance&n=283155


1.1.3. Ссылки в Интернете (Для тех, кому лень тянуться за книгами).

01) VHDL технологии в представлении ЦНИИ Навигации и Управления
http://electronix.ru/redirect.php?http://www.kvantn.com.ua/resourse/All/VHDL/VHDL_context.html
02) VHDL MINI-REFERENCE
http://electronix.ru/redirect.php?http://www.eng.auburn.edu/department/ee/mgc/vhdl.html
03) Tutorial, examples, links, tools and books related to Verilog.
http://electronix.ru/redirect.php?http://www.asic-world.com/verilog/index.html
04) VHDL Tutorial: Learn by Example by Weijun Zhang
http://electronix.ru/redirect.php?http://esd.cs.ucr.edu/labs/tutorial/
05) Набор ссылок на различные ресурсы по VHDL (и Verilog).
http://electronix.ru/redirect.php?http://members.aol.com/SGalaxyPub/useful_links_vhdl.htm
06) VHDL Manual
http://electronix.ru/redirect.php?http://mikro.e-technik.uni-ulm.de/vhdl/anl-engl.vhd/html/vhdl-all-e.html
07) Handbook on Verilog HDL
http://electronix.ru/redirect.php?http://www.eg.bucknell.edu/%7Ecs320/1995-fall/verilog-manual.html-
08)VHDL обучающий портал
http://electronix.ru/redirect.php?http://www.bsuir.unibel.by/vhdl/
09) VHDL handbook
http://electronix.ru/redirect.php?http://www.hardi.com/haps/literature/VHDL-Handbook.pdf
10) On-line Verilog HDL Quick Reference Guide
http://electronix.ru/redirect.php?http://www.sutherland-hdl.com/on-line_ref_guide/vlog_ref_top.html
11) Hamburg VHDL archive
http://electronix.ru/redirect.php?http://tech-www.informatik.uni-hamburg.de/vhdl/
12) Центральный источник информации - http://electronix.ru/redirect.php?http://vhdl.org/, включая:
........FAQ from comp.lang.vhdl http://electronix.ru/redirect.php?http://vhdl.org/comp.lang.vhdl/
........RASSP Support Page for VHDL http://electronix.ru/redirect.php?http://vhdl.org/rassp/vhdl/

Автор: Gate Aug 27 2006, 16:58

Добавка в 1.1.3
09) VHDL handbook
http://electronix.ru/redirect.php?http://www.hardi.com/haps/literature/VHDL-Handbook.pdf

Автор: id_gene Aug 28 2006, 08:22

Добавка в 1.1.3
10) On-line Verilog HDL Quick Reference Guide http://electronix.ru/redirect.php?http://www.sutherland-hdl.com/on-line_ref_guide/vlog_ref_top.html
11) Hamburg VHDL archive http://electronix.ru/redirect.php?http://tech-www.informatik.uni-hamburg.de/vhdl/
12) http://electronix.ru/redirect.php?http://vhdl.org, включая:
........FAQ from comp.lang.vhdl http://electronix.ru/redirect.php?http://vhdl.org/comp.lang.vhdl/
........RASSP Support Page for VHDL http://electronix.ru/redirect.php?http://vhdl.org/rassp/vhdl/


Широкий круг статей по Verilog/SystemVerilog http://electronix.ru/redirect.php?http://www.sunburst-design.com/papers/
Относится ко всем пунктам FAQ.

Автор: Thistle Aug 28 2006, 16:03

ninja.gif разведка докладывает книги заданной тематики обнаружены по следующим адресам(пароли и явки прилагаются (с) Путин) :
1. Circuit Design with VHDL
http://electronix.ru/redirect.php?http://rapidshare.de/files/5271422/MIT.Press_.Circuit.Design.with.VHDL._2004_.TLF.pdf.html
password: ebooksatkoobe
благодарим cyberwolf
2. Digital Design with CPLD Applications and VHDL
http://electronix.ru/redirect.php?http://www.ebooksclub.org/?link=lnp148
благодарим schullo
3. Digital Design with CPLD Applications and VHDL, 2E
http://electronix.ru/redirect.php?http://rapidshare.de/files/19836973/1401840302.rar
Password: ebooksclub.org
4. Digital Logic and Microprocessor Design with VHDL
http://electronix.ru/redirect.php?http://rapidshare.de/files/7260676/Microprocessor_Design_VHDL_MAZ.rar.html

OR

http://electronix.ru/redirect.php?http://www.megaupload.com/?d=RCS50ZWI
благодарим maz
5. Fundamentals of Digital Logic with VHDL Design (McGraw-Hill Series in Electrical and Computer Engineering)

http://electronix.ru/redirect.php?http://rapidshare.de/files/13200896/Fundamentals_of_Digital_Logic_with_VHDL__Brown_Vranesic-2005_.pdf.html

благодарим m_s_z2002
6. VHDL Coding Styles and Methodologies, 1st edition (August 31, 1995)
http://electronix.ru/redirect.php?http://rapidshare.de/files/11508458/vcsm.rar
Password: cathome
благодарим batangass
7. RTL Hardware Design Using VHDL : Coding for Efficiency, Portability, and Scalability
http://electronix.ru/redirect.php?http://rapidshare.de/files/21735494/Wiley.IEEE.Press.RTL.Hardware.Design.Using.VHDL.Apr.2006.eBook-BBL.rar.html

PASSWORD: ebooksatkoobe
благодарим maxxum
8. VHDL : Programming By Example
Link: http://electronix.ru/redirect.php?http://rapidshare.de/files/7914524/VHDL.Programming.by.Example.4th.Ed.rar.html
Password: ebooksclub.org

ninja.gif

Автор: ogurets Sep 13 2006, 20:37

цитата
3. Digital Design with CPLD Applications and VHDL, 2E
http://electronix.ru/redirect.php?http://rapidshare.de/files/19836973/1401840302.rar
Password: ebooksclub.org
конец цитаты

Это никакое не второе издание, а самое что ни есть предыдущее 2000 года 841 стр по MAX+PLUS II :(
Во втором издании 1024 pages и VHDL and Quartus II

Автор: Doka Sep 26 2006, 14:26

Цитата(KuklaVod @ Sep 26 2006, 14:25) *
Люди а есть че нить на русском?
или совсем бывает ли?
http://electronix.ru/redirect.php?http://www.plis.ru/page.php?id=5

Автор: Partisan Sep 28 2006, 04:13

Цитата(ogurets @ Sep 28 2006, 03:52) *
Дж. Уэйкерли Проектирование цифровых устройств в 2-х т. Постмаркет Москва 2002 г., всего 1088 стр.
Про ABEL и VHDL. djvu 12 метров
было найдено у вьетнамцев (если я ничего не перепутал) на www.vsofts.net , правда под названием Digital Design (3rd Edition) M. Morris Mano Morris M Mano, загружал модератор по нику Vodka1504, мож чего перепутал smile.gif
Forum > Resources > Ebook > Electronics

http://electronix.ru/redirect.php?http://server1.vsofts.net/Ebooks/Electronic_Ebook_Group/Vodka1504/7001-7020/wakerly.part1.rar
http://electronix.ru/redirect.php?http://server1.vsofts.net/Ebooks/Electronic_Ebook_Group/Vodka1504/7001-7020/wakerly.part2.rar
http://electronix.ru/redirect.php?http://server1.vsofts.net/Ebooks/Electronic_Ebook_Group/Vodka1504/7001-7020/wakerly.part3.rar
http://electronix.ru/redirect.php?http://server1.vsofts.net/Ebooks/Electronic_Ebook_Group/Vodka1504/7001-7020/wakerly.part4.rar

Pass: www.vsofts.net

Автор: AnubiX May 17 2007, 11:03

На мой взгляд вот эта книга плохая - будьте внимательны:
06) The VHDL Cookbook (by Peter J. Ashenden)

Автор: Omen_13 Jun 18 2007, 20:29

Жаждущим рускоязычной книги - нашёл у Ихтика:
http://electronix.ru/redirect.php?http://ihtik.2x4.ru/complit_22janv2007/complit_22janv2007_4895.rar

Автор: Сергей s7 May 26 2008, 10:01

Подскажите, с чего начать, если начинаю практически с 0!!!!!!!!!!!!!! help.gifСпасибо!

Автор: Maverick May 26 2008, 11:50

Цитата(Сергей s7 @ May 26 2008, 13:01) *
Подскажите, с чего начать, если начинаю практически с 0!!!!!!!!!!!!!! help.gifСпасибо!


Ниже русскоязычные источники и книги

Сергиенко VHDL для проектирования вычислительных устройств 2003
http://electronix.ru/redirect.php?http://www.infanata.org/2006/10/29/vhdl_dlja_proektirovanija_vychislitelnykh_ustrojjstv_sergienko_a_m.html

Бибило П.Н. Основы языка VHDL
http://electronix.ru/redirect.php?http://www.infanata.org/2007/03/21/osnovy_jazyka_vhdl.html

Е.А Суворова с Ю. Е. Шейнин Проектирование цифровых систем на vhdl
http://electronix.ru/redirect.php?http://www.infanata.org/2006/10/19/proektirovanie_cifrovykh_sistem_na_vhdl.html

Поляков А. К. Языки VHDL и Verilog
http://electronix.ru/redirect.php?http://www.infanata.org/2007/02/11/poljakov_jazyki_vhdl_i_verilog_v_proektirovanii_cifrovojj_apparatury.html

Автор: MrYuran May 26 2008, 11:53

чё-то я щас прошёлся, половина ссылок не работает..

Автор: Антон_ВТ Jul 30 2008, 14:53

http://electronix.ru/redirect.php?http://systemc.dax.ru - обучающий материал по SystemC.

Автор: CaPpuCcino Oct 17 2008, 17:37

люди добрые, объясните, какой бит какому будет присвоен в Верилоге в следующем случае:

module little_big_assignment;
reg [0:7] little;
reg [3:0] big;
initial
little=big;
endmodule

спс

Автор: des00 Oct 20 2008, 02:59

Цитата(CaPpuCcino @ Oct 17 2008, 12:37) *
люди добрые, объясните, какой бит какому будет присвоен в Верилоге в следующем случае:

module little_big_assignment;
reg [0:7] little;
reg [3:0] big;
initial
little=big;
endmodule


ИМХО :

little[0:3] = 3'bxxxx
little[4] = big[3]
little[5] = big[2]
little[6] = big[1]
little[7] = big[0]

ответ основываю на стандарте :

3.3.1 Specifying vectors

Цитата
The range specification gives addresses to the individual bits in a multibit net or reg. The most significant bit
specified by the msb constant expression is the left-hand value in the range and the least significant bit spec-
ified by the lsb constant expression is the righthand value in the range.


Как я понял msb всегда стоит слева, lsb справа. не важно какие индексы. И арифметика всегда работает по этим правилам.

Косвенное подтверждение этому

4.2.1 Vector bit-select and part-select addressing

Цитата
Example 1 The following example specifies the single bit of acc vector that is addressed by the operand
index.
acc[index]
The actual bit that is accessed by an address is, in part, determined by the declaration of acc. For instance,
each of the declarations of acc shown in the next example causes a particular value of index to access a
different bit:
reg [15:0] acc;
reg [2:17] acc

Автор: CaPpuCcino Oct 20 2008, 10:44

Цитата(des00 @ Oct 20 2008, 06:59) *
ИМХО :

little[0:3] = 3'bxxxx
little[4] = big[3]
little[5] = big[2]
little[6] = big[1]
little[7] = big[0]

спасибо, des00. не мог найти в стандарте прямого указания на это в встандартах. Precision действует именно так. сложность вопроса была в том, по каккому биту будет происходить выравнивание векторов - по нулевому little-а (и тогда присвоение д.б. little[0]=big[3] little[1]=big[2]...) или по нулевому big-а (и тогда по вашей схеме) - чёткого разъяснения я в стандарте не вычитал

Автор: dvladim Oct 26 2008, 16:17

NCVerilog (какой версии не помню и посмотреть не смогу) ругается на различиющееся направление индексов и не компилируется.

Автор: CaPpuCcino Oct 26 2008, 16:38

недогляд cadence-a подобные присваивания стандартом не запрещены (раньше mentor на такое тож ругался)

Автор: dvladim Nov 1 2008, 19:21

Ну как сказать. Я не считаю это неправильным. Это, ИМХО, повышает надежность. Лучше уж самому функцию сделать, чем пропустить в проекте.

Автор: CaPpuCcino Nov 1 2008, 20:22

Цитата(dvladim @ Nov 1 2008, 23:21) *
Лучше уж самому функцию сделать, чем пропустить в проекте.

дело вкуса. но из-зи того, что верилог ещё не научили делать шаблоны функций (тип как параметр), писать свою функцию для пакованного массива каждого типа данных мне не охота. я например на ВХДЛ забил как раз из-за того, что влом писать отдельную функцию сложения для каждого примитивного типа данных (утрирую конечно)

Автор: yagger Jan 24 2009, 12:41

Нахожусь в самом начале изучения ПЛИС. (Altera)
Начал изучение с языка AHDL.
Что посоветуете: легко ли и надо ли вообще будет переходить потом на VHDL или достаточно будет знаний в AHDL писать не самые сложные проекты?

Многие пишут, что в среде разработки (макс или квартус) уже имеются модули всяких там счетчиков , регистров и т.д и т.п. т.е. их не надо писать с нуля самому, собирая из триггеров и логики, вопрос где я могу почитать про ЭТИ готовые функции на русском?
Честно говоря читая инфу по языку уже столкнулся с непонятием:
с логикой обычной вроде как понимаю, а вот Последовательностная логика

SUBDESIGN bur_reg
(
clk, load, d[7..0] : INPUT;
q[7..0] : OUTPUT;
)
VARIABLE
ff[7..0] : DFFE;
BEGIN
ff[].clk = clk;
ff[].ena = load;
ff[].d = d[];
q[] = ff[].q;
END;
что такое DFFE и ff[]??? откуда это без объяснений взялось и как это работает? Из моего понимания DFFE это функция триггера, а ff[].хх это сноска на внутренний вывод этой функции... но вот если я найду например какую нить функцию... или мне например надо найти такую, то где мне почитать что вот эти ff[] выполняют в неизвестной найденной мной функции? (с английским в том то и проблема, медленно.) Помогите плз.

Автор: Stas Jan 24 2009, 16:59

DFFE - триггеры количеством 8, с именем ff. Все вместе - регистр разрядностью 8. Описание триггера можно найти в help в MaxPlus или Quartus в разделе примитивы (primitives). ff[].clk = clk; - подключение к 8 триггерам тактового, ff[].ena - вход разрешения загрузки, ff[].d - вход данных, ff[].q - выходы триггеров.

Автор: vetal Jan 24 2009, 17:31

2yagger: Пользоваться поисковыми системами уже не модно?
http://electronix.ru/redirect.php?http://www.sm.bmstu.ru/sm5/n4/oba/gl3.html

Автор: yagger Jan 24 2009, 20:15

ммммм, возможно я неправильно выразился. 1111493779.gif
повторюсь:
но вот если я найду например какую нить функцию... или мне например надо найти такую, то где мне почитать что вот эти ff[] выполняют в неизвестной найденной мной функции? (с английским в том то и проблема, медленно.) Помогите плз.

где мне найти описание СТАНДАРТНЫХ функций альтеры? хотябы основных!!! счетчики, регистры, мультиплексоры.... (на русском языке), прочитав раз на русском, потом легче впитывать описание незнакомых функций на англицком. rolleyes.gif

Автор: vetal Jan 24 2009, 20:47

Описание выводов этих функций находится в справке. Описание работы счетчиков, регистров и пр. находится в справочниках по цифровой технике. В хелпе на все функции находится таблица истинности для понимания которой не требуется знание английского языка. Описание по 10 страниц на каждый элемент вы не найдете, т.к. оно не нужно.

Автор: SFx Jan 24 2009, 20:52

Цитата(yagger @ Jan 24 2009, 23:15) *
где мне найти описание СТАНДАРТНЫХ функций альтеры? хотябы основных!!! счетчики, регистры, мультиплексоры.... (на русском языке), прочитав раз на русском, потом легче впитывать описание незнакомых функций на англицком. rolleyes.gif



Ключевое слово MegaWizard Plugin manager.

Там можно выбрать что Вам нужно, счетчик или еще что то. Quartus щас не стоит у меня, но в одной из менюшек есть такой пункт, кажется в tools...
там нужно выбрать название фала и тип его для генерации устройства. потом этот файл можно подключить череp INCLUDE.

Автор: yagger Jan 25 2009, 12:20

Спасибо за ответы. Буду учиться. rolleyes.gif

Автор: Фурзикова Apr 17 2009, 11:57

У меня вопрос специфический, но вдруг кто-нибудь знает? Помогите, пожалуйста!

Меня интересует литература по объектно-ориентированным расширениям VHDL. Больше всего, конкретно - по SUAVE. Книг таких, по-моему, нет, но хотя бы статьи - желательно с описанием синтаксиса.
К примеру, в сети много упоминаний о статьях Peter Asenden, выход на сами статьи - ?
То есть, вроде как-то можно заказать. А если просто так? Может, многого хочу, но я просто спрашиваю.

То же самое журналы. Например, хотелось бы найти Design and Test of Computers (April-June 1998).

Заранее спасибо, если кто отзовется.

Автор: CaPpuCcino Apr 18 2009, 19:25

хочу поделится одной штукой в Верилоге, которая меня сейчас сильно ухмыльнула (потратил на неё часа 2, отлавливая баг в программе).
как вы думаете чему равно выражение:

address=(y_coordinate*(picture_width>>2+1)+x_coordinate)*2;

при y_coordinate=2, picture_width=16, x_coordinate=3 ?

ЗЫ: ответ для самостоятельной проверки - корень квадратный из 196
и главное, что везде использовал оператор сдвига подобающим образом, а тут при числовых коэфициентах никак не мог заметить ошибки, вот что значит экономить на скобках smile.gif

Автор: sazh Apr 18 2009, 20:18

Цитата(CaPpuCcino @ Apr 18 2009, 23:25) *
хочу поделится одной штукой в Верилоге, которая меня сейчас сильно ухмыльнула (потратил на неё часа 2, отлавливая баг в программе).
как вы думаете чему равно выражение:

address=(y_coordinate*(picture_width>>2+1)+x_coordinate)*2;

при y_coordinate=2, picture_width=16, x_coordinate=3 ?

ЗЫ: ответ для самостоятельной проверки - корень квадратный из 196
и главное, что везде использовал оператор сдвига подобающим образом, а тут при числовых коэфициентах никак не мог заметить ошибки, вот что значит экономить на скобках smile.gif


А железячник наверно бы picture_width>>2 как picture_width[x:2] оформил. И на разрядности бы съэкономил.
(Чтоб без предупреждений)

Автор: CaPpuCcino Apr 18 2009, 23:47

Цитата(sazh @ Apr 18 2009, 23:18) *
А железячник наверно бы picture_width>>2 как picture_width[x:2] оформил. И на разрядности бы съэкономил.
(Чтоб без предупреждений)

beer.gif а программер наверное как "picture_width/4" (но думаю это единообразно, потому как синтезатор такую ерунду должен оптимизировать)
ЗЫ: я как-то для рабочей задачки к проекту по преобразованию бит-мапа написал на Си в цикле такую фразу for (j=0;j<num_dwords;j++){... if ((j&3)==3) fprintf(pic_mem, "\n");} так наш программист долго смотрел на это и так и не понял, при каких значениях переводится каретка lol.gif

Автор: des333 Apr 26 2009, 09:03

Цитата(CaPpuCcino @ Apr 18 2009, 23:25) *
хочу поделится одной штукой в Верилоге, которая меня сейчас сильно ухмыльнула (потратил на неё часа 2, отлавливая баг в программе).
как вы думаете чему равно выражение:

address=(y_coordinate*(picture_width>>2+1)+x_coordinate)*2;

при y_coordinate=2, picture_width=16, x_coordinate=3 ?

ЗЫ: ответ для самостоятельной проверки - корень квадратный из 196
и главное, что везде использовал оператор сдвига подобающим образом, а тут при числовых коэфициентах никак не мог заметить ошибки, вот что значит экономить на скобках smile.gif

Да, приоритеты иногда играют злую шутку.  smile.gif

Автор: Мур Nov 3 2010, 07:20

Цитата(des333 @ Apr 26 2009, 12:03) *
Да, приоритеты иногда играют злую шутку.  smile.gif

Хочу задать вопрос метрам FPGA более широкого плана ....о приоритетах. Может даже философского плана...
Дело в том, что лет 15 назад Borland психанул и выпустил интересный продукт TurboProlog. Тогда это было необычно и модно, но послевкусие осталось. Принципы искусственного интеллекта я прочувствовал после 4 месяцев усиленного программирования на нём.
Всё совершенно по другому, нежели в процедурных языках.
1. Ты описываешь среду поиска (правила в пространстве поиска решения).
2. Формулирушь цель, которуая тебе нужна.
Дальше машина сама находит решения. Остаётся только выбирать подходящее. biggrin.gif

Мы действуем традиционно. Описываем подробно как решать тот или иной фрагмент поэтапно. Шаг за шагом ...по алгоритму.

Неужели до сих пор не нашлось энтузиаста, который бы
1.описал макроячейку ПЛИС, связи с соседями и временные соотношения(описал среду)
2. на простых задачах показал бы к какому поведению приводит то или иное соединение (обучил систему)
3. попытался формально сформулировать цель поиска решения с приемлимыми условиями на выходе ????

Мне кажется это вполне естественным.
Я догадываюсь, что такое в синтезаторе уже есть, но тогда должен быть и язык который бы позволял напрямую описывать результат поиска решения, а не пошаговое описание решения задачи человеком...

Есть такое? Как его величают? Скорее всего такое может быть у братьев Белорусов...

Автор: CaPpuCcino Nov 3 2010, 20:55

Цитата(Мур @ Nov 3 2010, 10:20) *
Дальше машина сама находит решения. Остаётся только выбирать подходящее. biggrin.gif

в том-то и дело, что теорем-пруверы работают в плотном взаимодействии с оператором теперь представьте на сколько эффективным будет в таком случает сколько-нибудь сложной системы. вообще аналог есть - это ESL синтез. он тоже интерактивный.

Автор: Shtirlits Nov 3 2010, 21:58

Можно ли где-то в меру подробно почитать про ESL-синтез и как выглядит интеркативность?

Автор: CaPpuCcino Nov 4 2010, 04:56

Цитата(Shtirlits @ Nov 4 2010, 00:58) *
Можно ли где-то в меру подробно почитать про ESL-синтез

Brian Bailey + ещё двое "ESL Design and Verification: A Prescription for Electronic System Level Methodology"(2007) - это общая концепция сквозного ESL дизайна. будет полезна не только тем кто планирует поиграться с ESL синтезом, но и тем кто интересуется стройной картиной сквозного логического дизайна "сверху-вниз". кроме прочего описан принцип ESL синтеза(2,5главы), но без технических особенностей. так что кому прочие аспекты не интересны могут сразу читать соотв.главы для общего предст. о синтезе. вообще книга полезная вся - state-of-the-art дизайна.
High-Level Synthesis From Algorithm to Digital Circuit под ред. Philippe Coussy + 1 (2008) - вот эта книжка конкретная по конкретным технологиям и тулзам. по сути сборник статей. в том числе есть главы о Catapult, Forte’s Cynthesizer, Bluespec.
и есть ещё одна продолжение первой (тех же авторов),но я её ещё не читал, поэтому без конкретных рекомменд.
ESL Models and their Application: Electronic System Level Design and Verification in Practice (конец 2009)- это в общем-то case study
Цитата(Shtirlits @ Nov 4 2010, 00:58) *
как выглядит интеркативность?

интерактивность выглядит в основном как выбор вариантов исполнения выч.блоков, в т.ч. таймингов(латентности) вычислительных блоков. например выбор длинны конвейера выч.блока(если он конечно конвеерный).
ЗЫ: сразу прошу не устраивать флуда о том, что это конец эры HDL разработчиков (и даже не начало конца), потому что это не так. а чтобы понять почему - посмотрите вторую книжку и всё поймёте.

Автор: Мур Nov 4 2010, 06:52

Цитата(CaPpuCcino @ Nov 3 2010, 23:55) *
в том-то и дело, что теорем-пруверы работают в плотном взаимодействии с оператором теперь представьте на сколько эффективным будет в таком случает сколько-нибудь сложной системы. вообще аналог есть - это ESL синтез. он тоже интерактивный.

А как-же!? Только с течением времени тулз обучается на базе опыта оператора...
Тут другая проблема,- описание цели! Чтобы лаконично и понятно, что и когда(во времени) надо получить... Это нельзя сделать не усвоив описание среды поиска. И может даже редактировать это описание по ходу!

Спасибо за информацию! Обязательно погружусь..А белорусов я упомянул потому, что они упрямо продолжают развивать свои БМК.

Автор: CaPpuCcino Nov 4 2010, 07:09

Цитата(Мур @ Nov 4 2010, 09:52) *
Тут другая проблема,- описание цели!

там много прикладных проблем - и формулировка аксиом (т.е. то что вы относите к описанию среды) и формулировка теорем (то что "цель") ((NB:я не очень уверен в русскоязычной терминологии)). в общем проблема в формализации и недостаточности мощи ИИ на данный момент, чтобы делать это автоматически. я просто не хочу вдаваться в подробности, т.к. прикладного интереса для меня эта тема не представляет, а по3.14деть за жизнь - тема флудливая и с 0 на выходе.
Цитата(Мур @ Nov 4 2010, 09:52) *
белорусов я упомянул потому, что они упрямо продолжают развивать свои БМК.

а белорусы молодцы! желаю им всяческого успеха в развитии собственной технологичной промышленности.

Автор: sazh Nov 4 2010, 08:53

Цитата(Мур @ Nov 4 2010, 09:52) *
А белорусов я упомянул потому, что они упрямо продолжают развивать свои БМК.


А ссылку на сайт можете указать?

Автор: Мур Nov 4 2010, 11:34

Цитата(sazh @ Nov 4 2010, 11:53) *
А ссылку на сайт можете указать?

Я точно не знаю как они с ИИ..
http://electronix.ru/redirect.php?http://www.uiip.bas-net.by/rus/l_ld_project__1.html
http://electronix.ru/redirect.php?http://belisa.org.by/other/catalog12/project256e.html?projectSN=162
Тут и Зеленоград не отстаёт...
http://electronix.ru/redirect.php?http://www.ru.all-biz.info/g314433/
http://electronix.ru/redirect.php?http://mri-progress.ru/?cat=5
Тут скопом
http://electronix.ru/redirect.php?http://www.silab.su/index.php/ru/forum/topic?id=1

Это потециальные инициаторы работ по системам проектирования. Только что на самом деле?

Можно было бы и самим, если бы знать форматы бит заливки на соответствие конфигурациям макроячеек,шинам и портам В\В. Ошибка в этом недопустима.
Разработчики БМК этим распологают...

Автор: sazh Nov 4 2010, 11:58

Цитата(Мур @ Nov 4 2010, 14:34) *
Только что на самом деле?


Вот и я не знаю.
Основная проблема, на мой взгляд, полное отсутствие ответственности за то что пишут в буклетах и каталогах.

Автор: CaPpuCcino Nov 4 2010, 13:46

Цитата(sazh @ Nov 4 2010, 14:58) *
Основная проблема, на мой взгляд, полное отсутствие ответственности за то что пишут в буклетах и каталогах.

эта проблема маркетингом зовётся(хотя с учётом местного колорита иногда очковтирательством высокому начальству) wink.gif

Автор: Elins Jan 18 2012, 11:59

Друзья и коллеги, подскажите, что за конструкция на Verilog?

Качнул модель памяти с cypress. Название модели CY7C1470V33-1XW-Verilog.
Внутри есть конструкции такого плана:
tsti[8] = tsti[7] ^^ tsti[6] ^^ tsti[5] ^^ tsti[4] ^^ tsti[3] ^^ tsti[2] ^^ tsti[1] ^^ tsti[0];
Операция ^ - понятно, а что означает "^^" в данном случае?


Автор: des00 Jan 18 2012, 12:18

Цитата(Elins @ Jan 18 2012, 05:59) *
Друзья и коллеги, подскажите, что за конструкция на Verilog?

Качнул модель памяти с cypress. Название модели CY7C1470V33-1XW-Verilog.
Внутри есть конструкции такого плана:
tsti[8] = tsti[7] ^^ tsti[6] ^^ tsti[5] ^^ tsti[4] ^^ tsti[3] ^^ tsti[2] ^^ tsti[1] ^^ tsti[0];
Операция ^ - понятно, а что означает "^^" в данном случае?

первый бинарный, второй унарный. если tsti[x] это биты, то не понятно зачем это сделано, если вектора, то какая то обобщенная четность %)

Автор: Elins Jan 18 2012, 12:50

в заголовке модуля тип переменной указан
"reg [35:0] tsti;"

В описании на ZBT память нашел описание про так называемые биты паритета. Шина данных разрядности 36, из них 4 бита - те самые биты паритета (DQPx). Что они из себя представляют мне из описания не ясно "Functionally, these signals are identical to DQx".
Очевидно автор модели на cypress таким хитрым образом формирует те самые биты.

tsti[35] = tsti[34] ^^ tsti[33] ^^ tsti[32] ^^ tsti[31] ^^ tsti[30] ^^ tsti[29] ^^ tsti[28] ^^ tsti[27];
tsti[26] = tsti[25] ^^ tsti[24] ^^ tsti[23] ^^ tsti[22] ^^ tsti[21] ^^ tsti[20] ^^ tsti[19] ^^ tsti[18];
tsti[17] = tsti[16] ^^ tsti[15] ^^ tsti[14] ^^ tsti[13] ^^ tsti[11] ^^ tsti[11] ^^ tsti[10] ^^ tsti[9];
tsti[8] = tsti[7] ^^ tsti[6] ^^ tsti[5] ^^ tsti[4] ^^ tsti[3] ^^ tsti[2] ^^ tsti[1] ^^ tsti[0];

Однако вопрос остается открытм, не понимаю sad.gif

Автор: ViKo Jan 18 2012, 13:43

Цитата(Elins @ Jan 18 2012, 14:50) *
Однако вопрос остается открытым, не понимаю

Если бы переменные были многоразрядные, то ^tsti выдавало бы "исключающее или" всех разрядов. А ^tsti[1] ^ ^tsti[2] выдавало бы "исключающее или" для двух таких операций. В-общем, бит четности.

Автор: Elins Jan 18 2012, 16:50

Цитата(ViKo @ Jan 18 2012, 17:43) *
Если бы переменные были многоразрядные, то ^tsti выдавало бы "исключающее или" всех разрядов. А ^tsti[1] ^ ^tsti[2] выдавало бы "исключающее или" для двух таких операций. В-общем, бит четности.

Спасибо за ответы. Стало понятно.

Автор: Araxnid Mar 4 2012, 12:41

Подскажите, как один порт подключить к трем в порт мапе.
Для примера, есть у меня два entity, одно с портом выход, другое с тремя портами на вход.
Объявляю в одном entity другой, (компонент), дальше задаю карту портов, и хочу чтобы с выхода данные цеплялись на все три входа.
Если делаю, что-то в таком духе:
load => R_A0,
load => R_C0,
load => R_B0,

То квартус ругается - Error (10347): VHDL error at e1.vhd(4220): formal parameter "Load" is already associated
Есть, конечно, вариант, что я сделаю три сигнала на три сигнала, но придется менять код, и лишние вещи делать не хочется..

Автор: des00 Mar 4 2012, 14:10

Цитата(Araxnid @ Mar 4 2012, 06:41) *
Подскажите, как один порт подключить к трем в порт мапе.
Для примера, есть у меня два entity, одно с портом выход, другое с тремя портами на вход.
Объявляю в одном entity другой, (компонент), дальше задаю карту портов, и хочу чтобы с выхода данные цеплялись на все три входа.
Если делаю, что-то в таком духе:
load => R_A0,
load => R_C0,
load => R_B0,

Вместо того, что бы к 3-м экзямпляром выходного порта подцеплять 3 входных, надо подцепить на каждый входной порт, нужный выходной.

ЗЫ. ладно не хотите заниматься RTFM, но куда делать логика здравого смысла ? %)

Автор: Димыч Sep 9 2012, 19:16

 HDL_vs_SCH.rtf ( 99.95 килобайт ) : 430


Всем доброго времени суток!

Вчера, для аргументирования перехода со схемного ввода на HDL (для коллег), набросал небольшой документ. sm.gif - во вложении.

Если есть комментарии - велкам sm.gif


Автор: iosifk Sep 10 2012, 05:47

Цитата(Димыч @ Sep 9 2012, 23:16) *
 HDL_vs_SCH.rtf ( 99.95 килобайт ) : 430


Всем доброго времени суток!

Вчера, для аргументирования перехода со схемного ввода на HDL (для коллег), набросал небольшой документ. sm.gif - во вложении.

Если есть комментарии - велкам sm.gif


Написано большей частью верно. Вот только не написано самого основного - про отладку проектов, особенно больших. Посмотрите у меня на сайте, в статьях "Краткий Курс", о том как отлаживать, как подгружать в тестбенч данные из файлов и как данные выводить на монитор...
И еще. В русском, термина "схематик" - нет! Это жаргон!

Автор: stu Sep 10 2012, 10:42

Некоторые моменты заинтересовали. Если не трудно, поясните пжлст.
------------------------------------------------------------------------------------------------
2. Параметризация. В HDL модуля легко параметризируются - либо "модулях", либо "модули", нет?
------------------------------------------------------------------------------------------------
6. Версионность. Для проектов, написанных на схематике - думаю, описываем, нет?
------------------------------------------------------------------------------------------------
10. Открытые базы проектов. На данный момент существует большое количество как открытых, так и платных проектов/коров/модулей на HDL - что это? Не слышал.
------------------------------------------------------------------------------------------------
Реализован простой механизм, который позволяет дизайнеру безболезненно переключаться между различными описаниями (вариантами) одного и того же вложенного модуля - мне очень интересно что это значит? Что мешает в Верилоге описать модули Test, Test_2, а при вызове просто поменять поменять из:

Код
...
Test #(parameters)
tst(in, out ports);
....

в
Код
...
Test_2 #(parameters)
tst(in, out ports);
...

если порты и параметры одинаковы, а отличается только лишь внутренняя структура файла ????

Автор: sazh Sep 10 2012, 11:21

Цитата(stu @ Sep 10 2012, 13:42) *
Некоторые моменты заинтересовали. Если не трудно, поясните пжлст.

А зачем.
Обычно в графическом редакторе работают разработчики старшего поколения.
Они будут исходить из принципа разумной достаточности.
Этим должно озадачиться руководство. (Новые проекты - только на стандартизированных языках описания аппаратуры)

Автор: stu Sep 10 2012, 11:35

Цитата(sazh @ Sep 10 2012, 15:21) *
А зачем.
Обычно в графическом редакторе работают разработчики старшего поколения.
Они будут исходить из принципа разумной достаточности.
Этим должно озадачиться руководство. (Новые проекты - только на стандартизированных языках описания аппаратуры)

Что "зачем"... Вы то тут причем? Заинтересовало, попросил пояснить...
Руководству проекты готовые нужны быстро и сейчас. Пока они операторы изучат, пока конструкции с ними... ну Вы поняли

Автор: slawikg Sep 14 2012, 17:56

Цитата(Димыч @ Sep 9 2012, 22:16) *
 HDL_vs_SCH.rtf ( 99.95 килобайт ) : 430


Всем доброго времени суток!

Вчера, для аргументирования перехода со схемного ввода на HDL (для коллег), набросал небольшой документ. sm.gif - во вложении.

Если есть комментарии - велкам sm.gif


Я бы хотел говорить чуть шире, о графическом описании проектов, поскольку кроме схем существуют ещё, блок-схемы алгоритмов, диаграммы автоматов.

1. Ничто не мешает создать текстовый модуль и сделать соответствующую текстовую конструкцию, а затем вставить в модуль более высокого уровня описанным в графике.

2. Никаких проблем в графике с параметризацией нет, всё тоже самое в HDL Дизайнере MentorGraphics, как, в общем-то и в Квартусе.

3. По крайней мере, в HDL Дизайнере есть много режимов обновлений и поиск- замена которые позволяют менять в проекте, как в файлах так и по иерархии. Если не наворотить в схеме то и в, дальнейшем проблем с размещением блоков и линий не будет.

4. Совершенно наоборот, когда текстовое описание проще делаешь узел/модуль в тексте а остальное в графике.

5. С этим согласен на 100 %, надо к этому добавить ещё время на изучение тузлов и поддержание библиотек.

6. Никто не мешает сравнивать сгенерированные текстовые файлы, а для перехода в графику достаточно щёлкнуть мышкой.

7. В HDL Дизайнере можно и нужно размещать комментарии, которые будут передаваться в соответствующие места сгенерированных текстовых файлов. Кроме того графика является уже подготовленной для того чтобы её вставлять в тест описай документации.

8. Как раз наоборот: графику во все времена было рассматривать проще. Не зря же составляют для пояснения программ, блок-схемы алгоритмов, диаграммы автоматов и схемы.

9. Ничего подобного. Помню как в своё время меня пытались заставить сделать функциональную схему на описание в альтеровском AHDL чтобы разобраться в проекте.

10. Коры и модули проще вставлять в схему . Если вы хотите дорабатывать проект сделанный в тексте, тут ничего не придумаешь, надо корректировать соответствующий текст.


Автор: Димыч Sep 17 2012, 22:26

Цитата(iosifk @ Sep 10 2012, 09:47) *
Написано большей частью верно. Вот только не написано самого основного - про отладку проектов, особенно больших. Посмотрите у меня на сайте, в статьях "Краткий Курс", о том как отлаживать, как подгружать в тестбенч данные из файлов и как данные выводить на монитор...
И еще. В русском, термина "схематик" - нет! Это жаргон!

Спасибо за комментарий и подсказку "где копать ещё" sm.gif
Правда, очень ценно - так что буду систематизировать и дополнять.

Касаемо жаргона. Ну что ж, да - ему не место в официальных изданиях, книгах и научных трудах. Но здесь - совсем другой коленкор (сорри за жаргон). Как говорится, "излишняя бюрократизация страны способна затормозить прогрессивные изменения в ней".

с уважением,
Д.

Автор: Maverick Aug 18 2013, 22:12

http://electronix.ru/redirect.php?http://www.gaisler.com/doc/vhdl2proc.pdf

Цитата
Fault-tolerant Microprocessors for Space Applications

Автор: RuSTA Sep 24 2013, 16:49

Возможно ли подключить в проект какое нибудь ядро с opencores.org на языке verilog в проект на языке verilogSystem?

Автор: Maverick Sep 24 2013, 18:34

Цитата(RuSTA @ Sep 24 2013, 19:49) *
Возможно ли подключить в проект какое нибудь ядро с opencores.org на языке verilog в проект на языке verilogSystem?

можно

Автор: RuSTA Sep 24 2013, 19:28

В ПЛИСах еще новичок. Почему возникает следующий вопрос. Довольно много программирую на C и Java, т.е. с данным синтаксисом хорошо знаком, по-этому интересует именно этот язык. Имеется ли какая нибудь толковая статья либо же книга, где на пальцах объясняют программирование на SystemVerilog?
А то что то когда про какие то АВТОМАТЫ идет речь, при этом перечисляемый тип объявляется "enum {IDLE,REQ,RESP} states;" повергает в ступор)))

Автор: andrew_b Sep 25 2013, 04:33

Цитата(RuSTA @ Sep 24 2013, 23:28) *
А то что то когда про какие то АВТОМАТЫ идет речь, при этом перечисляемый тип объявляется "enum {IDLE,REQ,RESP} states;" повергает в ступор)))
Гуглите "Конечный автомат" или "Finite state machine". К языку не имеет отношения. Этот метод используется и при создании софта, а не только железа.

Автор: Radov Dmitrii Jul 9 2015, 09:43

Уважаемые знатоки Verilog, не могли бы Вы подсказать ответы на волнующие меня вопросы, или дать ссылку на источник информации, где можно найти эти ответы.
1) на одном украинском сайте выложена статья про reusable code, там в качестве примера приводится АЛУ. там перед (вызовом модуля) module instantiation написано следующее ALU #(size_A, size_B) ALU_DUT , что это за задержка такая #(size_A, size_B)? size_A и size_B явл-ся параметрами вызываемого модуля. В этой же статье не совсем понятно что означает сие объявление reg [6*8:0] _Mode_names [3:0];
2) необходимо реализовать устройство на синхронной логике, реагирующее по фронту тактовой частоты и асинхронным reset и En. Вопрос заключается в следующем, поскольку мне важна последовательность назначений, можно ли использовать блокирующие назначения внутри конструкции always??? Согласно статье Сергея Емеца за 2001 год - "Если в блоке требуется провести последовательное исполнение операторов, следует применять блокирующий тип присвоения". Я полагаю, таким образом у меня появятся триггеры-защелки, как на Ваш взгляд было бы более качественно(меньшие аппаратные затраты, более высокое время исполнения) реализовать этот модуль?
always @(posedge clk or negedge reset)
if (!reset) or (AMCount == 1)
result <= DATA_WIDTH_out'b0;
else
begin
if (En)
begin // использовали блокирующее присвоение
R = R + (((C >> 56) & 0xFF) * 113);
R = R + (((C >> 48) & 0xFF) * 61);
R = R + (((C >> 40) & 0xFF) * 23);
R = R + (((C >> 32) & 0xFF) * 131);
R = R + (((C >> 24) & 0xFF) * 79);
R = R + (((C >> 16) & 0xFF) * 91);
R = R + (((C >> 8) & 0xFF) * 47);
R = R + (((C & 0xFF) * 157);

result = R % AMCount;

end
end



3) Если у меня между аппаратными блоками передаются данные с типом структура T размером 18 байт , в которую входит набор элементов-данных (1байт.1байт.8байт.8байт.2байта.8байт) мне необходимо эту структуру передавать по шине, соответствующей размерности, а уже внутри моего блока-приемника разделить эту шину, на интересующие меня сигналы(wire) ? Или на практике это реализуется несколько иначе? Если не затруднит, не могли бы скинуть ссылку, где описывается данная проблема.

Автор: dima32rus Jul 9 2015, 10:32

Цитата(Radov Dmitrii @ Jul 9 2015, 12:43) *
там перед (вызовом модуля) module instantiation написано следующее ALU #(size_A, size_B) ALU_DUT , что это за задержка такая #(size_A, size_B)? size_A и size_B явл-ся параметрами вызываемого модуля.

Это реализация экземпляра параметризованного модуля ALU, имя экземпляра ALU_DUT. В скобках после "решетки" задаются параметры экземпляра. Подробнее можно почитать тут http://electronix.ru/redirect.php?http://www.kit-e.ru/articles/circuit/2008_12_121.php

Цитата(Radov Dmitrii @ Jul 9 2015, 12:43) *
В этой же статье не совсем понятно что означает сие объявление reg [6*8:0] _Mode_names [3:0];

Объявлен массив 48-ми разрядных слов _Mode_names, состоящий из 4-х элементов. Чтобы обратиться, например, к третьему элементу массива, нужно записать так _Mode_names[2] <= 48'hFFFF_FFFF_FFFF;


Цитата(Radov Dmitrii @ Jul 9 2015, 12:43) *
Если у меня между аппаратными блоками передаются данные с типом структура T размером 18 байт , в которую входит набор элементов-данных (1байт.1байт.8байт.8байт.2байта.8байт) мне необходимо эту структуру передавать по шине, соответствующей размерности, а уже внутри моего блока-приемника разделить эту шину, на интересующие меня сигналы(wire) ? Или на практике это реализуется несколько иначе? Если не затруднит, не могли бы скинуть ссылку, где описывается данная проблема.

У Вас получается 1+1+8+8+2+8 = 28 байт, а не 18, если я правильно понял. Можно, конечно, сделать широкую шину и передавать одним тактом. Но, если "время терпит", лучше передать последовательно несколькими словами. Или вообще, по одной линии. В приемнике сдвигаете все в один регистр и дальше используете, как нужно. Погуглите термины "сериализация" и "десериализация". В сети также есть примеры на HDL. Например, на Verilog http://electronix.ru/redirect.php?http://stackoverflow.com/questions/29016557/serializer-32-to-8-verilog-hdl

Автор: Radov Dmitrii Jul 14 2015, 10:36

Можно ли внутри одного модуля чередовать комбинационные и синхронные блоки always?
Можно ли внутри блока always реагирующего по фронту сигнала использовать блокирующие присваивания?
Можно ли в Quartus 2 задавать 64-битным переменные(64-bit wide binary number)? Так возможно -> C = 64'b0 ?

Автор: des00 Jul 14 2015, 11:33

Цитата(Radov Dmitrii @ Jul 14 2015, 17:36) *
Можно ли внутри одного модуля чередовать комбинационные и синхронные блоки always?
Можно ли внутри блока always реагирующего по фронту сигнала использовать блокирующие присваивания?
Можно ли в Quartus 2 задавать 64-битным переменные(64-bit wide binary number)? Так возможно -> C = 64'b0 ?

{3{да}}

PS. Без обид. Учите матчасть.

Автор: dima32rus Jul 14 2015, 11:41

Цитата(Radov Dmitrii @ Jul 14 2015, 13:36) *
Можно ли внутри одного модуля чередовать комбинационные и синхронные блоки always?


Можно, порядок следования блоков always в модуле ни на что не влияет.

Цитата(Radov Dmitrii @ Jul 14 2015, 13:36) *
Можно ли внутри блока always реагирующего по фронту сигнала использовать блокирующие присваивания?


Можно. Вот полезная статья по теме http://electronix.ru/redirect.php?http://svo.2.staticpublic.s3-website-us-east-1.amazonaws.com/verilog/assignments/

Цитата(Radov Dmitrii @ Jul 14 2015, 13:36) *
Можно ли в Quartus 2 задавать 64-битным переменные(64-bit wide binary number)? Так возможно -> C = 64'b0 ?


Здесь Вы присваиваете переменной 64-битное значение, но при этом определяете только один бит из 64-х. Тут надо смотреть, как поведет себя Quartus, во что такая запись синтезируется.
Лучше, конечно, определить все разряды. Я бы написал так С = 64'h00_00_00_00_00_00_00_00; Громоздко, но зато однозначно.
Можно еще так попробовать С = 64'd0; Но Quartus, кажется, считает десятичные числа 32-х разрядными. Поэтому старшие 32 бита опять могут повиснуть в воздухе.
Попробуйте разные варианты, посмотрите как оно получается в железе.

Автор: des00 Jul 14 2015, 11:50

Цитата(dima32rus @ Jul 14 2015, 18:41) *
Здесь Вы присваиваете переменной 64-битное значение, но при этом определяете только один бит из 64-х.

Вы не правы. IEEE Std 1364-2001 -> 2. Lexical conventions -> 2.5 Numbers -> 2.5.1 Integer constants

Автор: dima32rus Jul 14 2015, 11:52

А еще лучше, как товарищ des00 выше подсказал, написать С = {64{1'b0}}; Так будет более правильно.

Цитата(des00 @ Jul 14 2015, 14:50) *
Вы не правы. IEEE Std 1364-2001 -> 2. Lexical conventions -> 2.5 Numbers -> 2.5.1 Integer constants


Возможно, как-то всегда избегал подобных записей. Спасибо за подсказку.

Автор: des00 Jul 14 2015, 12:05

Цитата(dima32rus @ Jul 14 2015, 18:52) *
написать С = {64{1'b0}}; Так будет более правильно.

Это лучше предотвращением предупреждения синтезатора в случае если длинна вектора задается параметром и может плавать. Т.е. {PIPA{1'b0}} - корректная конструкция, PIPA'd0 - нет. Но диапазон таких "красивых" констант ограничен.

Цитата
Возможно, как-то всегда избегал подобных записей. Спасибо за подсказку.

Ну и зря. Стандарт писали умные люди. Сами посудите, вы жестко задаете разрядность RHS, зачем писать нулевые старшие элементы? Вот если бы константа была безразмерная, то да,

Автор: Radov Dmitrii Jul 14 2015, 12:43

upd.

В Квартусе, начиная с 14 версии задавать 64-bit wide binary number можно. Я не правильно сформулировал вопрос.

Если кто знает, не подскажите как выделить из 64-разрядной переменной, младшие/старшие 8 разрядов? Может ли integer x быть 64-разрядным? Верней integer, по всей видимости, по умолчанию это 32-разрядное целое число, а как задать его 64-разрядным?



upd upd Спасибо большое за ответы.

Автор: des00 Jul 14 2015, 12:48

Цитата(Radov Dmitrii @ Jul 14 2015, 20:43) *
Если кто знает, не подскажите как выделить из 64-разрядной переменной, младшие/старшие 8 разрядов? Может ли integer x быть 64-разрядным? Верней integer, по всей видимости, по умолчанию это 32-разрядное целое число, а как задать его 64-разрядным?

1.
pipa <= popa[7:0];
pipa <= popa[63:56];
2. integer может быть только 32 бита. А вот вектор может быть 2^16 битным.

ЗЫ. Не хотите читать стандарт, прочитайте любой другой нормальный материал по языку который собираетесь использовать для работы. Уважайте себя, не поднимайте насмех.

Автор: Radov Dmitrii Jul 14 2015, 12:57

upd.

В Квартусе, начиная с 14 версии задавать 64-bit wide binary number можно. Я не правильно сформулировал вопрос.



Суть вопроса(опять криво сформулированного):
У меня есть переменная(64бит), у которой по очереди берут по одному байту начиная со старшего, умножают на некоторое число, затем результат отправляют в другую переменную(полагаю, что тип reg, иначе не получится сохранить полученные промежуточные значения)

dima32rus: спасибо за ссылку и ответы, но я эту статью прочёл в прошлый раз, когда Вы мне её прислали. Меня слегка сбил материал с Марсохода, я видимо не так понял, но мне показалось что там прослеживалась логика если по уровню то комб. логика и блокирующие присваивании если по фронту то синх. лог и неблок. присваивания.

des00: спасибо за ответ. Простите не успел отредактировать вопрос, т.е. стереть вопросы. Стандарт прочту.

upd upd Спасибо большое за ответы.

Автор: Грендайзер Jul 28 2015, 05:54

Всем доброго времени суток. Не совсем знал куда писать, так что напишу сюда. Сталкнулся с такой проблемой - написал ядро (avalon - slave) для NiosII. Приведу несколько строк кода:

Код
  wr_tx_udp_data_LOW <=
               '1' when address = "1000" and wr_en='1' else '0'; -- 8 TX_UDP_DATA_LOW
       wr_tx_udp_data_HIGH <=
               '1' when address = "1001" and wr_en='1' else '0'; -- 9 TX_UDP_DATA_HIG
                                      .
                                      .
                                      .
           process(clk50, resetn)
           begin
           if rising_edge(clk50) then
          
           if wr_tx_udp_data_LOW = '1' then
        tx_udp_data_reg(31 downto 0) <= writedata(31 downto 0);
       else
        tx_udp_data_reg <= tx_udp_data_reg;
       end if;

        if wr_tx_udp_data_HIGH = '1' then
        tx_udp_data_reg(63 downto 32) <= writedata(31 downto 0);
        else
        tx_udp_data_reg <= tx_udp_data_reg;
        end if;


Имеется 64-х разрядный буфер tx_udp_data_reg, в него необходимо записать данные с 32-х разрядной шины writedata. Я решил записать сначала младшие 4 байта, затем страршие 4 байта. Но как оказалось после компиляции запись происходит лишь в старшие 4 байта. После этого я закоментил строки:

Код
   if wr_tx_udp_data_HIGH = '1' then
        tx_udp_data_reg(63 downto 32) <= writedata(31 downto 0);
        else
        tx_udp_data_reg <= tx_udp_data_reg;
            end if;

Запись как и положено произошла в младшие 4 байта. Я сделал вывод, что компилятор оптимизирует логику в первом коде, но почему?


Автор: Stewart Little Jul 28 2015, 06:10

A если так:

Код
           if wr_tx_udp_data_LOW = '1' then
                 tx_udp_data_reg(31 downto 0) <= writedata(31 downto 0);
                 tx_udp_data_reg(63 downto 32) <= tx_udp_data_reg(63 downto 32);
           elsif wr_tx_udp_data_HIGH = '1' then
                 tx_udp_data_reg(31 downto 0) <= tx_udp_data_reg(31 downto 0);
                 tx_udp_data_reg(63 downto 32) <= writedata(31 downto 0);
           else
                 tx_udp_data_reg <= tx_udp_data_reg;
           end if;

Автор: Грендайзер Jul 28 2015, 07:14

Stewart Little, спасибо за совет, помогло. Правда напсал чуть короче:

Код
if wr_tx_udp_data_LOW = '1' then
                 tx_udp_data_reg(31 downto 0) <= writedata(31 downto 0);
           elsif wr_tx_udp_data_HIGH = '1' then
                 tx_udp_data_reg(63 downto 32) <= writedata(31 downto 0);
           else
                 tx_udp_data_reg <= tx_udp_data_reg;
           end if;


Но почему всё же первый вариант не прокатил? 05.gif

Автор: Stewart Little Jul 28 2015, 07:25

Цитата(Грендайзер @ Jul 28 2015, 10:14) *
Правда напсал чуть короче
Ну тогда и последний else можно опустить. sm.gif

Цитата(Грендайзер @ Jul 28 2015, 10:14) *
Но почему всё же первый вариант не прокатил? 05.gif
Навскидку предполагаю, что из-за:
а) в VHDL последующая транзакция отменяет предыдущую.
б) у Вас два последовательных if'а в одном процессе (и, кстати, их условий нет в списке чувствительности).
в) особенностей картусовского синтезатора при обработке совокупности указанных выше условий. sm.gif

Автор: Грендайзер Jul 28 2015, 07:40

Цитата
Ну тогда и последний else можно опустить. sm.gif

Да, пожалуй Вы правы cool.gif
Цитата
Навскидку предполагаю, что из-за:

более склоняюсь к последнему...
Спасибо за помощь sm.gif

Автор: Barktail Jul 28 2015, 09:57

Цитата(Грендайзер @ Jul 28 2015, 10:40) *
более склоняюсь к последнему...


А может просто else-ы конфликтуют с "противоположными" if? Не определены действия когда лоу=0, а хай=1. Первый иф говорит перезаписывай значение, а второй - пиши новое в старшие байты. И наоборот. Наверняка там варнинг был соответствующий. ИМХО вина сапра только в том что эррор не выкатил)

Автор: Грендайзер Jul 28 2015, 13:00

Что значит

Цитата
с "противоположными" if
? Есть 2 разных флага, по значению которых необходимо произвести разные действия с общим буфером.
Цитата
ИМХО вина сапра только в том что эррор не выкатил)

Дык тут то сапр как раз прав оказался, никакой ошибки нет.

Автор: Barktail Jul 28 2015, 13:23

Цитата(Грендайзер @ Jul 28 2015, 16:00) *
Что значит ? Есть 2 разных флага, по значению которых необходимо произвести разные действия с общим буфером.


В том и дело что действия разные, а буфер один. Строго следуя исходному тексту получаем что при хай=1, а лоу=0, один if требует сохранить текущее значение в буфере, а второй требует переписать старшие разряды. Беда именно в том что Вы сами и прописали такой конфликт задав else в каждом if. Без else я думаю все и в исходном варианте работало бы. Хотя и не лучшим образом.

Также работало бы если
Код
if wr_tx_udp_data_HIGH = '1' then
        tx_udp_data_reg(63 downto 32) <= writedata(31 downto 0);
        else
        tx_udp_data_reg(63 downto 32) <= tx_udp_data_reg(63 downto 32);
        end if;

        if wr_tx_udp_data_LOW = '1' then
        tx_udp_data_reg(31 downto 0) <= writedata(31 downto 0);
       else
        tx_udp_data_reg(31 downto 0) <= tx_udp_data_reg(31 downto 0);
       end if;


Цитата
Дык тут то сапр как раз прав оказался, никакой ошибки нет.


Multi-source error это кажется называется. Хотя тут не уверен.

Автор: Flip-fl0p Oct 12 2016, 10:47

А можете помочь разобраться как правильнее написать

При помощи логики :

Код
SDRAM_DQ <= WR_DATA_REG2    WHEN (PRES_STATE = WRITE_STATE) ELSE
                          (OTHERS => 'Z');


Или при помощи синхронного процесса:
Код
   WRITE_DATA_FROM_MEMORY:PROCESS
    (
        CLK
    )
    BEGIN
        IF (CLK'EVENT AND CLK = '1') THEN
            IF (NEXT_STATE = WRITE_STATE) THEN
                SDRAM_DQ <= WR_DATA_REG1;
            ELSE
                SDRAM_DQ <= (OTHERS => 'Z');
            END IF;
        END IF;
    END PROCESS;


Записи эквиваленты с точки зрения функционала.

Автор: Andrew Su Oct 13 2016, 15:37

Цитата(Flip-fl0p @ Oct 12 2016, 13:47) *
А можете помочь разобраться как правильнее написать

При помощи логики :
Код
SDRAM_DQ <= WR_DATA_REG2    WHEN (PRES_STATE = WRITE_STATE) ELSE
                           (OTHERS => 'Z');


Или при помощи синхронного процесса:
Код
   WRITE_DATA_FROM_MEMORY:PROCESS
     (
         CLK
     )
     BEGIN
         IF (CLK'EVENT AND CLK = '1') THEN
             IF (NEXT_STATE = WRITE_STATE) THEN
                 SDRAM_DQ <= WR_DATA_REG1;
             ELSE
                 SDRAM_DQ <= (OTHERS => 'Z');
             END IF;
         END IF;
     END PROCESS;


Записи эквиваленты с точки зрения функционала.


Добрый день.
Зависит от того, как вам надо.
Если надо, чтобы данные SDRAM_DQ фиксировались по фронту CLK, то вторая запись.
Если просто мультиплексор, управляемый условием PRES_STATE = WRITE_STATE,
то первая.

Автор: Flip-fl0p Oct 14 2016, 11:20

Мне необходимо, чтобы в момент когда подана команда записи данных в SDRAM память данные, которые контроллер памяти выдает на шину данных SDRAM памяти были стабильными и не менялись до прихода переднего фронта частоты SDRAM контроллера, которым эти данные и зафиксируются. Для этого мне необходимо чтобы в это время данные были стабильными.
Фактически я на "железе" проверил оба варианта, и они работают. Но с точки зрения увеличения максимальной частоты проекта, какой способ более правильный ?

Автор: Flip-fl0p Oct 26 2016, 10:44

Возник вопрос по параметризации модуля, который я пишу на VHDL.
Допустим есть некий модуль "COMPONENT_MODULE" который что-то умеет делать.
В этом модуле есть некий процесс "CONTROL_DATA", который выдает сигнал в зависимости от внешних условий.
В проекте более высокого уровня я использую 10 таких модулей.
Но сигнал "CONTROL_DATA" мне нужен только от одного из модулей(неважно какого). В остальных модулях данный сигнал мне не нужен.
Есть ли в VHDL возможность сделать процесс параметризированным и в зависимости от какой-либо константы описанной в GENERIC области он будет включен/выключен ?
На данный момент я просто не использую эти сигналы, но Quartus выдает предупреждение о них. Хотелось бы как-нибудь красиво это описать.

Автор: Tausinov Oct 26 2016, 15:38

Цитата(Flip-fl0p @ Oct 26 2016, 13:44) *
Возник вопрос по параметризации модуля, который я пишу на VHDL.
Допустим есть некий модуль "COMPONENT_MODULE" который что-то умеет делать.
В этом модуле есть некий процесс "CONTROL_DATA", который выдает сигнал в зависимости от внешних условий.
В проекте более высокого уровня я использую 10 таких модулей.
Но сигнал "CONTROL_DATA" мне нужен только от одного из модулей(неважно какого). В остальных модулях данный сигнал мне не нужен.
Есть ли в VHDL возможность сделать процесс параметризированным и в зависимости от какой-либо константы описанной в GENERIC области он будет включен/выключен ?
На данный момент я просто не использую эти сигналы, но Quartus выдает предупреждение о них. Хотелось бы как-нибудь красиво это описать.


IF (condition) GENERATE
A: process(.....)
....
END GENERATE


IF (condition) GENERATE
B: process(.....)
....
END GENERATE

Так на этапе компиляции будет выбрано, какую реализацию процесса использовать. А если ни одно из условий выполняться не будет, то процесса просто не будет.

Только вот какого рода варнинг вы хотите убрать? Если выходной порт назначается из этого процесса, то факт того, что он не будет назначаться ниоткуда, не уберет варнинг о том, что порт не используется.

Если нужно убрать такой варнинг, то создайте две архитектуры. У 9 модулей будет архитектура без этого сигнала, а у одного с ним. Этот сигнал и используйте дальше. А через параметр задайте подключение входных сигналов ко всем 10 модулям так, чтобы на модуль с нужным выходным сигналом приходили соответствующие данные.

Автор: Flip-fl0p Oct 26 2016, 20:21

Цитата(Tausinov @ Oct 26 2016, 18:38) *
IF (condition) GENERATE
A: process(.....)
....
END GENERATE


IF (condition) GENERATE
B: process(.....)
....
END GENERATE

Так на этапе компиляции будет выбрано, какую реализацию процесса использовать. А если ни одно из условий выполняться не будет, то процесса просто не будет.

Только вот какого рода варнинг вы хотите убрать? Если выходной порт назначается из этого процесса, то факт того, что он не будет назначаться ниоткуда, не уберет варнинг о том, что порт не используется.

Если нужно убрать такой варнинг, то создайте две архитектуры. У 9 модулей будет архитектура без этого сигнала, а у одного с ним. Этот сигнал и используйте дальше. А через параметр задайте подключение входных сигналов ко всем 10 модулям так, чтобы на модуль с нужным выходным сигналом приходили соответствующие данные.

Quartus стал выдавать такие сообщения:
Код
Warning (12241): 1 hierarchies have connectivity warnings - see the Connectivity Checks report folder

В сообщении написано что:
Код
clkn    Output    Info    Connected to dangling logic. Logic that only feeds a dangling port will be removed.    1
clkp    Output    Info    Connected to dangling logic. Logic that only feeds a dangling port will be removed.    2

И действительно в проекте у меня остаются "висящими в воздухе" эти выводы у двух серилайзеров.
CODE
--================================================================
-- Серилайзер для матрицы TX23D38VM0CAA
--================================================================
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY SERILAISER IS
PORT
(
DATA_IN :IN STD_LOGIC_VECTOR(6 DOWNTO 0); -- Входные данные для серилайзера
DATA_CLOCK :IN STD_LOGIC; -- Синхрочастота входных данных
CLOCKx7 :IN STD_LOGIC; -- Частота х7 для серилайзера
ENABLE :IN STD_LOGIC; -- Сигнал разрешения работы

CLKn :OUT STD_LOGIC; -- Отрицательный выход LVDS линии синхрочастоты
CLKp :OUT STD_LOGIC; -- Положительный выход LVDS линии синхрочастоты

TXn :OUT STD_LOGIC; -- Отрицательный выход LVDS линии данных
TXp :OUT STD_LOGIC -- Положительный выход LVDS линии данных
);
END SERILAISER;

ARCHITECTURE SERILAISER_arc OF SERILAISER IS
SIGNAL DATA_REG0 :STD_LOGIC_VECTOR(6 DOWNTO 0); -- Регистр хранения входных данных
SIGNAL DATA_REG1 :STD_LOGIC_VECTOR(0 TO 6); -- Регистр1 для передачи в другой клоковый домен
SIGNAL DATA_REG2 :STD_LOGIC_VECTOR(0 TO 6); -- Регистр2 для передачи в другой клоковый домен
SIGNAL DATA_REG3 :STD_LOGIC_VECTOR(0 TO 6); -- Регистр3 С которого сериализируются данные
SIGNAL CLK_CNT :INTEGER RANGE 0 TO 6; -- Счетчик для серилайзера и востановления синхрочастоты
BEGIN
WRITE_INPUT_DATA:PROCESS
(
DATA_CLOCK
)
BEGIN
IF (DATA_CLOCK'EVENT AND DATA_CLOCK = '1') THEN
IF (ENABLE = '1') THEN
DATA_REG0 <= DATA_IN; -- По переднему фронту запишем входные данные
END IF;
END IF;
END PROCESS;

COUNTER_AND_CROSS_DOAIN_DATA:PROCESS
(
CLOCKx7
)
BEGIN
IF (CLOCKx7'EVENT AND CLOCKx7 = '1') THEN
IF (ENABLE = '1') THEN
DATA_REG1(0 TO 6) <= DATA_REG0(6 DOWNTO 0); -- Передаем данные через клоковый домен старшим битом вперед.
DATA_REG2 <= DATA_REG1; -- Вторая ступень синхронизации
IF (CLK_CNT = 6) THEN -- Как только счетчик досчитает до 6
DATA_REG3<= DATA_REG2; -- Перепишем данные последний регистр
CLK_CNT <= 0; -- Обнулим счетчик
ELSE
CLK_CNT <= CLK_CNT + 1; -- Пока счетчик не досчитал до 6 инкрементируем его на 1
END IF;
END IF;
END IF;
END PROCESS;

CREATING_MATRIX_CLOCK:PROCESS
(
CLOCKx7
)
BEGIN
IF (CLOCKx7'EVENT AND CLOCKx7 = '1') THEN
IF (ENABLE = '1') THEN
IF (CLK_CNT >=1 AND CLK_CNT <= 3) THEN -- Подставим фронты синхрочатоты матрицы как в даташите на матрицу
CLKp <= '0';
CLKn <= '1';
ELSE
CLKp <= '1';
CLKn <= '0';
END IF;
END IF;
END IF;
END PROCESS;
TXp <= DATA_REG3(CLK_CNT);
TXn <= NOT DATA_REG3(CLK_CNT);
END SERILAISER_arc;

Вот модуль серилайзера для одной линии LVDS матрицы. В этом модуле так-же формируется сигнал синхрочастоты, матрицы, где фронты подставлены под последовательный поток данных в соответствии с требованиями матрицы. Знаю, что не совсем корректно реализовал этот модуль, поскольку правильно не частоту подставлять под данные, а данные под частоту. Но такой вариант работает, и в железе всё функционирует. Да и если честно частота матрицы небольшая (34 Мгц), думаю это не очень страшно на такой частоте. А полноценно вывести PLL наружу я не могу, свободных выходов PLL у меня нет. В идеале бы осциллографом глянуть форму сигнала. Но это пока мечты. Почитаю умных книжек, посмотрю форумы и сделаю правильно. Но потом.
Сейчас мне хочется при помощи GENERIC области включать отключать процесс:
CODE
CREATING_MATRIX_CLOCK:PROCESS
(
CLOCKx7
)
BEGIN
IF (CLOCKx7'EVENT AND CLOCKx7 = '1') THEN
IF (ENABLE = '1') THEN
IF (CLK_CNT >=1 AND CLK_CNT <= 3) THEN -- Подставим фронты синхрочатоты матрицы как в даташите на матрицу
CLKp <= '0';
CLKn <= '1';
ELSE
CLKp <= '1';
CLKn <= '0';
END IF;
END IF;
END IF;
END PROCESS;

Спасибо за ответ. Завтра с утра на свежую голову попробую сделать, как Вы советовали.

Автор: Flip-fl0p Oct 27 2016, 20:39

Спасибо за помощь. В общем теперь модуль выглядит так:

CODE

--================================================================
-- Серилайзер для матрицы TX23D38VM0CAA
--================================================================
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY SERILAISER IS
GENERIC
(
CLK_MATRIX : INTEGER := 0 -- 0 disable. 1 enable out signals
);
PORT
(
DATA_IN :IN STD_LOGIC_VECTOR(6 DOWNTO 0); -- Входные данные для серилайзера
DATA_CLOCK :IN STD_LOGIC; -- Синхрочастота входных данных
CLOCKx7 :IN STD_LOGIC; -- Частота х7 для серилайзера
ENABLE :IN STD_LOGIC; -- Сигнал разрешения работы

TXn :OUT STD_LOGIC; -- Отрицательный выход LVDS линии данных
TXp :OUT STD_LOGIC; -- Положительный выход LVDS линии данных

----------------------- СИНХРОСИГНАЛ МАТРИЦЫ ВКЛЮЧАЕТСЯ ЕСЛИ ПЕРЕМЕННАЯ CLK_MATRIX = 1-----------------------------
CLKn :OUT STD_LOGIC_VECTOR(CLK_MATRIX - 1 DOWNTO 0); -- Отрицательный выход LVDS линии синхрочастоты
CLKp :OUT STD_LOGIC_VECTOR(CLK_MATRIX - 1 DOWNTO 0) -- Положительный выход LVDS линии синхрочастоты
);
END SERILAISER;

ARCHITECTURE SERILAISER_arc OF SERILAISER IS
SIGNAL DATA_REG0 :STD_LOGIC_VECTOR(6 DOWNTO 0) := (OTHERS => '0'); -- Регистр хранения входных данных
SIGNAL DATA_REG1 :STD_LOGIC_VECTOR(0 TO 6) := (OTHERS => '0'); -- Регистр1 для передачи в другой клоковый домен
SIGNAL DATA_REG2 :STD_LOGIC_VECTOR(0 TO 6) := (OTHERS => '0'); -- Регистр2 для передачи в другой клоковый домен
SIGNAL DATA_REG3 :STD_LOGIC_VECTOR(0 TO 6) := (OTHERS => '0'); -- Регистр3 С которого сериализируются данные
SIGNAL CLK_CNT :INTEGER RANGE 0 TO 6 := 0; -- Счетчик для серилайзера и востановления синхрочастоты
BEGIN
WRITE_INPUT_DATA:PROCESS
(
DATA_CLOCK
)
BEGIN
IF (DATA_CLOCK'EVENT AND DATA_CLOCK = '1') THEN
IF (ENABLE = '1') THEN
DATA_REG0 <= DATA_IN; -- По переднему фронту запишем входные данные
END IF;
END IF;
END PROCESS;

COUNTER_AND_CROSS_DOAIN_DATA:PROCESS
(
CLOCKx7
)
BEGIN
IF (CLOCKx7'EVENT AND CLOCKx7 = '1') THEN
IF (ENABLE = '1') THEN
DATA_REG1(0 TO 6) <= DATA_REG0(6 DOWNTO 0); -- Передаем данные через клоковый домен старшим битом вперед.
DATA_REG2 <= DATA_REG1; -- Вторая ступень синхронизации
IF (CLK_CNT >= 6) THEN -- Как только счетчик досчитает до 6
DATA_REG3<= DATA_REG2; --- Перепишем данные последний регистр
CLK_CNT <= 0; -- Обнулим счетчик
ELSE
CLK_CNT <= CLK_CNT + 1; -- Пока счетчик не досчитал до 6 инкрементируем его на 1
END IF;
END IF;
END IF;
END PROCESS;

CLKMATRIX : IF (CLK_MATRIX > 0) GENERATE
CREATING_MATRIX_CLOCK:PROCESS
(
CLOCKx7
)
BEGIN
IF (CLOCKx7'EVENT AND CLOCKx7 = '1') THEN
IF (ENABLE = '1') THEN
IF (CLK_CNT >=2 AND CLK_CNT <= 4) THEN -- Подставим фронты синхрочатоты матрицы как в даташите на матрицу
CLKp <= "1";
CLKn <= "0";
ELSE
CLKp <= "0";
CLKn <= "1";
END IF;
END IF;
END IF;
END PROCESS;
END GENERATE;

OUT_DATA_CREATING:PROCESS
(
CLOCKx7
)
BEGIN
IF (CLOCKx7'EVENT AND CLOCKx7 = '1') THEN
IF (ENABLE = '1') THEN
TXp <= DATA_REG3(CLK_CNT);
TXn <= NOT DATA_REG3(CLK_CNT);
END IF;
END IF;
END PROCESS;

END SERILAISER_arc;

Чтобы выходные сигналы то-же удалилась я из объявил как
CLKn :OUT STD_LOGIC_VECTOR(CLK_MATRIX - 1 DOWNTO 0)
При сборке проекта Quartus все ещё выкатывает warning но теперь эти сигналы удаляются. Если их просто объявить как STD_LOGIC, то они остаются, в проекте но никуда не подключатся. Поскольку процесса, создающего этот сигнал нет. Подозреваю что при прошивке ПЛИС они вообще удаляются.

Автор: makc Oct 28 2016, 04:27

Admin: при вставке кода пользуйтесь тегом codebox. Не загромождайте тему.

Автор: Flip-fl0p Nov 17 2016, 06:19

А на сколько допустимо применение в VHDL оператора NULL ?
Есть такой код, которой формируется в процессе работ машины состояний:

Код
WORK_STATE_MACHINE:PROCESS
    (
        PRESS_STATE
    )
    BEGIN
        REQ_RD            <= '0';                                     -- По умолчанию нет запроса на чтение
        REQ_WR           <= '0';                                     -- По умолчанию нет запроса на запись
        CNT_ENA           <= '0';                                     -- Работа счетчиков запрещена
        RESET_ALL_COUNTER <= '0';                                     -- Запрещено сбрасывать сётчики
        
            CASE PRESS_STATE IS

                WHEN IDLE               =>  NULL;                     -- В состоянии ожидания ничего не делаем

                WHEN READ_DATA          =>                            -- В состоянии чтения SDRAM памяти
                                            REQ_RD   <= '1';          -- Посылаем запрос на чтение
                                            CNT_ENA  <= '1';          -- Разрешаем работу счётчиков - формирователей адреса
                                            
                WHEN NEW_FRAME          =>                            -- В состоянии поступившего нового кадра
                                            RESET_ALL_COUNTER <= '1'; -- Сбрасываем счетчики - формирователи адреса
                
                WHEN WRITE_DATA         =>                            -- В состоянии записи данных в SDRAM
                                            REQ_WR   <= '1';          -- Посылаем запро на запись
                                            CNT_ENA  <= '1';          -- Разрешаем работу счётчиков - формирователей адреса
                                            
                WHEN WAIT_FIFO_READING  =>  NULL;                     -- В состоянии ожидания опустошения FIFO буфера мтарицы ничего не делаем

                WHEN OTHERS                     =>  NULL;                
            END CASE;
    END PROCESS;

По логике работы есть 2 состояния, в которых мне никакие сигналы формировать не надо. Допустимо ли применять в этом случае оператор NULL. Нет ли каких подводных камней у этого оператора. В книжках ничего толкового про это не написано....

Автор: andrew_b Nov 17 2016, 07:03

В операторе case вы обязаны перечислить все возможные состояния. Если в каких-то из них ничего делать не надо, то и используется null.

Код
        
             CASE PRESS_STATE IS

                 WHEN IDLE               =>  NULL;                     -- В состоянии ожидания ничего не делаем

                                            
                 WHEN WAIT_FIFO_READING  =>  NULL;                      -- В состоянии ожидания опустошения FIFO буфера мтарицы ничего не  делаем

                 WHEN OTHERS                     =>  NULL;

Тут idle и wait_fifo_reading можно опустить, потому что есть others с таким же (без)действием.

Автор: Flip-fl0p Nov 17 2016, 07:24

Цитата(andrew_b @ Nov 17 2016, 10:03) *
В операторе case вы обязаны перечислить все возможные состояния. Если в каких-то из них ничего делать не надо, то и используется null.
Код
        
             CASE PRESS_STATE IS

                 WHEN IDLE               =>  NULL;                     -- В состоянии ожидания ничего не делаем

                                            
                 WHEN WAIT_FIFO_READING  =>  NULL;                      -- В состоянии ожидания опустошения FIFO буфера мтарицы ничего не  делаем

                 WHEN OTHERS                     =>  NULL;

Тут idle и wait_fifo_reading можно опустить, потому что есть others с таким же (без)действием.

Спасибо. Забыл, что их можно опустить. Просто к чему я задал вопрос:
Я ведь могу задать так:
Код
WHEN OTHERS    =>
        REQ_RD            <= '0';                                     -- По умолчанию нет запроса на чтение
        REQ_WR            <= '0';                                     -- По умолчанию нет запроса на чтение
        CNT_ENA           <= '0';                                     -- Работа счетчиков запрещена
        RESET_ALL_COUNTER <= '0';

По сути ничего не меняется. Quartus количество ячеек не меняет. Где-то в книге читал (но не помню какой), что оператор NULL надо применять о большой осторожностью. Но вот больше ничего конкретного, чего надо остерегаться, написано не было. Вот и хотелось бы разобраться, а так ли страшен черт как его малюют ?

Автор: Flip-fl0p Nov 25 2016, 08:18

Добрый день, уважаемые форумчане.

Не могли бы Вы мне подсказать один момент:
Допустим у меня есть рабочий проект UART приёмника, состоящий из нескольких более мелких модулей. К примеру все файлы проекта UART приёмника расположенный папке С:\UART_RECEIVER
Я хочу применить этот модуль в своем проекте MY_PROJECT. К примеру он будет расположен в папке С:\MY_PROJECT
Когда я компилирую проект MY_PROJECT мне приходится чтобы Quartus не ругался:
1. Закинуть UART приёмника в папку с проектом MY_PROJECT т.е. С:\MY_PROJECT\UART_RECEIVER
2. Далее обвить проект UART в проекте верхнего уровня MY_PROJECT при помощи ENTITY WORK.UART
3. И каждый файл проекта UART добавить в текущий проект MY_PROJECT т.е для каждого файла выполнить File --> open затем project --> add curent file to project

А можно ли как-то упростить процедуру прикрепления модуля UART приёмника ?
Пытался по-по всякому объявить его при помощи директивы USE. Но Quartus меня не понял....



Автор: andrew_b Nov 25 2016, 08:37

Цитата(Flip-fl0p @ Nov 25 2016, 11:18) *
Пытался по-по всякому объявить его при помощи директивы USE.
Причём тут use? Use используется для модулей уже готовой библиотеки. Для вашего модуля нужно сделать отдельную библиотеку для Квартуса. Как это сделать и можно ли это сделать в принципе, я не знаю.
Наверное, как-то это можно сделать через файл qip, как для ядер.

Автор: Flip-fl0p Jan 10 2017, 06:43

Стыдно признаться, но у меня сейчас каша в голове. Собственно никак не могу понять смысл простейшей терминологии:
Большинство авторов книг по VHDL пишут, что есть три стиля описания схем:
- Структурное
- Поведенческое
- Потоковое
Что такое структурное описание вопросов не возникает.
А вот в чём разница между потоковым описанием и поведенческим в книгах толком и не раскрыта. Никак не могу уловить суть. Хотя это знание и никак не влияет на конечный результат, но хочется понимать какой смысл заложен в эти фразы.


Автор: Poluektovich Jan 10 2017, 07:15

Потоковое описание (RTL) должно быть синтезопригодным, а поведенческое содержит несинтезируемые конструкции и используется для верификации.

Автор: Flip-fl0p Jan 10 2017, 07:22

Цитата(Poluektovich @ Jan 10 2017, 10:15) *
Потоковое описание (RTL) должно быть синтезопригодным, а поведенческое содержит несинтезируемые конструкции и используется для верификации.

Неужели так просто ? wacko.gif

Автор: Fitc Jan 11 2017, 20:35

Цитата(Flip-fl0p @ Jan 10 2017, 09:43) *
Стыдно признаться, но у меня сейчас каша в голове. Собственно никак не могу понять смысл простейшей терминологии:
Большинство авторов книг по VHDL пишут, что есть три стиля описания схем:
- Структурное
- Поведенческое
- Потоковое
Что такое структурное описание вопросов не возникает.
А вот в чём разница между потоковым описанием и поведенческим в книгах толком и не раскрыта. Никак не могу уловить суть. Хотя это знание и никак не влияет на конечный результат, но хочется понимать какой смысл заложен в эти фразы.

Советую почитать главу 2 документации по Yosys там довольно подробно расписано про разницу в данных стилях. Там это называется уровнями абстракции: поведенческий (Behavioural Level) и RTL-уровень рассматриваются с точки зрения синтеза.
http://electronix.ru/redirect.php?http://www.clifford.at/yosys/files/yosys_manual.pdf

Автор: Flip-fl0p Jan 18 2017, 10:20

Возник маленький вопрос при написании тестов на VHDL. А как заставить условие выполняться только один раз ?
Например у меня есть кусок кода тестбенча:

Код
    COUNTER_PROC : PROCESS
    (
        CLK
    )
        VARIABLE COUNTER : INTEGER RANGE 0 TO 15;
    BEGIN
        IF (RISING_EDGE(CLK)) THEN
            IF (COUNTER = 15) THEN
                COUNTER := 0;
            ELSE
                COUNTER := COUNTER + 1;
            END IF;
        END IF;
        
        IF (COUNTER = 14) THEN
            LOAD_DATA <= "0111";
            LOAD_ENA  <= '1';
        ELSE
            LOAD_DATA <= (OTHERS => '0');
            LOAD_ENA  <= '0';
        END IF;

    END PROCESS;

А если мне надо, чтобы данный процесс выполнился только один раз, как мне быть ?
Я придумал вариант, что когда счётчик досчитал до конца он зацикливается, но мне этот вариант не нравится. Такое чувство, что можно описать как-то красивее, правильнее.
Код
        IF (RISING_EDGE(CLK)) THEN
            IF (COUNTER = 15) THEN
                COUNTER := 15;
            ELSE
                COUNTER := COUNTER + 1;
            END IF;
        END IF;

Решение ждать конкретное время:
Код
WAIT FOR 780 ns;
Выглядит чуть более красиво, мне как-то не симпатизирует, поскольку не хочу заморачиваться с подсчётом времени и подстановкой в нужное мне время нужных значений сигналов.

Автор: andrew_b Jan 18 2017, 10:55

wait без указания времени будет ждать вечность.

Автор: Flip-fl0p Jan 18 2017, 11:29

Цитата(andrew_b @ Jan 18 2017, 13:55) *
wait без указания времени будет ждать вечность.

Спасибо ! Забыл, что можно оператор wait использовать...

Автор: Flip-fl0p Feb 13 2017, 06:31

А можно ли как-то значение типа STD_LOGIC_VECTOR вывести на консоль Modelsim'a простыми способом ? Может есть какая хитрая библиотека для этого ? На данный момент не вижу альтернатив, кроме как написать собственную функцию для преобразования STD_LOGIC_VECTOR ----> STRING, что делать не очень хочется...
UPD 12:00
Отвечу сам на свой вопрос.
Для того, чтобы напечатать значение STD_LOGIC_VECTOR в консоль можно написать следующее:

Код
    PRINTING_SLV_TO_CONSOLE : PROCESS
    (
        CLOCKx7
    )
    BEGIN
        IF RISING_EDGE(CLOCKX7) THEN                     -- Печатаем значение вектора по каждому фронту частоты CLOCKx7
            FOR i IN (DATA_REG'LENGTH-1) DOWNTO 0 LOOP   -- Для всех разрядов вектора DATA_REG
                REPORT STD_LOGIC'IMAGE(DATA_REG(i));     -- Выводим значение каждого разряда начиная со старшего.
            END LOOP;
            REPORT ""&LF;                                -- После того, как все символы вектора напечатали перейдем на новую строку
        END IF;
    END PROCESS;


В итоге на экране консоли будет следующее:
Код
# '0''0''0''0''1''1''0'
# '0''0''0''1''1''0''0'
# '0''0''1''1''0''0''0'
# '0''1''1''0''0''0''0'
# '1''1''0''0''0''0''0'
# '1''0''0''0''0''0''1'
# '0''0''0''0''0''1''1'


На вид не очень красиво, думаю потом подправлю на "красивый" вариант.

Автор: Flip-fl0p Apr 5 2017, 12:36

Подскажите, как можно красиво сформировать единичный сигнал, каждый раз как происходит изменение состояний автомата ?

Автор: iosifk Apr 5 2017, 12:52

Цитата(Flip-fl0p @ Apr 5 2017, 16:36) *
Подскажите, как можно красиво сформировать единичный сигнал, каждый раз как происходит изменение состояний автомата ?

так автоматом же и формировать...

Автор: andrew_b Apr 5 2017, 13:12

Цитата(Flip-fl0p @ Apr 5 2017, 15:36) *
Подскажите, как можно красиво сформировать единичный сигнал, каждый раз как происходит изменение состояний автомата ?


Код
process (clk)
begin
    if rising_edge (clk)) then
        prev_state <= state;

        if (state = prev_state) then
                change <= '0';
        else
                change <= '1';
        end if;
    end if;
end process;

Автор: Flip-fl0p Apr 5 2017, 13:23

Цитата(andrew_b @ Apr 5 2017, 16:12) *

Я похожее написал.
Код
    PROCESS
    (
        CLK
    )
    BEGIN
        IF (RISING_EDGE(CLK)) THEN
            ERROR_CNT_RST      <= '0';
            IF (PRESS_STATE /= NEXT_STATE) THEN
                ERROR_CNT_RST <= '1';
            END IF;
        END IF;
    END PROCESS;

Вот только получается беда.
Поскольку NEXT_STATE - это комбинационная функция, то такой подход генерирует огромнейшее количество слоёв логики.

Вроде бы идея сравнивать текущее состояние и прошедшее более красиво выглядит.
Код
    PRESS_STATE_TO_NEXT_STATE_PROC : PROCESS
    (
        CLK
    )
    BEGIN
        IF (RISING_EDGE(CLK)) THEN
            PRESS_STATE <= NEXT_STATE;        -- По каждому фронтму меняем состояние на то, которое вычислил автомат
            LAST_STATE  <= PRESS_STATE;       -- Запомним текущее состояние автомата              
            IF (SRST = '1') THEN              --  При активном синхронном сбросе
                PRESS_STATE <= IDLE;           -- Переходим в состояние ожидания
            END IF;
        END IF;
    END PROCESS;


Код
PROCESS
    (
        CLK
    )
    BEGIN
        IF (RISING_EDGE(CLK)) THEN
            ERROR_CNT_RST      <= '0';
            IF (PRESS_STATE /= LAST_STATE) THEN
                ERROR_CNT_RST <= '1';
            END IF;
        END IF;
    END PROCESS;

Автор: iosifk Apr 5 2017, 13:48

Цитата(Flip-fl0p @ Apr 5 2017, 17:23) *
Поскольку NEXT_STATE - это комбинационная функция, то такой подход генерирует огромнейшее количество слоёв логики.

Да нет, получится схема сравнения между регистром текущего состояния и выходами комбинационной логики. И кк этому на выходе - триггер... И более ничего не добавится...
Только для чего это нужно?


Автор: Flip-fl0p Apr 5 2017, 15:20

Цитата(iosifk @ Apr 5 2017, 16:48) *
Да нет, получится схема сравнения между регистром текущего состояния и выходами комбинационной логики. И кк этому на выходе - триггер... И более ничего не добавится...
Только для чего это нужно?

Нужно для того, чтобы автомат не зависал в каком-то состоянии, в случае если нет входного воздействия.
Каждый раз, как автомат сменит состояние, сброситься счётчик, отсчитывающей время. Если счётчик досчитает до конца, значит автомат завис - и он сбросится в изначальное состояние, т.е. состояние ожидания.

Автор: x736C Apr 5 2017, 16:24

Можно сделать так. Добавить один бит к слову, описывающему состояние автомата. Вместе со сменой состояния бит оказывается в положении единицы, а на следующем такте сбрасывается. В Верилоге есть CASEX, которая позволяет этот бит игнорировать. Но и с обычным CASE все просто можно сделать.

Автор: Golikov A. Apr 5 2017, 18:02

В вашем описании автомата наверняка есть место

state <= next_sate, синхронное под клоком.
добавьте в это место

Код
if(state != next_state)
    Counter <= MAX_DELAY;
else
    Counter <= Counter - 1'b1;


ну и до кучи
Код
if(Counter == 0)
    state <= IDLE;



а про слои логики не стоит думать, это же наверняка FPGA, там это в ЛУТы ляжет будет ок.

Автор: Flip-fl0p Apr 5 2017, 19:09

Цитата(Golikov A. @ Apr 5 2017, 21:02) *
В вашем описании автомата наверняка есть место

state <= next_sate, синхронное под клоком.
добавьте в это место

Код
if(state != next_state)
    Counter <= MAX_DELAY;
else
    Counter <= Counter - 1'b1;


ну и до кучи
Код
if(Counter == 0)
    state <= IDLE;



а про слои логики не стоит думать, это же наверняка FPGA, там это в ЛУТы ляжет будет ок.

Да я так и делал. При таком подходе If(state != next_state) получается огромное количество логики(я сейчас говорю про technology map viewer, т.е то, что непосредственно в кристалл ложиться). Возможно всё дело в том, что автомат у меня кодируется по типу ONE-HOT, завтра на работе в свободное от работы время попробую поиграться с атрибутами синтеза. Может в них дело.
На данный момент, наилучший результат дал ввод третьего состояния автомата - LAST_STATE. И сравнение текущего состояния с прошедшим. По типу того как ищется фронт сигнала

Автор: iosifk Apr 5 2017, 19:25

Цитата(Flip-fl0p @ Apr 5 2017, 19:20) *
Нужно для того, чтобы автомат не зависал в каком-то состоянии, в случае если нет входного воздействия.
Каждый раз, как автомат сменит состояние, сброситься счётчик, отсчитывающей время. Если счётчик досчитает до конца, значит автомат завис - и он сбросится в изначальное состояние, т.е. состояние ожидания.


Неверно в принципе!
Проверять нужно не все подряд состояния, а только те, в которых идет ожидание какого-то сигнала. Добавьте туда проверку вотчдога и выход по нему. Но не в исходное, а в состояние в котором фиксируется ошибка.
И еще должны быть состояния, инициализирующие вотчдог.
Беда ТС в том, что он пытается сделать что-то нестандартное, хотя для этого вполне подходят стандартные средства. Надо просто ими уметь пользоваться.

Автор: Flip-fl0p Apr 6 2017, 05:36

Цитата(iosifk @ Apr 5 2017, 22:25) *
Неверно в принципе!
Проверять нужно не все подряд состояния, а только те, в которых идет ожидание какого-то сигнала. Добавьте туда проверку вотчдога и выход по нему. Но не в исходное, а в состояние в котором фиксируется ошибка.
И еще должны быть состояния, инициализирующие вотчдог.
Беда ТС в том, что он пытается сделать что-то нестандартное, хотя для этого вполне подходят стандартные средства. Надо просто ими уметь пользоваться.

Возможно я и неправильный подход выбираю, спорить не буду, мне ещё учиться и учиться....
Но если не пытаться что-то делать, как тогда узнать какой подход правильный, а какой нет ?
Вот и приходиться изворачиваться, придумывать велосипеды с треугольными колёсами, особенно когда не знаешь, а как вообще правильно делать.
Профессионалами не рождаются - ими становятся(С)
Ну , а если по теме.
Сейчас делаю модель EEPROM памяти на I2C шине.
Частота работы I2C нигде не задаётся, и по сути может быть практически любая. Поэтому я работаю с фронтами, в частности выделю фронты по линиям SCL, SDC.
Безусловно, предварительно я перенес сигналы с этих линий в клоковый домен, и сделал минимальную фильтрацию, убирающую небольшие иголки, или провалы сигнала.
Но, к примеру, я получил старт посылку, и начал принимать биты адреса, т.е. мой автомат перешёл в состояние приёма адреса. Выход из состояния приёма адреса будет только тогда, когда я приму все 7 бит адреса. Приход бита я определяю по наличию фронта на линии SCL.
А если мастер передал только 5 бит, и по какой-то причине отключился\помер\перезагрузился ? Соответствнно мой автомат этого не знает, и продолжает ждать приёма всех 7 бит.....
В итоге он залипнет в этом состоянии. Вот я и думаю, как обойти это.
На самом деле, сейчас мысль появилась о том, что такой счётчик действительно не самая разумная затея. Используя свойства протокола I2C можно автоматически выводить SLAVE автомат из "залипших" состояний.

Автор: iosifk Apr 6 2017, 05:47

Цитата(Flip-fl0p @ Apr 6 2017, 09:36) *
А если мастер передал только 5 бит, и по какой-то причине отключился\помер\перезагрузился ? Соответствнно мой автомат этого не знает, и продолжает ждать приёма всех 7 бит.....

Перед началом приема автомат попадет в состояние, в котором взведет таймер и после этого попадет в состояние приема битов. Там автомат будет проверять готовность по приему всех битов и сигнал от таймера. Если биты готовы, то автомат перейдет в состояние, где остановит таймер. Или, если биты не готовы, но готов таймер, то автомат перейдет в состояние отработки ошибки...
Это же все просто. Нарисуйте блок-схему, из нее состояния автомата и всё....
Тем более для I2C можно сделать автомат для битов, автомат для слов-посылок и автомат для верхнего процесса. И тут будет все совсем просто....

Автор: Flip-fl0p Apr 6 2017, 06:16

Цитата(iosifk @ Apr 6 2017, 08:47) *
Перед началом приема автомат попадет в состояние, в котором взведет таймер и после этого попадет в состояние приема битов. Там автомат будет проверять готовность по приему всех битов и сигнал от таймера. Если биты готовы, то автомат перейдет в состояние, где остановит таймер. Или, если биты не готовы, но готов таймер, то автомат перейдет в состояние отработки ошибки...
Это же все просто. Нарисуйте блок-схему, из нее состояния автомата и всё....
Тем более для I2C можно сделать автомат для битов, автомат для слов-посылок и автомат для верхнего процесса. И тут будет все совсем просто....

Именно.
Но с таким подходом, когда анализируются фронты по линии SCL, возможна ситуация, практически в любом состоянии работы автомата SLAVE, когда по линии SCL фронт не приходит, и как следствие автомат "залипает", поскольку именно изменение линии SCL является условием переключения состояний автомата.
Вот моя первая мысль и была сделать такой таймер, который Вы описали. Только чтобы таймер на любом состоянии работал, поскольку практически любое состояние потенциально опасное. Кроме состояния ожидания. Вот и самый логичный вывод, к которому я пришел - счетчик, который сбрасывается при любом изменении состояния автомата. Если счётчик досчитал до конца - значит надо сбросить автомат в исходное состояние.
Граф переходов я безусловно нарисовал, это первое с чего я начинаю проектирование автомата.
Возможно сам подход - анализировать фронты линии SCL неправильный. Но других разумных вариантов я на данный момент не вижу.

Автор: Golikov A. Apr 6 2017, 06:23

1. Вообще то на I2C есть start condition, он обозначает начало посылки, ровно как есть и stop condition. Именно ими и стоит оперировать, а не счетчиками. Иначе если мастер послал и умер, перегрузился и опять послал до выхода вашего таймаута, вы его начало посылки в адрес пихнете или в данные, а дальше понесется беда....

2. Есть 2 варианта счетчиков сторожевой таймер и таймаут. Сторожевой таймер должен идти всегда, и в определенных состояниях сбрасываться. В целом переход из состояния в состояние тоже годится как точка сброса сторожевого таймера. Таймаут заводится на конкретное действие и не сбрасывается, а просто выключается когда действие произошло. Это разные таймеры и у них разное назначение. И как правильно замечено переход по тайким таймерам лучше делать не в IDLE, а в RECOVERE где ошибку залогируют и проведут верную процедуру восстановления автомата. Если надо про назначения таймеров могу написать подробнее

3. Если автомат one-hot то можно сделать |(state ^ next_state) и проверить эту штуку на равенство 0, думаю беда в том что состояния действительно длинные, потому и много надо чтобы вычислить функцию. Все что вы добиваетесь использованием last_state это вы разбиваете логику формирования нового состояния и проверки равенства со старым на 2 части. В целом да, это будет работать быстрее, но с задержкой в 1 такт, хотя может это и не страшно.

Автор: Flip-fl0p Apr 6 2017, 07:55

Цитата(Golikov A. @ Apr 6 2017, 09:23) *
1. Вообще то на I2C есть start condition, он обозначает начало посылки, ровно как есть и stop condition. Именно ими и стоит оперировать, а не счетчиками. Иначе если мастер послал и умер, перегрузился и опять послал до выхода вашего таймаута, вы его начало посылки в адрес пихнете или в данные, а дальше понесется беда....

2. Есть 2 варианта счетчиков сторожевой таймер и таймаут. Сторожевой таймер должен идти всегда, и в определенных состояниях сбрасываться. В целом переход из состояния в состояние тоже годится как точка сброса сторожевого таймера. Таймаут заводится на конкретное действие и не сбрасывается, а просто выключается когда действие произошло. Это разные таймеры и у них разное назначение. И как правильно замечено переход по тайким таймерам лучше делать не в IDLE, а в RECOVERE где ошибку залогируют и проведут верную процедуру восстановления автомата. Если надо про назначения таймеров могу написать подробнее

3. Если автомат one-hot то можно сделать |(state ^ next_state) и проверить эту штуку на равенство 0, думаю беда в том что состояния действительно длинные, потому и много надо чтобы вычислить функцию. Все что вы добиваетесь использованием last_state это вы разбиваете логику формирования нового состояния и проверки равенства со старым на 2 части. В целом да, это будет работать быстрее, но с задержкой в 1 такт, хотя может это и не страшно.

1. Ну да, я поэтому и писал, что есть лучше вариант, чем делать счетчик. Что особенности протокола I2C позволяют вывеси автомата из залипания.
Например:
Принимаем биты адреса.
Автомат залип в состоянии приёма адреса, т.к. мастер перезагрузился.
Но так или иначе мастер при следующем обращении начнет посылку со старт бита. Так почему бы условие старт не применить для сброса автомата ?
2. Вот тут да, не очень улавливаю разницу между таймерами. Для меня что один, что другой - обычный счетчик.
3. Для полноценной реализации всех функций EEPROM (повторный старт, приём адрес ячейки к которой идет обращение, страничный доступ и пр.) потребовалось 12 состояний автомата. Может действительно попробовать разбить автомат на несколько маленьких... А задержка в 1 такт не критична. Частота кварца 25 МГц. Максимальная частота работы I2C 400 КГц.

Автор: Golikov A. Apr 6 2017, 08:22

1. Не "почему бы", а именно так и надо делать. Вернее даже правильнее из любого состояние по старту переходить в состояние начала приема посылки, а по стопу в идле. При штатной работе это не меняет логику, при нештатной сохраняет работоспособность и правильную реакцию. Если стоп появился раньше времени, то нельзя работать с полученными данными. Ровно как появление старта в середине приема говорит о поврежденных данных и необходимости все начинать сначала.

2. По реализации да, оба счетчики. Отличаются по назначению.
Сторожевой таймер - это таймер для ситуаций о которых вы не знаете. Он отлавливает непредвиденное поведение, ошибки работы и проектирования, ошибки описания, человеческий фактор. То есть он запускается как бы на всякий случай. Поэтому он не может включатся и включатся по вашему желанию, ибо нет гарантии что вы по той же ошибке его не выключите. Этот таймер идет всегда, а вы в ситуация когда точно уверены что все хорошо его сбрасываете. Логика у него должна быть железобетонной и крайне примитивной. Это как гудок у машиниста в кабине поезда, уснул не сбросил он орет и будит. Его нельзя отключить, надо постоянно сбрасывать, иначе бы машинист его выключил, затем уснул и вся система зря.

Таймер таймаута - это таймер когда вы знаете что делаете, таймер ожидаемой ситуации. То есть вы говорите я хочу принять данные, но если мне их в течение секунды не пришлют я все бросаю и иду в ИДЛЕ. В этом случае перед приемом вы заряжаете таймер, и ждете, получили данные - хорошо, выключили таймер пошли дальше, нет - тоже хорошо у вас сработал таймаут и вы по нему перешли дальше куда надо. Это аналог кухонного таймера. Поставили мясо тушиться, зарядили таймер на время когда оно точно будет готово. При этом продолжаете сами за ним время от времени следить. Увидели что оно готово, - ОК выключили таймер сняли мясо, не видели, но сработал таймер, ну тоже ОК, тогда оно точно готово, пора снимать.

3. Не надо работать за синтезатор, опишите автомат просто состояниями по числам 0, 1, 2, 3, 4, 5... 11. в 4 битном векторе состояний и отдайте это все на работу синтезатора. Он найдет автомат, он сам перекодирует состояния, в оне хот если надо быстро, в грея если переходы последовательны, он сам выберет баланс между скоростью и ресурсами. Чем более абстрактно вы описываете задачу, тем больше у синтезатора возможностей для оптимизации. Направляйте синтезатор, а не зажимайте его руками. Алгоритмы все хитрее и человек уже часто проигрывает машине, так чего с ней соревноваться, пусть работает на нас!

Автор: Flip-fl0p Apr 6 2017, 08:35

Цитата(Golikov A. @ Apr 6 2017, 11:22) *

Спасибо за объяснения. А автомат я не зажимаю. Наоборот за счет применения перечисляемых типов, компилятору больше свободы для "творчества".
Код
    TYPE STATE_MACHINE_TYPE IS
    (
        IDLE,                                                   -- Состояние ожидания              
        START,                                                  -- Состояние старт бита.
        ADDRES_SLAVE,                                           -- Состояние приёма адреса SLAVE устройства
        DIRECTION,                                              -- Приём бита направления
        ACK_SLAVE_ADDR,                                         -- Состояние подтверждения приёма адреса SLAVE устройства
        RAM_ADDRES,                                             -- Состояние приёма адреса ячейки RAM  
        ACK_RAM_ADDRES,                                         -- Подтверждение приёма адреса ячекий памяти
        WRITE_DATA,                                             -- Состояние записи данных в SLAVE устройство
        READ_DATA,                                              -- Состояние чтения данных из SLAVE устройства
        ACK_READ,                                               -- Состояние выдачи бита поддтверждения при чтении
        ACK_WRITE,                                              -- Состояние выдачи бита поддтверждения при записи.
        STOP                                                    -- Состояние приёма стоп бита
    );                                                          
    SIGNAL PRESS_STATE, NEXT_STATE : STATE_MACHINE_TYPE;        -- Регистры хранения состояний автомата

Автор: Flip-fl0p May 2 2017, 10:06

Приветствую. Возник небольшой вопрос про тип BOOLEAN в VHDL. Для обучения я очень много скачивал разных примеров схем на VHDL. Но практически ни в одном из примеров я не встречал применение типа BOOLEAN.
Можете помочь разобраться, а какое данному типу есть практическое применение.
Немного прочитав про этот тип, я узнал, что это перечисляемый тип

Код
type boolean is (false,true);

Правильно ли я понимаю, что при применении данного типа синтезатор может самостоятельно назначить какому логическому сигналу соответствует false,true. Т.е. если синтезатору будет удобнее чтобы False соответствовала лог.1 а true лог.0. он так и сделает. Таким образом синтезатор сам подставит то значение типу, которое позволит ему получить более минимизированную логическую функцию, т.е. при синтезе применение типа BOOLEAN в качестве каких либо "флагов" более предпочтительно чем применение логических сигналов "1" и "0";

Автор: warrior-2001 May 2 2017, 11:44

Я даже больше скажу. Некоторые синтезаторы вообще меняют "1" и "0" местами в проекте, если им так удобнее. Тоесть они перелопачивают всю логику, и потом разработчик долго смотрит в логический анализатор и понять не может, отчего его сигнал в неактивном состоянии, а все работает. Это касается лишь тех случаев, когда вся логика является внутренней. Таким образом со внешними выводами синтезаторы себе такого не позволяют.

Автор: Flip-fl0p May 2 2017, 11:55

Цитата(warrior-2001 @ May 2 2017, 15:44) *
Я даже больше скажу. Некоторые синтезаторы вообще меняют "1" и "0" местами в проекте, если им так удобнее. Тоесть они перелопачивают всю логику, и потом разработчик долго смотрит в логический анализатор и понять не может, отчего его сигнал в неактивном состоянии, а все работает. Это касается лишь тех случаев, когда вся логика является внутренней. Таким образом со внешними выводами синтезаторы себе такого не позволяют.

Т.е. я правильно понял, что имеет смысл флаги объявлять как BOOLEAN, а то, каким уровнем будет представлен флаг отдать на откуп синтезатору ?

Автор: warrior-2001 May 3 2017, 05:36

Цитата(Flip-fl0p @ May 2 2017, 14:55) *
Т.е. я правильно понял, что имеет смысл флаги объявлять как BOOLEAN, а то, каким уровнем будет представлен флаг отдать на откуп синтезатору ?


Я и не припомню, чтобы пользовался BOOLEAN где-то, кроме generate. И там я true ставил в "1" скорее для читаемости кода!
Что сделает синтезатор - мне не важно. И только когда я этот флаг вытащу в логический анализатор мне понадобится информация об уровне сигнала.

Автор: krotan Aug 16 2017, 09:44

Цитата(Partisan @ Sep 28 2006, 08:13) *
Дж. Уэйкерли Проектирование цифровых устройств в 2-х т. Постмаркет Москва 2002 г., всего 1088 стр.
Про ABEL и VHDL. djvu 12 метров
было найдено у вьетнамцев (если я ничего не перепутал) на www.vsofts.net , правда под названием Digital Design (3rd Edition) M. Morris Mano Morris M Mano, загружал модератор по нику Vodka1504, мож чего перепутал

http://electronix.ru/redirect.php?http://server1.vsofts.net/Ebooks/Electronic_Ebook_Group/Vodka1504/7001-7020/wakerly.part1.rar
http://electronix.ru/redirect.php?http://server1.vsofts.net/Ebooks/Electronic_Ebook_Group/Vodka1504/7001-7020/wakerly.part2.rar
http://electronix.ru/redirect.php?http://server1.vsofts.net/Ebooks/Electronic_Ebook_Group/Vodka1504/7001-7020/wakerly.part3.rar
http://electronix.ru/redirect.php?http://server1.vsofts.net/Ebooks/Electronic_Ebook_Group/Vodka1504/7001-7020/wakerly.part4.rar
Pass: www.vsofts.net
В указанном месте нет... Ни у кого не сохранилось?

Автор: x736C Aug 16 2017, 09:51

Первая и третья есть на gen.lib.rus.ec

Автор: krotan Aug 16 2017, 10:03

Всё, нашёл в другом месте. Если кому-то ещё надо, перевыложу здесь, объём 76 Мб.

Автор: Flip-fl0p Jan 10 2018, 10:29

Вопрос тем кто пишет на VHDL.
Для настроек модуля мне понадобилась функция округления значения до большего числа с отбрасыванием дробной части.
В пакете ieee.math_real.all есть такая функция - ceil
Насколько мне известно данная библиотека не является стандартной. Посему возникает вопрос, имеются ли подводные камни при использовании совместно библиотек:

Код
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    use ieee.math_real.all;

Автор: Tausinov Jan 10 2018, 10:40

Цитата(Flip-fl0p @ Jan 10 2018, 13:29) *
Вопрос тем кто пишет на VHDL.
Для настроек модуля мне понадобилась функция округления значения до большего числа с отбрасыванием дробной части.
В пакете ieee.math_real.all есть такая функция - ceil
Насколько мне известно данная библиотека не является стандартной. Посему возникает вопрос, имеются ли подводные камни при использовании совместно библиотек:
Код
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    use ieee.math_real.all;


Если я не ошибаюсь, то можно отдельно только функцию "заинклудить", чтобы не беспокоиться о совместимости. И, вроде, даже есть еще более хитрый способ с вызовом функции через название пакета ieee.math_real.ceil, но это неточно.

Код
use ieee.math_real.ceil;



Автор: andrew_b Jan 10 2018, 11:38

Цитата(Tausinov @ Jan 10 2018, 13:40) *
Правильно всё.

Автор: Flip-fl0p Jan 22 2018, 13:32

Господа, прошу помощи с описанием двумерных массивов на VHDL.
Объявил вот такой вот массив :

Код
type SDRAM is array (0 to 3, 0 to 3) of std_logic_vector (15 downto 0);
variable memory : SDRAM;

Хочу я записать по адресу SDRAM(0,0) что-нибудь.
Я пишу так :
Код
memory(0, 0) := DQ;

Но столкнулся с проблемой, что меняя индексы строки т.е проводя записи в memory(0, 0) , memory(0, 1) memory(0, 2) итд. у меня данные пишутся только по адресу memory(0, 0).
Соответственно с чтением массива проблема аналогичная.
upd.
При чём если записать так:
Код
              
for i in 0 to 3 loop
    memory(0, i) <= DQ;
end loop;

Данные пишутся во все ячейки.... Не понимаю...
Как это побороть ? И в чём моя ошибка ?
Ну и второй вопрос.
А каким образом можно аналогичный массив создать (чтобы можно было обращаться к данным по адресу строки и столбца) в неситезируемом подмножестве VHDL, для минимизации вычислительных ресурсов.
Массив нужен для простенькой модели SDRAM памяти

Автор: Александр77 Jan 22 2018, 14:36

Цитата(Flip-fl0p @ Jan 22 2018, 16:32) *
Я пишу так :
Код
memory(0, 0) := DQ;

А может должно быть так
memory(0)(0):=DQ;

Автор: Flip-fl0p Jan 22 2018, 15:22

Цитата(Александр77 @ Jan 22 2018, 17:36) *
А может должно быть так
memory(0)(0):=DQ;

Так тоже не работает crying.gif

Автор: Stewart Little Jan 22 2018, 15:33

Цитата(Flip-fl0p @ Jan 22 2018, 16:32) *
type SDRAM is array (0 to 3, 0 to 3) of std_logic_vector (15 downto 0);

Это что такое?

Автор: Flip-fl0p Jan 22 2018, 15:36

Цитата(Stewart Little @ Jan 22 2018, 18:33) *
Это что такое?

Двумерная матрица размерностью 4 х 4 с глубиной ячейки 16 бит.

Автор: Stewart Little Jan 22 2018, 15:39

Цитата(Flip-fl0p @ Jan 22 2018, 16:32) *
Господа, прошу помощи с описанием двумерных массивов на VHDL.

А у Вас сколькимерный массив получается?

Автор: Flip-fl0p Jan 22 2018, 15:54

Цитата(Stewart Little @ Jan 22 2018, 18:39) *
А у Вас сколькимерный массив получается?

Я его понимаю как двумерный массив. С глубиной ячейки 16 бит.
Но фактически это трехмерный массив.

Автор: andrew_b Jan 23 2018, 05:51

Цитата(Flip-fl0p @ Jan 22 2018, 16:32) *
Но столкнулся с проблемой, что меняя индексы строки т.е проводя записи в memory(0, 0) , memory(0, 1) memory(0, 2) итд. у меня данные пишутся только по адресу memory(0, 0).
Код покажите.

Цитата
Ну и второй вопрос.
А каким образом можно аналогичный массив создать (чтобы можно было обращаться к данным по адресу строки и столбца) в неситезируемом подмножестве VHDL, для минимизации вычислительных ресурсов.
От массива никуда не уйти всё равно. Для минимизации ресурсов используйте переменную, а не сигнал.

Автор: Flip-fl0p Jan 23 2018, 05:53

Вроде разобрался в проблеме !
Проблемой оказалась то, что у меня адрес из типа std_logic_vector конвертировался в тип integer.
Но в векторе адреса у меня присутствовали безразличные значения. И при конвертации в integer из -за этих безразличных значений integer всегда оставался нулем.
Например:
Есть шина адреса

Код
addr : in std_logic_vector(3 downto 0)

В моей модели памяти данная шина мультиплексированная (модель SDRAМ потому-что)
Поэтому адрес фактически у меня передавался за 2 этапа.
В первом этапе у меня декодировался адрес строки.
Потом декодировался адрес столбца.
Код
row_addr <= to_integer(unsigned(A)); -- к примеру адрес строки  b"1111" т.е 15
col_addr <= to_integer(unsigned(A)); -- А в случае столбца адрес выглядел так:  b"--11" т.е 3. Т.е первые 2 бита безразличны.

Из-за безразличных значений адрес столбца всё время декодировался как 0...
Буду теперь внимательнее быть smile3046.gif

Автор: Flip-fl0p Jan 25 2018, 06:36

Господа, а можете объяснить в чем особый смысл применения типа record в VHDL ?
Ну да, удобно когда вместо кучи выходных\входных портов - применяется готовый тип.
Но за это мы платим ухудшением читаемости кода. Во всяком случае мне такой код понимать сложнее.
Более того разрядность векторов такого типа не всегда можно настраивать параметрами.
Нпример если я в пакете обьявлю такой тип, то в пакет я не могу передать параметры с модуля верхнего уровня (во всяком случае Quartus 13.1 не поддерживает эту фичу VHDL 2008)
Читал статью http://electronix.ru/redirect.php?http://www.gaisler.com/doc/vhdl2proc.pdf и др. Но как-то не впечатлило... Если не сложно поделитесь пожалуйста примерами, когда применение типа record оправдано и позволяет упростить код и улучшит его читаемость.

Автор: Flip-fl0p Apr 4 2018, 06:06

Господа, столкнулся с некоторым неудобством при работе с "безразличными" значениями.
В VHDL есть так называемые безразличные значения, которые дают подсказку синтезатору, что нам все-равно какое значение у сигнала, что позволяет более корректно описать поведение схемы, и дает больше свободы для синтезатора, например:

Код
...
constant  dont_care : std_logic_vector(31 downto 0) := (others => '-');
signal    a         : std_logic;
signal    b         : std_logic_vector(31 downto 0);
signal    c         : natural range 0 to 511;
...

a <= '-';                             -- Присваиваем сигналу а безразличное значение.
b <= (others => '-');                 -- Присваиваем вектору b безразличное значение.
c <= to_integer(unsigned(dont_care)); -- Присваиваем числу   c безразличное значение.

...

Но неудобство возникает, когда есть сигнал типа integer/natural.
Т.к для того, чтобы ему присвоить безразличное значение приходится объявлять константу, содержащую безразличное значение. И через преобразования типов присваивать эту константу. Жить конечно можно. Но не очень удобно.
А по-другому никак не присвоить такое значение для типа integer. Во всяком случае у меня не получается...
Как можно по-другому присвоить безразличное значение для integer ?

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)