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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Код на оценочку, Помогите с советами по оптимизации и правилам оформления.
Striburn
сообщение Mar 17 2017, 08:56
Сообщение #1


Участник
*

Группа: Validating
Сообщений: 15
Регистрация: 7-12-16
Пользователь №: 94 537



Вот собственно модуль БИХ-Фильтра. он вполне рабочий сделан под MAX10.

Основные требования занимать как можно меньше ячеек и перемножителей.

Поэтому старался делать всё на RAMе.


Оцените читабельность и грамотность подхода к составлению модуля.
А то я новичок до этого только с С# общался. поэтому кое-какие правила оформления брал оттуда.


CODE
module IIRFilter_ram
(
input logic reset,
input logic inclk,
input logic Din_valid,
input logic[31:0] InData,

output logic IIRPhase
);

logic [2:0]IIRState;
logic ShiftInValid,OutRamWren,InRamWren;
logic signed[63:0] OutResult,InResult;
logic signed [31:0] ShiftIn,ShiftOut,InRamData,InRamQ,InRomQ,OutRamQ,OutRomQ,OutRamData;
logic [3:0] RAddr,InRamWAddr,OutRamWAddr;
logic [1:0] RDelay;
logic signed[31:0] MV_TMP;
logic signed[31:0] MV_Result;
logic [5:0] MVF_SC;


assign IIRPhase=(ShiftOut>MV_Result)?1'b1:1'b0;

always_ff@(posedge inclk,posedge reset)
begin
if(reset)
begin
OutRamWren<=0;
InRamWren<=0;
IIRState<=0;
OutResult<=0;
InResult<=0;
InRamData<=0;
OutRamData<=0;
RAddr<=0;
RDelay<=0;
OutRamWAddr<=0;
InRamWAddr<=0;
ShiftInValid<=1'b0;
ShiftIn<=0;
MVF_SC<=0;
MV_TMP<=0;
MV_Result<=0;
end
else
begin
case(IIRState)
0:
begin
if(Din_valid)
begin
InRamWAddr<=0;
InRamData<=InData;
InRamWren<=1;
IIRState<=1;
RAddr<=7;
end
end
1:
begin
InRamWren<=0;
OutRamWren<=0;
RAddr<=RAddr-1'b1;
RDelay<=2'b10;
IIRState<=2;
end
2:
begin
if(RDelay>0)RDelay<=RDelay-1'b1;
else IIRState<=3;
end
3:
begin
InResult<=InResult+InRamQ*InRomQ;
if(RAddr>0)
begin
OutResult<=OutResult+OutRamQ*OutRomQ;
IIRState<=4;
end
else
begin
IIRState<=5;
end
end
4:
begin
OutRamWAddr<=RAddr+1'b1;
OutRamData<=OutRamQ;
OutRamWren<=1'b1;
InRamWAddr<=RAddr+1'b1;
InRamData<=InRamQ;
InRamWren<=1'b1;
IIRState<=1'b1;
end
5:
begin
OutResult<=OutResult+InResult;
IIRState<=6;
end
6:
begin
InRamWAddr<=RAddr+1'b1;
InRamData<=InRamQ;
InRamWren<=1'b1;
OutRamWAddr<=1'b1;
OutRamData<=OutResult[63:32];
OutRamWren<=1'b1;
ShiftInValid<=1'b1;
ShiftIn<=OutResult[63:32];
if(MVF_SC<5)
begin
MVF_SC<=MVF_SC+1'b1;
MV_TMP<=MV_TMP+$signed(OutResult[63:32]);
end
else
begin
MV_TMP<=OutResult[63:32];
MV_Result<=MV_TMP/6;
MVF_SC<=0;
end
IIRState<=7;
end
7:
begin
ShiftInValid<=1'b0;
OutRamWren<=0;
InRamWren<=0;
IIRState<=0;
OutResult<=0;
InResult<=0;
end
endcase
end
end

