|
Про ПЛИС и VHDL, Некоторые вопосы |
|
|
|
Jul 12 2011, 10:46
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
Всем доброго времени суток. Есть такой вопросик... недавно нарвался в интернете на буржуинском сайте такой кодик, его часть выглядит следующим образом: entity DIVIDER is port (CLK_IN : in Std_logic; RESET : in Std_logic; SPD :in Integer; CLK_OUT :out Std_logic); end; Сначала подумал, что какая то ошибка, но потом проверил вбив подобную строчку в ксилинксовский ISE и... он это дело захавал Никак не могу понять, как порт цифровой микросхемы, может иметь значение отличное от битового? Что это значит то? Как трактовать, что нога у плисины это integer?
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Jul 13 2011, 04:27
|
Профессионал
    
Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757

|
Цитата(SFx @ Jul 12 2011, 23:51)  в стандарте vhdl написано что все integer должны быть 32 разряда. Это не совсем так. Стандарт гарантирует ширину integer не менее 32 разрядов. Можно больше, это на усмотрение производителей софта. Но я думаю, что производители этим не заморачиваются и делают гарантированный минимум. Под рукой только IEEE Std 1076™-2002. Пункт 3.1.2.1 Predefined integer types Цитата The range of INTEGER is implementation dependent, but it is guaranteed to include the range –2147483647 to +2147483647. It is defined with an ascending range. Если в коде явно указан диапазон, например Код signal cnt : integer range 0 to 7; то разрядность будет минимальной для того, чтобы обеспечить заданный диапазон. В данном случае 3 бита.
|
|
|
|
|
Jul 26 2011, 11:38
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
Спасибо. Теперь всё встало на свои места... однако, этот кодик я нашёл не просто так. Хочу реализовать на ПЛИС некоторую операцию, которая содержит операцию деления чисел, а операнды в ней могут быть дробными числами. Уже несколько недель голову ломаю, весь интернет облазил, но ничего дельного так и не нашёл. Может кто нить объяснит, как оперировать с дробными числами. Нарвался на одну статейку, в которой предлагается использовать ксилинксовский корген, который генерит некоторое ядро, которое в свою очередь чё то там делает... но это как то всё мутно... так ничё и не понял...
|
|
|
|
|
Jul 27 2011, 10:54
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
а если бы Xilinx это IP не сделал? Или по тем или иным причинам меня бы не удовлетворяла его работа (в одной статье кстати прочёл, что именно в одном из ксилинксовских ядер, работающих с плавающей запятой, существует некоторый косяк. Не проверял не знаю, но знаю, что помимо бесплатного ядра, Xilinx распространяет ещё и платное (как думаете, с каким типом данных оно работает?), отсюда вопрос: шо за дела?). И вообще, я ж не предлагаю лезть в саму микросхему и разбирать её по костачкам... но подход, мол всё уже до нас украдено, а что там да как так трава не расти, то же неправильный!!!  И ещё, извините конечно, без обид, просто уже не первый раз сталкиваюсь с этим... я задал конкретный вопрос... хочу услышать конкретный ответ... а если хочется мысли на кулаки понаворачивать... так это вам к философам... им деньги платят за то, что б они ничё не делали... у них профессия такая...
|
|
|
|
|
Jul 27 2011, 12:37
|
Участник

Группа: Validating
Сообщений: 55
Регистрация: 6-04-11
Пользователь №: 64 180

|
Цитата(Грендайзер @ Jul 26 2011, 15:38)  Хочу реализовать на ПЛИС некоторую операцию, которая содержит операцию деления чисел, а операнды в ней могут быть дробными числами. Дробные числа представляются в формате: - с фиксированной точкой (fixed-point); - с плавающей точкой (float-point). У вас что? Какая разрядность? и т.д. ... Сформулировать точнее можете? Цитата(Грендайзер @ Jul 26 2011, 15:38)  Уже несколько недель голову ломаю, весь интернет облазил, но ничего дельного так и не нашёл. Может кто нить объяснит, как оперировать с дробными числами. Fixed-point arithmetic Float-point arithmetic Книги по цифровой электронике. Насчет integer. Т.е., например, std_logic_vector (105 downto 23) - у Вас вопросов не вызывает? Назначение в VHDL типа с плавающей точкой (REAL), физических типов (TIME) для Вас очевидно? Если да, то чего нервничаете так?
|
|
|
|
|
Jul 28 2011, 06:20
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
С плавающей или с фиксированной запятой, значения не имеет... В случае оперирования десятичными числами, округления до 4-ого знака, будит вполне достаточно. Цитата Насчет integer. Т.е., например, std_logic_vector (105 downto 23) - у Вас вопросов не вызывает? Назначение в VHDL типа с плавающей точкой (REAL), физических типов (TIME) для Вас очевидно? Если да, то чего нервничаете так? Не допонял, что Вы имеете в виду? Причём тут real или time? Их же синтезировать всёрано не выйдет...
|
|
|
|
|
Jul 28 2011, 08:23
|
Участник

