реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Как уменьшить объем проекта?, по количеству логических ячеек
sazh
сообщение Jul 29 2010, 20:28
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(Docent86 @ Jul 29 2010, 23:25) *
Двоично-Десятичный Код (BCD)


Преобразование bin2- bcd, bcd- bin2 неоднократно здесь рассматривалось. Воспользуйтесь поиском.
Go to the top of the page
 
+Quote Post
des00
сообщение Jul 30 2010, 00:27
Сообщение #17


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Docent86 @ Jul 29 2010, 14:06) *
aD:= conv_integer (Average(11 downto 0));
aD:= aD/1187; -- деление подобного рода повторяется но с разными коэфициентами

aD0:=aD rem 10; aD:=(aD-aD0)/10; --а такое преобразование можно и в одну функцию записать
aD1:=aD rem 10; aD:=(aD-aD1)/10;
aD2:=aD rem 10; aD:=(aD-aD2)/10;
aD3:=aD rem 10;
...
X(0 to 3) <= conv_std_logic_vector(aD4,4);
X(4 to 7) <= conv_std_logic_vector(aD3,4);
...

о времена о нравы, а гуглем алгоритмы BCD почитать до того как делать в лоб? Весит сие плиток 150-300 чистой логики.


--------------------
Go to the top of the page
 
+Quote Post
rv3dll(lex)
сообщение Jul 30 2010, 04:31
Сообщение #18


Полное ничтожество
*****

Группа: Banned
Сообщений: 1 991
Регистрация: 20-03-07
Из: Коломна
Пользователь №: 26 354



на входе ДДК а внутри бинарный?
Go to the top of the page
 
+Quote Post
des00
сообщение Jul 30 2010, 04:35
Сообщение #19


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(rv3dll(lex) @ Jul 29 2010, 23:31) *
на входе ДДК а внутри бинарный?

если делит на 10ть то скорее наоборот %)


--------------------
Go to the top of the page
 
+Quote Post
rv3dll(lex)
сообщение Jul 30 2010, 05:04
Сообщение #20


Полное ничтожество
*****

Группа: Banned
Сообщений: 1 991
Регистрация: 20-03-07
Из: Коломна
Пользователь №: 26 354



иногда проще домножить и делить потом на 2^n
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Jul 30 2010, 05:23
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



Действительно проще привести коэффициент к требуемой точности, умножить, а потом просто сдвинуть результат вправо.
Go to the top of the page
 
+Quote Post
Docent86
сообщение Jul 30 2010, 06:42
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 2-03-10
Из: С.-Пб.
Пользователь №: 55 772



На входе бинарные 12 разрядные коды, на выходе дв.дес.числа.
Нашел другой способ перевода - через счетчики по модулю 10 с переносом - уложился в 1500 ячеек (весь проект) при этом вернул точность обратно.
Go to the top of the page
 
+Quote Post
des00
сообщение Jul 30 2010, 07:42
Сообщение #23


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Docent86 @ Jul 30 2010, 00:42) *
На входе бинарные 12 разрядные коды, на выходе дв.дес.числа.
Нашел другой способ перевода - через счетчики по модулю 10 с переносом - уложился в 1500 ячеек (весь проект) при этом вернул точность обратно.

я думаю, что с вашим изначальным подходом, да пораскинув мозгами уложитесь в ~1000 %) И самого младшего сыклона вам за глаза %)


--------------------
Go to the top of the page
 
+Quote Post
Docent86
сообщение Jul 30 2010, 09:52
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 2-03-10
Из: С.-Пб.
Пользователь №: 55 772



Всё, проблемы решены.
Нашел и протестировал BIN-2-BCD на 16 разрядов Binary. Занимает примерно 300 Logic cells работает просто замечательно, намного удобнее в использовании чем на счетчиках. На весь проект ушло 1200 cells

