|
|
  |
Счетчик на примитивах CARRY_SUM и DFFE |
|
|
|
Apr 11 2010, 13:49
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(ViKo @ Apr 11 2010, 07:59)  Вопрос принципиальный. Можно конвертировать из *.tdf в *.v (если б это что-то упростило  , синтезировать счетчик в упакованном виде. Что же не дает? Может быть, настройки какие-то хитрые есть, атрибуты? не дает, то, что при синтезе tdf используется синтезатор с языка AHDL, а при синтезе с v синтезатор с языка Verilog. И далеко не факт что команда разработчиков обоих синтезаторов была одна и та же. Просто кто-то, в свое время, сильно схалявил, а команда тестеров вовремя эту халяву не заметила. Потом пошли сыклоны, вторые, третьи и как то всем стало не до асексов. Своего рода плевок в вечность (как в свое время с шиной ISA) %)
--------------------
|
|
|
|
|
Apr 11 2010, 14:48
|
Гуру
     
Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804

|
Цитата(ViKo @ Apr 11 2010, 16:59)  Вопрос принципиальный. Можно конвертировать из *.tdf в *.v Сранивать с tdf некорректно. Это описание по сути - графическое представление lpm функций в текстовом виде (нет понятия в этом языке фронта клока) При переходе на поведенческое описание - меняется даже стиль описания. используйте lpm в крайних случаях. Например когда по ресурсам не проходите. В чем принцип, да еще на ацексе. (5 лет назад рисовал его в максе, если надо в нем и дорисую)
|
|
|
|
|
Apr 11 2010, 16:03
|

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

|
Я его сделал (Quartus, Coutner, Carry)!  Код module CountCarry #(parameter WIDTH = 24) ( input rst, input clk, input clk_en, input cnt_en, input load, input [WIDTH-1:0] data, output [WIDTH-1:0] cnt, output cout, cout2 ); wire [WIDTH:0] cnt_reg; wire [WIDTH:0] cnt_next; wire [WIDTH:0] cnt_carry; wire [WIDTH:0] cnt_init = {1'b0, data};
genvar i; generate for (i=0; i<=WIDTH; i++) begin : dff_gen
carry carry ( .in ((i ? cnt_carry[i-1] : cnt_en) & cnt_reg[i]), .out (cnt_carry[i]) );
dffeas dffeas ( .clk (clk), .d ((i ? cnt_carry[i-1] : cnt_en) ^ cnt_reg[i]), .ena (clk_en), .asdata (cnt_init[i]), .clrn (rst), .sload (load), .q (cnt_reg[i]) ); end endgenerate
assign cnt = cnt_reg[WIDTH-1:0]; assign cout = cnt_reg[WIDTH]; assign cout2 = cnt_next[WIDTH];
endmodule 28 ЛЭ для ACEX, один из которых - чисто инвертор для load. Не зря в хэлпе говорится, что CARRY оставлен для совместимости с проектами на MAXPlus. Благодарю "коллективный разум" форума, и des00 персонально!
|
|
|
|
|
Apr 12 2010, 21:20
|

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

|
Выход переполнения счетчика (который выдается наружу) нужно брать не с выхода суммы последнего сумматора, а с выхода переноса. Вот - "правильный" счетчик, со всеми достоинствами - регулярной структурой, предсказуемым быстродействием, и компакный. Только выбирайте синхронный выход переполнения (там их два). Код module CountPrim #( parameter WIDTH = 8, // number of bits parameter DIRECT = "UP" // count direction: "UP" or "DOWN" ) ( input rst_n, // async reset input clk_en, // clock enable all flip-flops input clk, input cnt_en, // count enable input load, // hi-level sync load input [WIDTH-1:0] data, // data for sync load output bit [WIDTH-1:0] cnt, // bits of counter output bit rcry, // ripple carry output bit tcry // triggered (sync) carry ); wire [WIDTH:-1] cnt_cry;
carry cryin ( .in (cnt_en), .out (cnt_cry[-1]) );
genvar i; generate for (i=0; i<WIDTH; i++) begin : bitgen if (DIRECT == "DOWN") carry crycnt ( .in (cnt_cry[i-1] & !cnt[i]), .out (cnt_cry[i]) ); else // "UP" carry crycnt ( .in (cnt_cry[i-1] & cnt[i]), .out (cnt_cry[i]) ); dffeas dffcnt ( .clk (clk), .d (cnt_cry[i-1] ^ cnt[i]), .ena (clk_en), .asdata (data[i]), .clrn (rst_n), .sload (load), .q (cnt[i]) ); end endgenerate
assign rcry = cnt_cry[WIDTH-1]; dffeas dffcry ( .clk (clk), .d (rcry), .ena (clk_en), .clrn (rst_n), .q (tcry) ); endmodule
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|