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

 
 
13 страниц V  « < 11 12 13  
Reply to this topicStart new topic
> "Схемотехнические трюки для ПЛИСоводов", создание аналога "Алгоритмические трюки для программистов"
Flip-fl0p
сообщение Nov 13 2017, 08:18
Сообщение #181


Местный
***

Группа: Участник
Сообщений: 423
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140



Цитата(one_eight_seven @ Nov 13 2017, 11:09) *
Сравнение с нулём - это простое ИЛИ всех битов счётчика.

Сравнение с каким-то числом - это сначала XOR с заданным значением, после чего уже ИЛИ всех битов результата.

Но в ПЛИС то это реализуется на LUT (Look-Up Table) и на них без разницы как сравнивать, нули или конкретное значение.
Просто сказанное ниже, я имел ввиду применительно к ПЛИС:
Цитата
А какая разница ? Компаратору без разницы, что сравнивать, схема у него одинаковая, что для сравнения нулей или других чисел.


Сообщение отредактировал Flip-fl0p - Nov 13 2017, 08:22
Go to the top of the page
 
+Quote Post
nice_vladi
сообщение Nov 13 2017, 08:31
Сообщение #182


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 7-09-16
Пользователь №: 93 239



Цитата(Flip-fl0p @ Nov 13 2017, 07:34) *
А какая разница ? Компаратору без разницы, что сравнивать, схема у него одинаковая, что для сравнения нулей или других чисел.

Другой вопрос, если нам надо например одним счетчиком отсчитывать разные интервалы. Например:
Счетчик досчитал до 10 - что-то делаем, и сбрасываем счетчик.
Счетчик досчитал до 15 - что-то делаем, и сбрасываем счетчик.
Счетчик досчитал до 18 - что-то делаем, и сбрасываем счетчик.
Счетчик досчитал до 24 - что-то делаем, и сбрасываем счетчик.
Счетчик досчитал до 32 - что-то делаем, и сбрасываем счетчик.
В этом случае у нас будет несколько схем сравнения с 10, 15, 18, 24, 32 - что собственно совсем не хорошо.
В случае если счетчик считает до 0 у нас будет только 1 схема сравнения с нулем.


А установка регистра счетчика в какую-то начальную величину не будет занимать логику? Т.е., получается, при счете до нуля мы тратим логику на инициализацию счетчика, а при счете до константы тратим логику на сравнение значения счетчика с константой, я правильно понимаю?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 13 2017, 08:31
Сообщение #183


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 7 706
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Если сравнивать с нулем и только с нулем, а при загрузке задавать произвольное значение счетчика, будет проще и быстрее, чем сравнивать с произвольным значением и сбрасывать счетчик.
Go to the top of the page
 
+Quote Post
one_eight_seven
сообщение Nov 13 2017, 08:33
Сообщение #184


Знающий
****

Группа: Участник
Сообщений: 707
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664



Цитата
Но в ПЛИС то это реализуется на LUT (Look-Up Table) и на них без разницы как сравнивать, нули или конкретное значение.
Просто сказанное ниже, я имел ввиду применительно к ПЛИС:

Даже если LUT, то в случае ИЛИ - одна ячейка обрабатывает столько бит входных данных, сколько у неё входов, в случае же сравнения с загруженным числом, на каждый бит нужен регистр. Да и интерконнект сильнее нагружается. Хотя, тут настаивать не буду - с ПЛИСами работаю крайне мало.
Go to the top of the page
 
+Quote Post
nice_vladi
сообщение Nov 13 2017, 09:02
Сообщение #185


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 7-09-16
Пользователь №: 93 239



Цитата(ViKo @ Nov 13 2017, 08:31) *
Если сравнивать с нулем и только с нулем, а при загрузке задавать произвольное значение счетчика, будет проще и быстрее, чем сравнивать с произвольным значением и сбрасывать счетчик.


Почему так? Как было сказано выше, компаратору нет разницы, какие данные у него на входе. Нули-не нули, он все равно будет их сравнивать, так же, как и полноценные данные.