BIN-2-BCD - AHDL:
*****************************************
SUBDESIGN bin2dec
( DATA[15..0] : INPUT;
DIG5[3..0],DIG4[3..0],DIG3[3..0],DIG2[3..0],DIG1[3..0] : OUTPUT;
)
VARIABLE
DATA_A[15..0],DATA_B[15..0],DATA_C[15..0],DATA_D[15..0] : NODE;
BEGIN
IF DATA[]>=60000 THEN DIG5[]=6; DATA_A[]=DATA[]-60000;
ELSIF DATA[]>=50000 THEN DIG5[]=5; DATA_A[]=DATA[]-50000;
ELSIF DATA[]>=40000 THEN DIG5[]=4; DATA_A[]=DATA[]-40000;
ELSIF DATA[]>=30000 THEN DIG5[]=3; DATA_A[]=DATA[]-30000;
ELSIF DATA[]>=20000 THEN DIG5[]=2; DATA_A[]=DATA[]-20000;
ELSIF DATA[]>=10000 THEN DIG5[]=1; DATA_A[]=DATA[]-10000;
ELSE DIG5[]=0; DATA_A[]=DATA[];
END IF;

IF DATA_A[]>=9000 THEN DIG4[]=9; DATA_B[]=DATA_A[]-9000;
ELSIF DATA_A[]>=8000 THEN DIG4[]=8; DATA_B[]=DATA_A[]-8000;
ELSIF DATA_A[]>=7000 THEN DIG4[]=7; DATA_B[]=DATA_A[]-7000;
ELSIF DATA_A[]>=6000 THEN DIG4[]=6; DATA_B[]=DATA_A[]-6000;
ELSIF DATA_A[]>=5000 THEN DIG4[]=5; DATA_B[]=DATA_A[]-5000;
ELSIF DATA_A[]>=4000 THEN DIG4[]=4; DATA_B[]=DATA_A[]-4000;
ELSIF DATA_A[]>=3000 THEN DIG4[]=3; DATA_B[]=DATA_A[]-3000;
ELSIF DATA_A[]>=2000 THEN DIG4[]=2; DATA_B[]=DATA_A[]-2000;
ELSIF DATA_A[]>=1000 THEN DIG4[]=1; DATA_B[]=DATA_A[]-1000;
ELSE DIG4[]=0; DATA_B[]=DATA_A[];
END IF;

IF DATA_B[]>=900 THEN DIG3[]=9; DATA_C[]=DATA_B[]-900;
ELSIF DATA_B[]>=800 THEN DIG3[]=8; DATA_C[]=DATA_B[]-800;
ELSIF DATA_B[]>=700 THEN DIG3[]=7; DATA_C[]=DATA_B[]-700;
ELSIF DATA_B[]>=600 THEN DIG3[]=6; DATA_C[]=DATA_B[]-600;
ELSIF DATA_B[]>=500 THEN DIG3[]=5; DATA_C[]=DATA_B[]-500;
ELSIF DATA_B[]>=400 THEN DIG3[]=4; DATA_C[]=DATA_B[]-400;
ELSIF DATA_B[]>=300 THEN DIG3[]=3; DATA_C[]=DATA_B[]-300;
ELSIF DATA_B[]>=200 THEN DIG3[]=2; DATA_C[]=DATA_B[]-200;
ELSIF DATA_B[]>=100 THEN DIG3[]=1; DATA_C[]=DATA_B[]-100;
ELSE DIG3[]=0; DATA_C[]=DATA_B[];
END IF;

IF DATA_C[]>90 THEN DIG2[]=9; DATA_D[]=DATA_C[]-90;
ELSIF DATA_C[]>80 THEN DIG2[]=8; DATA_D[]=DATA_C[]-80;
ELSIF DATA_C[]>70 THEN DIG2[]=7; DATA_D[]=DATA_C[]-70;
ELSIF DATA_C[]>60 THEN DIG2[]=6; DATA_D[]=DATA_C[]-60;
ELSIF DATA_C[]>50 THEN DIG2[]=5; DATA_D[]=DATA_C[]-50;
ELSIF DATA_C[]>40 THEN DIG2[]=4; DATA_D[]=DATA_C[]-40;
ELSIF DATA_C[]>30 THEN DIG2[]=3; DATA_D[]=DATA_C[]-30;
ELSIF DATA_C[]>20 THEN DIG2[]=2; DATA_D[]=DATA_C[]-20;
ELSIF DATA_C[]>10 THEN DIG2[]=1; DATA_D[]=DATA_C[]-10;
ELSE DIG2[]=0; DATA_D[]=DATA_C[];
END IF;
DIG1[]=DATA_D[3..0];
END;
***************************************
Go to the top of the page
 
