|
|
  |
Счетчик на примитивах CARRY_SUM и DFFE |
|
|
|
Apr 6 2010, 12:09
|

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

|
Quartus 9.0, Altera ACEX 1K. Пытаюсь создать счетчик, чтобы укладывался компактно в логические элементы. Для начала - фиксированного размера (с generate - свои проблемы). Как-то так: Код module CountPrim #(parameter WIDTH = 4) ( input Reset_n, Clock, Enable, output [WIDTH-1:0] Count, output POut );
wire [WIDTH-1:0] Fb; // feedback wire [WIDTH-1:0] Lt; // look table wire [WIDTH-1:0] Cr; // carry out
CARRY_SUM Cy0 (.sin(Fb[0]), .cin(1), .sout(Lt[0]), .cout(Cr[0])); DFFE Ff0 (.d(Lt[0]), .clk(Clock), .clrn(Reset_n), .prn(1), .ena(Enable), .q(Fb[0]));
CARRY_SUM Cy1 (.sin(Fb[1]), .cin(Cr[0]), .sout(Lt[1]), .cout(Cr[1])); DFFE Ff1 (.d(Lt[1]), .clk(Clock), .clrn(Reset_n), .prn(1), .ena(Enable), .q(Fb[1]));
CARRY_SUM Cy2 (.sin(Fb[2]), .cin(Cr[1]), .sout(Lt[2]), .cout(Cr[2])); DFFE Ff2 (.d(Lt[2]), .clk(Clock), .clrn(Reset_n), .prn(1), .ena(Enable), .q(Fb[2]));
CARRY_SUM Cy3 (.sin(Fb[3]), .cin(Cr[2]), .sout(Lt[3]), .cout(Cr[3])); DFFE Ff3 (.d(Lt[3]), .clk(Clock), .clrn(Reset_n), .prn(1), .ena(Enable), .q(Fb[3]));
assign Count = Fb; assign POut = Cr[3];
endmodule Но не получаю желаемого (см. картинку). Где-то промахнулся. Поможите, люди добрые!
Эскизы прикрепленных изображений
|
|
|
|
|
Apr 6 2010, 12:35
|

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

|
Цитата(ViKo @ Apr 6 2010, 15:09)  Quartus 9.0, Altera ACEX 1K. Пытаюсь создать счетчик, чтобы укладывался компактно в логические элементы. Для начала - фиксированного размера (с generate - свои проблемы). Но не получаю желаемого (см. картинку). Где-то промахнулся. Поможите, люди добрые! чем Вас не устраивает такое описание Код reg [<upper>:0] <reg_name>; always @(posedge <clock> or posedge <reset>) if (<reset>) <reg_name> <= 0; else if (<clock_enable>) <reg_name> <= <reg_name> + 1; готового счетчика?
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Apr 6 2010, 12:52
|
iBuilder©
   
Группа: Свой
Сообщений: 519
Регистрация: 14-07-04
Из: Минск
Пользователь №: 322

|
Цитата(ViKo @ Apr 6 2010, 15:45)  Не устраивает тем, что Quartus не объединяет в одном логическом элементе сумматор и триггер, а раскидывает, как захочет. На MAX+II на AHDL у меня счетчики выстраивались в линейку, с цепями переноса длиной в 24 элемента. Какую версию квартуса используете? Квартус достаточно умный для того, что-б использовать мегафункции, если только там код не сильно хитрый и не завязано на что-то ещё. Если что-то не получается, по моему проще использовать LPM функцию сложения, врятли получится написать оптимальнее чем в ней, особенно для общего случая.
|
|
|
|
|
Apr 6 2010, 13:09
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(ViKo @ Apr 6 2010, 17:06)  Просто счетчиков будет некоторое количество... остальное уже сказал. Самый главный вопрос: все счетчики считают одновременно и на максимальной для чипа частоте? Т.е решение "в лоб"??? Или можно сделать один счетчик и успевать им считать в нескольких каналах?
--------------------
www.iosifk.narod.ru
|
|
|
|
|
Apr 6 2010, 13:20
|

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

|
Счетчики разные, счетчиков - несколько (5-6), длинные. Я могу написать Count = Count + 1, и все будет нормально. Но хотелось бы получить конкретный ответ на свой вопрос. Что-то я напутал в CARRY_SUM. Цитата(Kuzmi4 @ Apr 6 2010, 16:09)  2 ViKo пройдитесь по форуму - помнится des00 и SM поднимали такой вопрос (только там есчё модуль был числа, а потом "плюс"). Не совсем то, что вам нужно, но сумматор там как раз таким вот хитроумным методом и был организован, и даже вроде бы через generate-ы. Смотрел, что-то видел. Но там не было CARRY_SUM. Я понимаю так, что таблица истинности у него следующая: Код CI SI SO CO 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1
|
|
|
|
|
Apr 6 2010, 13:45
|
Знающий
   
Группа: Свой
Сообщений: 740
Регистрация: 24-07-06
Из: Minsk
Пользователь №: 19 059

|
Цитата(ViKo @ Apr 6 2010, 11:57)  Предпочитаю идеальное решение. Жалко напрасно потраченных логических элементов. а почему не берете в расчет зря потраченное время на это решение? Цитата(ViKo @ Apr 6 2010, 12:20)  Я понимаю так, что таблица истинности у него следующая: Код CI SI SO CO 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 похоже на правду, если хотите удостовериться - сделайте тестбенч и подайте на вход CI SI (всего лишь четыре варианта)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|