IIRRAM InRam(
.aclr(reset),
.clock(inclk),
.data(InRamData),
.rdaddress(RAddr),
.wraddress(InRamWAddr),
.wren(InRamWren),
.q(InRamQ)
);
IIRRAM OutRam(
.aclr(reset),
.clock(inclk),
.data(OutRamData),
.rdaddress(RAddr),
.wraddress(OutRamWAddr),
.wren(OutRamWren),
.q(OutRamQ)
);
IIRINROM InRom(
.address({1'b0,RAddr}),
.clock(inclk),
.q(InRomQ)
);
IIROUTROM OutRom(
.address({1'b0,RAddr}),
.clock(inclk),
.q(OutRomQ)
);


IIRMVDELAYSR SRDelay(
.aclr(reset),
.clken(ShiftInValid),
.clock(inclk),
.shiftin(ShiftIn),
.shiftout(ShiftOut),
.taps()
);

endmodule
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Mar 17 2017, 09:38
Сообщение #2


Местный
***

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



Цитата
Основные требования занимать как можно меньше ячеек и перемножителей.

Почему именно такой критерий ?
Go to the top of the page
 
+Quote Post
Striburn
сообщение Mar 17 2017, 09:45
Сообщение #3


Участник
*

Группа: Validating
Сообщений: 15
Регистрация: 7-12-16
Пользователь №: 94 537



Цитата(Flip-fl0p @ Mar 17 2017, 12:38) *
Почему именно такой критерий ?


этот модуль часть большого проекта.
на борту плис находятся: 3 PID регулятора, 2 алгоритма герцеля, dds, uart, 4 32-ух битных DAC, и куча систем управления, а в ячеек всего 15000 и 90 перемножителей(9х9).
блоки ADC UFM PLL тоже занимаю какое то место.

Так что ячейки и перемножители очень ценный расходный материал а вот памяти там предостаточно(562000 bit)
вот и выкручиваемся как можем

Сообщение отредактировал Striburn - Mar 17 2017, 09:50
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Mar 17 2017, 09:53
Сообщение #4


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

Группа: Свой
Сообщений: 1 739
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Вы на пробелах экономите?

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

Код
OutResult<=OutResult+OutRamQ*OutRomQ;

или
Код
OutResult <= OutResult + OutRamQ * OutRomQ;
Go to the top of the page
 
+Quote Post
Striburn
сообщение Mar 17 2017, 09:57
Сообщение #5


Участник
*

Группа: Validating
Сообщений: 15
Регистрация: 7-12-16
Пользователь №: 94 537



Цитата(andrew_b @ Mar 17 2017, 12:53) *
Вы на пробелах экономите?

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

Код
OutResult<=OutResult+OutRamQ*OutRomQ;

или
Код
OutResult <= OutResult + OutRamQ * OutRomQ;


Спасибо учту.
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Mar 17 2017, 10:09
Сообщение #6


Местный
***

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



Цитата(Striburn @ Mar 17 2017, 12:45) *
этот модуль часть большого проекта.
на борту плис находятся: 3 PID регулятора, 2 алгоритма герцеля, dds, uart, 4 32-ух битных DAC, и куча систем управления, а в ячеек всего 15000 и 90 перемножителей(9х9).
блоки ADC UFM PLL тоже занимаю какое то место.

Так что ячейки и перемножители очень ценный расходный материал а вот памяти там предостаточно(562000 bit)
вот и выкручиваемся как можем

Спасибо. Не будут тут советовать, но мне кажется главное чтобы по нужной частоте развелось. Толку будет 0 от экономии ресурсов, если проект не сможет работать на требуемой частоте.
По поводу читаемости кода, как вам уже сказали поставьте пробелы.
И выравнивайте всё, что можно выровнять например:
Ваш вариант:
Код
begin
    if(reset)
    begin
        OutRamWren<=0;
        InRamWren<=0;
        IIRState<=0;
        OutResult<=0;
        InResult<=0;
        InRamData<=0;
        OutRamData<=0;
        RAddr<=0;
        RDelay<=0;
        OutRamWAddr<=0;
        InRamWAddr<=0;
        ShiftInValid<=1'b0;
        ShiftIn<=0;
        MVF_SC<=0;
        MV_TMP<=0;
        MV_Result<=0;
    end



Вот так мне кажется лучше :
Код
    if (reset)
    begin
        InRamWAddr   <= 0;
        InRamWren    <= 0;
        InRamData    <= 0;
        InResult     <= 0;

        OutRamWren   <= 0
        OutResult    <= 0;
        OutRamData   <= 0;
        OutRamWAddr  <= 0;

        IIRState     <= 0;

        RAddr        <= 0;
        RDelay       <= 0;

        ShiftInValid <= 1'b0;
        ShiftIn      <= 0;

        MVF_SC       <= 0;
        MV_TMP       <= 0;
        MV_Result    <= 0;
    end

Группируйте сигналы по смыслу. Отделяйте их пустыми строками, так проще читать. И самое главное. Пишите комментарии. Сейчас Вы помните, как это работает. Через пол года забудете.

Сообщение отредактировал Flip-fl0p - Mar 17 2017, 10:10
Go to the top of the page
 
+Quote Post
Striburn
сообщение Mar 17 2017, 10:17
Сообщение #7


Участник
*

Группа: Validating
Сообщений: 15
Регистрация: 7-12-16
Пользователь №: 94 537



Цитата(Flip-fl0p @ Mar 17 2017, 13:09) *
Спасибо. Не будут тут советовать, но мне кажется главное чтобы по нужной частоте развелось. Толку будет 0 от экономии ресурсов, если проект не сможет работать на требуемой частоте.


Пока что Тактовая частота 10MHz. а скорость данных вообще меньше 1kHz так что с этим пока проблем не возникает.

Кстати если кто нибудь может подсказать где почитать про оптимизацию кода.(конвеерезацию) то очень прошу поделиться.

Сообщение отредактировал Striburn - Mar 17 2017, 10:19
Go to the top of the page
 
+Quote Post
x736C
сообщение Mar 17 2017, 10:21
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 888
Регистрация: 3-03-06
Пользователь №: 14 942



Цитата(Striburn @ Mar 17 2017, 12:57) *
Спасибо учту.
Тогда уж до кучи. Табуляцию на мой скромный взгляд лучше заменить пробелами (двумя или четырьмя); настраивается в редакторе.
Каждый сигнал в объявлении лучше писать на новой строке, чтобы его можно было снабдить комментарием. При этом выравнивая по отступам табуляции.
То есть вместо
Код
logic signed [31:0] ShiftIn,ShiftOut,InRamData,InRamQ,InRomQ,OutRamQ,OutRomQ,OutRamData;
logic [3:0] RAddr,InRamWAddr,OutRamWAddr;

желательно так
Код
logic signed     [31:0] ShiftIn;        //
logic signed     [31:0] ShiftOut;       //
logic signed     [31:0] InRamData;      //
logic signed     [31:0] InRamQ;         //
logic signed     [31:0] InRomQ;         //
logic signed     [31:0] OutRamQ;        //
logic signed     [31:0] OutRomQ;        //
logic signed     [31:0] OutRamData;     //

logic             [3:0] RAddr;          //
logic             [3:0] InRamWAddr;     //
logic             [3:0] OutRamWAddr;    //


Лично мое мнение, CamelCase лучше оставить для PHP или C#.
При проектировании лучше использовать суффиксы, которые будут стандартными для всего процесса разработки.
Ознакомьтесь с известными стандартами (OpenCores Coding Guidelines, Freescale Verilog HDL Coding или другими), возьмите из них лучшее и наиболее близкое собственным представлениям о коде.

Группируйте сигналы по смыслу.
Интересное замечание. Сам всегда так делаю. Полистал исходники openMSP430, автор все сигналы, особенно порты сортирует в алфавитном порядке. По мне выглядит необычно, но имеет право на жизнь. А может даже и правильнее, т.к. проще найти сигнал. Интересно услышать различные мнения.
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Mar 17 2017, 10:34
Сообщение #9


Местный
***

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



Цитата
Интересное замечание. Сам всегда так делаю. Полистал исходники openMSP430, автор все сигналы, особенно порты сортирует в алфавитном порядке. По мне выглядит необычно, но имеет право на жизнь. А может даже и правильнее, т.к. проще найти сигнал. Интересно услышать различные мнения.

Каждому своё. Но когда группируется по смыслу можно эту группу сигналов прокооментиировать, описать зачем она нужна. Как работает. Во всяком случае мне так проще работать с кодом. Поскольку я вижу все сигналы управляющие счетчиком, и могу сходу оценить функционал данного счетчика. Зачастую у меня рабочих строк кода может быть 5. А описание зачем эти 5 строк нужны, может занимать 20 строчек. Не вижу в этом ничего зазорного. Пишу то для себя.

Код
    ----------------------------------------------------------------------------------------------
    -- Счетчик, считающий сколько бит принято
    -- Описание
    -- Описание
    -- Описание
    SIGNAL COUNTER_BIT_RX       : INTEGER RANGE 0 TO SDB-1 :=  0;      -- Счетчик количества принятых битов данных
    SIGNAL COUNTER_BIT_ENA      : STD_LOGIC := '0';                     -- Сигнал разрешения работы счетчика
    SIGNAL COUNTER_BIT_CLR      : STD_LOGIC := '0';                     -- Сигнал синхронного сброса счётчика
    SIGNAL COUNTER_BIT_SLD      : STD_LOGIC := '0';                     -- Сигнал синхронной загрузски данных в счетчик
    SIGNAL COUNTER_BIT_SLD_DATA : STD_LOGIC_VECTOR(7 DOWNTO 0);         -- Данные загружаемые в счетчик


Сообщение отредактировал Flip-fl0p - Mar 17 2017, 10:37
Go to the top of the page
 
+Quote Post
Striburn
сообщение Mar 17 2017, 10:36
Сообщение #10


Участник
*

Группа: Validating
Сообщений: 15
Регистрация: 7-12-16
Пользователь №: 94 537



Цитата(x736C @ Mar 17 2017, 13:21) *
Лично мое мнение, CamelCase лучше оставить для PHP или C#.
При проектировании лучше использовать суффиксы, которые будут стандартными для всего процесса разработки.
Ознакомьтесь с известными стандартами (OpenCores Coding Guidelines, Freescale Verilog HDL Coding или другими), возьмите из них лучшее и наиболее близкое собственным представлениям о коде.


Да возможно. спасибо за ссылки ознакомлюсь)


Цитата(x736C @ Mar 17 2017, 13:21) *
Тогда уж до кучи. Табуляцию на мой скромный взгляд лучше заменить пробелами (двумя или четырьмя); настраивается в редакторе.


А можно по подробнее где и как настраивать?
Go to the top of the page
 
+Quote Post
x736C
сообщение Mar 17 2017, 10:42
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 888
Регистрация: 3-03-06
Пользователь №: 14 942



Согласен. Поэтому делаю так же.
Еще вспомнил правило, которого придерживаюсь. Хотя сегодня многие считают это атавизмом.
Стараюсь не превышать 80 символов по длине строки. Отсюда вытекает несколько удобств при чтении кода и работе с ним.

Цитата(Striburn @ Mar 17 2017, 13:36) *
А можно по подробнее где и как настраивать?

Это зависит от редактора, в котором работаете. Но сегодня в подавляющем большинстве редакторов табуляцию можно настроить. Поищите в настройках.
Go to the top of the page
 
+Quote Post
Striburn
сообщение Mar 17 2017, 10:46
Сообщение #12


Участник
*

Группа: Validating
Сообщений: 15
Регистрация: 7-12-16
Пользователь №: 94 537



Цитата(x736C @ Mar 17 2017, 13:42) *
Это зависит от редактора, в котором работаете. Но сегодня в подавляющем большинстве редакторов табуляцию можно настроить. Поищите в настройках.


я Quartus использую, а для *.mif или *.sdc Notepad++.
и к сожалению в них нет ни авто пробелов ни автотабуляции. А я так привык к этим мелочам(в MS VS 2015)

Сообщение отредактировал Striburn - Mar 17 2017, 10:46
Go to the top of the page
 
+Quote Post
AVR
сообщение Mar 17 2017, 10:57
Сообщение #13


фанат Linux'а
****

Группа: Свой
Сообщений: 964
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



logic это случаем не из SystemVerilog? быть может некоторые синтезаторы не скушают


--------------------
Go to the top of the page
 
+Quote Post
iosifk
сообщение Mar 17 2017, 10:58
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 3 504
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Striburn @ Mar 17 2017, 12:56) *
Оцените читабельность и грамотность подхода к составлению модуля.
А то я новичок до этого только с С# общался. поэтому кое-какие правила оформления брал оттуда.

Если хотите, то могу по скайпу голосом. примерно 20 мин займет...
Или ищите у меня на сайте...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Striburn
сообщение Mar 17 2017, 11:00
Сообщение #15


Участник
*

Группа: Validating
Сообщений: 15
Регистрация: 7-12-16
Пользователь №: 94 537



Цитата(AVR @ Mar 17 2017, 13:57) *
logic это случаем не из SystemVerilog? быть может некоторые синтезаторы не скушают


да это он. Но Quartus справляется. В железе всё работает.

Цитата(iosifk @ Mar 17 2017, 13:58) *
Если хотите, то могу по скайпу голосом. примерно 20 мин займет...
Или ищите у меня на сайте...



К сожалению на работе никак.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd May 2017 - 05:05
Рейтинг@Mail.ru


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