Ну и с точки зрения наглядности - гораздо понятнее событие, которое происходит через Н тактов (запись cnt == N), чем событие, которое происходит, когда счетчик в 0( cnt == 0, а инициализация где-то в другой части модуля, например). Хотя тут уже вопрос привычки, я думаю.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 13 2017, 09:07
Сообщение #186


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 7 706
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(nice_vladi @ Nov 13 2017, 12:02) *
Почему так? Как было сказано выше, компаратору нет разницы, какие данные у него на входе. Нули-не нули, он все равно будет их сравнивать, так же, как и полноценные данные.

Как было сказано выше :-), сравнить только с нулем - это объединить биты по ИЛИ.
Кроме того, я вообще не сравниваю биты счетчика, а использую бит переноса. Которым загружаю в счетчик число, хранящееся в рядом находящемся регистре.
Go to the top of the page
 
+Quote Post
alxkon
сообщение Nov 13 2017, 09:51
Сообщение #187


Частый гость
**

Группа: Участник
Сообщений: 76
Регистрация: 16-11-10
Пользователь №: 60 920



Цитата(ViKo @ Nov 13 2017, 13:07) *
Как было сказано выше :-), сравнить только с нулем - это объединить биты по ИЛИ.
Кроме того, я вообще не сравниваю биты счетчика, а использую бит переноса. Которым загружаю в счетчик число, хранящееся в рядом находящемся регистре.

А можете проилюстрировать в коде?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 13 2017, 10:27
Сообщение #188


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 7 706
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Вот. Последние варианты (4 и 5, одинаковые). Остальные показывают процесс разработки. :-)

CODE

`define LENTH 28
`define VAR5

`ifdef VAR1
`define TIM1
`elsif VAR2
`define TIM1
`elsif VAR3
`define TIM1
`else
`define TIM2
`endif

module Timer_m
`ifdef TIM1
(
(* chip_pin = "91",
altera_attribute = "-name global_signal on; -name io_standard lvds" *)
input bit clk, // high-speed clock
input bit [`LENTH-1:0] rld, // reload data
output bit pls // timer overload pulse
);
`endif

`ifdef VAR1
bit [`LENTH:0] cnt;
always_ff @(posedge clk) begin
if (cnt[`LENTH]) cnt <= {1'b0, rld};
else cnt <= cnt - 1;
end
assign pls = cnt[`LENTH];

`elsif VAR2
bit [`LENTH-1:0] cnt;
always_ff @(posedge clk) begin
if (cnt[`LENTH-1]) cnt <= rld;
else cnt <= cnt - 1;
end
assign pls = cnt[`LENTH-1];

`elsif VAR3
bit [`LENTH-1:0] cnt;
always_ff @(posedge clk) begin
if (cnt[`LENTH-1]) cnt <= rld;
else cnt <= cnt[`LENTH-2:0] - 1;
end
assign pls = cnt[`LENTH-1];
`endif

`ifdef TIM2
(
(* chip_pin = "91",
altera_attribute = "-name global_signal on; -name io_standard lvds" *)
input bit clk, // high-speed clock
input bit [`LENTH-1:0] rld, // reload data
input bit ldp, // load pulse
output bit pls // timer overload pulse
);
`endif

`ifdef VAR4
bit [`LENTH:0] cnt;
always_ff @(posedge clk) begin
if (cnt[`LENTH]) cnt <= {ldp, rld};
else cnt <= cnt[`LENTH-1:0] - 1;
end
assign pls = cnt[`LENTH];
`endif

`ifdef VAR5
bit [`LENTH-1:0] cnt;
always_ff @(posedge clk) begin
if (pls) {pls, cnt} <= {ldp, rld};
else {pls, cnt} <= cnt - 1;
end
`endif

endmodule : Timer_m
Go to the top of the page
 
+Quote Post
Timmy
сообщение Nov 13 2017, 10:36
Сообщение #189


Знающий
****

Группа: Участник
Сообщений: 821
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515



Если речь о счётчике, то выгодней вообще не сравнивать все биты, а прекращать счёт при смене знака, то есть при переходе 0 -> -1 или -1 -> 0 в зависимости от направления счёта.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd November 2017 - 12:46
Рейтинг@Mail.ru


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