Группа: Validating
Сообщений: 55
Регистрация: 6-04-11
Пользователь №: 64 180

|
Цитата(Грендайзер @ Jul 28 2011, 10:20)  С плавающей или с фиксированной запятой, значения не имеет... Имеет. Надо выбрать. Цитата(Грендайзер @ Jul 28 2011, 10:20)  В случае оперирования десятичными числами, округления до 4-ого знака, будит вполне достаточно. Что значит "оперирования десятичными числами"? Делитель для BCD-кодов? Выражайтесь точнее. Цитата(Грендайзер @ Jul 28 2011, 10:20)  Не допонял, что Вы имеете в виду? Причём тут real или time? Их же синтезировать всёрано не выйдет... То, что VHDL не только для синтеза используют. На нем еще тест-бенчи пишут. И тот вышеуказанный Вами делитель с "буржуйского сайта" (ссылку привели бы что-ли...) возможно и не для синтеза был написан (хотя и синтезируется).
|
|
|
|
|
Jul 28 2011, 08:51
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
Цитата То, что VHDL не только для синтеза используют. На нем еще тест-бенчи пишут. И тот вышеуказанный Вами делитель с "буржуйского сайта" (ссылку привели бы что-ли...) возможно и не для синтеза был написан (хотя и синтезируется). Да, спасибо, это я ещё тогда осознал, когда попытался в ISE эту штуку откомпелировать... естественно компелятор меня матом покрыл, а вот отмоделировалось всё чётко  . Цитата Что значит "оперирования десятичными числами"? Делитель для BCD-кодов? Выражайтесь точнее. Честно говоря я сейчас, вообще ничё не понял, что Вы такое сказали... ну да Бог с ним... меня уже долго мучает вот такой вопрос... как к примеру 5 поделить скажем на 2 и найти хотя бы неполное частное или остаток? Конечно, я могу воспользоваться функцией mod или скажем поделить напрямую, т. е. 5/2 = 2, но! что если мне надо, что бы операнды были переменными? Вот тут меня компелятор шлёт по известному адресу  Конечно, я могу вычитать из пяти двойку, и каждый раз проверять не стала ли разность меньше делителя (т. е. 2), и всё пучком... два такта и готово  Однако... если бы у меня не 5 было, а скажем 57 или 535 или 5896743489 эт сколько мне тахтов то убивать на это дело?  Немогли бы Вы на мысль натолкнуть так сказать... А потом уже возможно я с плавающими и фиксированными запятыми сам докумекаю...
Сообщение отредактировал Грендайзер - Jul 28 2011, 08:55
|
|
|
|
|
Jul 28 2011, 09:24
|
Участник

Группа: Validating
Сообщений: 55
Регистрация: 6-04-11
Пользователь №: 64 180