+Quote Post
Docent86
сообщение Jul 30 2010, 09:52
Сообщение #25


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 2-03-10
Из: С.-Пб.
Пользователь №: 55 772



Еще нашел HEX-BIN

signal hidigit:std_logic_vector(3 downto 0);
signal lowdigit:std_logic_vector(3 downto 0);
signal result:std_logic_vector(7 downto 0);

result<=hidigit*conv_std_logic_vector(10,4)+("0000" & lowdigit);

Сообщение отредактировал Docent86 - Jul 30 2010, 09:58
Go to the top of the page
 
+Quote Post
Maverick
сообщение Jul 30 2010, 10:19
Сообщение #26


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(Docent86 @ Jul 29 2010, 23:06) *


Цитата
aD0:=aD rem 10; aD:=(aD-aD0)/10; --а такое преобразование можно и в одну функцию записать

Деление на 10 не будет реализовано. Также желательно дополнительно ввести переменную, которая запоминала разность, а потом уже производить деление.
Вы проект делаете для синтеза или только для моделирования?

PS Mой совет почитайте мат. часть


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
sazh
сообщение Jul 30 2010, 10:49
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(Docent86 @ Jul 30 2010, 09:42) *
На входе бинарные 12 разрядные коды, на выходе дв.дес.числа.
Нашел другой способ перевода - через счетчики по модулю 10 с переносом - уложился в 1500 ячеек (весь проект) при этом вернул точность обратно.


Vhdl не знаю. Но сама идея - преобразование за 13 тактов
Код
library ieee;     -- U.Tietze - Ch.Schenk  page 321
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity bin_bcd is port
(
clk              : in std_logic;
bin              : in std_logic_vector(11 downto 0);
bcd              : out std_logic_vector(15 downto 0);
enable_rd_bcd : out std_logic
);
end bin_bcd;

architecture bin2bcd of bin_bcd is

signal ct_bit_bin : std_logic_vector(3 downto 0);
signal     bin_rg : std_logic_vector(11 downto 0);
signal     bcd_rg : std_logic_vector(15 downto 0);
signal         sum: std_logic_vector(15 downto 0);

begin

sum(3 downto 0) <= bcd_rg(3 downto 0) + 3 when bcd_rg(3 downto 0) > 4 else bcd_rg(3 downto 0);
sum(7 downto 4) <= bcd_rg(7 downto 4) + 3 when bcd_rg(7 downto 4) > 4 else bcd_rg(7 downto 4);
sum(11 downto 8) <= bcd_rg(11 downto 8) + 3 when bcd_rg(11 downto 8) > 4 else bcd_rg(11 downto 8);
sum(15 downto 12) <= bcd_rg(15 downto 12) + 3 when bcd_rg(15 downto 12) > 4 else bcd_rg(15 downto 12);

process (clk)
begin
if (clk'event and clk = '1') then
    if ct_bit_bin = 0 then
        enable_rd_bcd <= '1';
        bcd <= bcd_rg;
        bcd_rg <= X"0000";
        bin_rg <= bin;
        ct_bit_bin <= "1100";
    else
        enable_rd_bcd <= '0';
        bcd_rg <= sum(14 downto 0) & bin_rg(11);
        bin_rg <= bin_rg(10 downto 0) & '0';
        ct_bit_bin <= ct_bit_bin - 1;
    end if;
end if;
end process;

end bin2bcd;

Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 13th July 2025 - 20:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01477 секунд с 7
ELECTRONIX ©2004-2016