|
Цитата(Грендайзер @ Jul 28 2011, 12:51)  как к примеру 5 поделить скажем на 2 и найти хотя бы неполное частное или остаток? Это частный случай, и он очень простой. Деление на степень двойки (2, 4, 8, 16, 32 ...) - это двиг влево на число разрядов, равное степени двойки. Пример 1. 5 10 (число пять в десятичной форме) пишем в двоичном виде (для примера в четырех разрядном) - 0101. 5 / 2 = 0101 >> 1 = 0 010 = 2 105 / 4 = 0101 >> 2 = 00 01 = 1 10и т.д. ( кое-какие детали есть при делении чисел со знаком). Это целочисленное деление с отбрасыванием остатка. Теперь вариант с фиксированной точкой. Например, будет 4 разряда для целой части и 2 - для дробной: 5 / 2 = 0101.00 >> 1 = 0 010.10 = 2.5 105 / 4 = 0101.00 >> 2 = 00 01.01 = 1.25 10Вам бы книжни по этой теме почитать, яснее будет. Цитата(Грендайзер @ Jul 28 2011, 12:51)  Конечно, я могу воспользоваться функцией mod или скажем поделить напрямую, т. е. 5/2 = 2 Даже не знаю... Как у Вас обстоит дело со сложением/вычитанием на ПЛИС? Последовательный сумматор могём?
|
|
|
|
|
Jul 28 2011, 09:40
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
мммм... последовательный сумматор... я честно говоря в этой терминологии не силён... но уверен, что в какой то книжке (помоиму в буржуйской) видел что то в этом духе... токо там фраза была, мне её гугл перевёл как "конвейерный сумматор", это не одно и то же? Я накачал несколько книжек по этому делу, но чё то какие то они "отвлечённые", может посоветуете что нибудь? И ещё последний вопросик, если можно  ... А как быть, если скажем делитель это не двойка и даже не степень двойки, а скажем 3 или что то в этом духе?
Сообщение отредактировал Грендайзер - Jul 28 2011, 09:43
|
|
|
|
|
Jul 28 2011, 11:36
|
Участник

Группа: Validating
Сообщений: 55
Регистрация: 6-04-11
Пользователь №: 64 180

|
Угрюмов "Цифровая схемотехника", например. И т.п. 1) Берем готовый делитель для целых - модуль с входами и выходами. Находим нужной разрядности. Надо с остатком - ищем с остатком. Надо со знаком... и т.д. CoreGen Вам уже советовали. А баги... Баги у всех есть. И у Вас будут. Были баги - и нету багов. Мелочи... Почитаете даташит на ксайлиновский делитель, сконфигурируете как хочется (что такое divident, quotient, divisor и др. - разберетесь). 2) Пользуемся структурным описанием. Подаем на входы операнды, снимаем результат... Голая цифровая схемотехника, без всяких синтаксических vhdl изъёбов. 3) Теперь имеем делитель, например, двух 16-разрядных операндов (целых) с 16-разрядным результатом. Как поделить им дробные? Суть в использовании фиксированной точки, правильном представлении входных данных, правильной интерпретации выходных данных. Пример для делителя двух 16-бит беззнаковых. Можно делить целые числа. 23 10 = 00000000_00010111 47 10 = 00000000_00101111 На входы делителя подаем: 00000000_00010111 00000000_00101111 На выходе имеем 00000000_00000010, т.е. 2 10 (и остаток, если делитель его выдает) 47 / 23 = 2 Можно дробные... Вариант 1: 23 10 = 00000001_0111.0000 (12 бит - целая часть, 4 - дробная) 47 10 = 00000010_1111.0000 (12 бит - целая часть, 4 - дробная) На входы делителя подаем: 00000001_01110000 (делитель) 00000010_11110000 (делимое) На выходе имеем (частное): 00000000_00000010 Поскольку у делимого и у делителя по 4 разряда на дробную часть, то 4 - 4 = 0. Т.е. у результата точка справа от нулевого разряда. Значит результат интерпретируется так: 00000000_00000010. = 2 10Вариант 2: 23 10 = 00000000_00010111 (16 бит - целая часть) 47 10 = 00000010_1111.0000 (12 бит - целая часть, 4 - дробная) На входы делителя подаем: 00000000_00010111 (делитель) 00000010_11110000 (делимое) На выходе имеем: 00000000_00100000 (плохой пример  , ну да ладно.) У делимого на дробную часть отведено 4 разряда, у делителя - 0. Значит 4 - 0 = 4 - столько разрядов будет отведено у частного (результат) на дробную часть. Значит результат интерпретируется так: 00000000_0010.0000 = 2 10Еще раз вариант 2 ( с другими операндами - 16 и 5  ): 05 10 = 00000000_00000101 (16 бит - целая часть) 16 10 = 00000001_0000.0000 (12 бит - целая часть, 4 - дробная) На входы делителя подаем: 00000000_00000101 (делитель) 00000001_00000000 (делимое) На выходе имеем: 00000000_00110011 У делимого на дробную часть отведено 4 разряда, у делителя - 0. Значит 4 - 0 = 4 - столько разрядов будет отведено у частного (результат) на дробную часть. Значит результат интерпретируется так: 00000000_0011.0011 = 3.1875 10Ясна идея?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|