Программируемая логика - это не так уж и сложно. Разберемся вместе.
Ответить

quartus/verilog как так? что бы это значило?

Пн окт 01, 2018 16:09:06

Доброго дня! Столкнулся с нежданчиком и ума не приложу что бы это значило )))
Имею рабочий проект, который жрет 23% логических элементов.
Меняю в секции initial значение для регистра ([7:0]) c 8'd128 на 8'd129. И...проект начинает жрать весь ресурс логических элементов оО
(105%. отключая отладочную шнягу 95%).
Попытка отказаться от этой секции и инициализировать по negedge nreset приводит к таким же результатом.
При этом в процессе функционирования этот регистр таки достигает этого значения (129 - терминальное состояние).
Моя в шоку Ж)
На всякий случай привожу кусок кода:
Кому интересно - предположения в студию ))

wire ADC_PacketReady;
reg APR; initial APR=0;
//wire APR = ADC_PacketReady;
reg oAPR; initial oAPR=0;
reg [7:0] bodcnt;
reg [7:0] phase;
reg [7:0] bytephase;
reg [7:0] adr ;
initial adr=128;
reg [7:0] ByteToSend;
/*
reg [15:0] tmp_res_cnt; initial tmp_res_cnt = 1000;
reg tmp_res;
always @(posedge CLK_50MHZ ) begin
if (tmp_res_cnt!=0) tmp_res_cnt<=tmp_res_cnt-1;
tmp_res <= (tmp_res_cnt!=0);
end
*/
always @(posedge CLK_50MHZ or negedge nReset)
if (!nReset ) begin
//adr<=8'd129;
end else
begin
APR <= ADC_PacketReady;// START_ADC_SEQUENCE;
oAPR <= APR;
if (APR & (~oAPR)) begin
adr <= 0;
bodcnt <= 24;
phase <= 0;
bytephase <= 0;
end else
if (adr != 8'd129) begin
if (bodcnt!=0) bodcnt<=bodcnt-1;
else begin
bodcnt <= 24;
if (phase!=10) begin // 0 01 02 03 04 05 06 07 08 09 10
phase<=phase+1; // 0 d7 d6 d5 d4 d3 d2 d1 d0 1 1
if (phase==0) begin
if (adr==8'd128) ByteToSend <= 8'hFF; else
case (bytephase)
0: ByteToSend <= ACC_Data1[07:00];
1: ByteToSend <= ACC_Data1[15:08];
2: ByteToSend <= ACC_Data1[23:16];
3: ByteToSend <= ACC_Data2[07:00];
4: ByteToSend <= ACC_Data2[15:08];
5: ByteToSend <= ACC_Data2[23:16];
endcase
end
end
else begin
phase <= 0;
if (bytephase!=5) bytephase <= bytephase+1;
else begin
bytephase <= 0;
adr <= adr+1;
end
end
end
end

if (adr != 8'd129) begin
if (phase>8'd8) TX<=1'b1; //stop bits
else if (phase==8'd0) TX<=1'b0; //start bit
else begin
TX<=ByteToSend[phase-1]; //phase=1..8; 8-phase = 0..7 lsb first
end
end else TX<=1'b1;
end

Re: quartus/verilog как так? что бы это значило?

Пн окт 08, 2018 12:43:55

Здравствуйте!
Задайте значение адреса через "parameter", так будет правильно, проведите синтез, потом напишите результат.
И еще: советую всегда указывать размерность регистра или шины в битах.

P.S. Адрес = 128 будет выглядеть так:
parameter adr = 8'b100000000;

Re: quartus/verilog как так? что бы это значило?

Пн окт 08, 2018 19:21:17

Ну, разрядность данных была в исходном коде. Тут как раз приведен эксперимент из разряда "танцы с бубном".
parameter не пробовал - завтра попробую!
синтез смотрел - да, там действительно поднаворатило)) но почему - хз.
Кстати - прописал модуль генерации ресета, что то типа:

cnt [15:0] rstcnt; initial rstcnt=16'd60000;
module myReset(
input clk,
output reg nreset
);
always @(posedge clk) begin
if (rstcnt!=0) rstcnt<=rstcnt-16'b1;
nreset <= (rstcnt==0);
end
и нисмотря на то, что его функционал дальше по схеме смехотворен, результат был тот же - проект раздулся в 4 раза
Такое ощущение, что превышается квота чего то и "компилятор" пугается и начинает гнать код по другим принципам

Re: quartus/verilog как так? что бы это значило?

Пн окт 08, 2018 22:15:41

Что это за сброс? Зачем он нужен? Почему именно так задается?
Диагноз: используйте FSM для возврата схемы в исходное состояние после выполнения всех преобразований над входным сигналом.

Re: quartus/verilog как так? что бы это значило?

Вт окт 09, 2018 08:20:44

сброс был отладочный - внешний девайс подольше в ресете подержать.
на него и завязано то помимо прямого выхода пару линий в Z подержать.
функционально с первой причиной полностью развязанный.

Добавлено after 1 hour 3 minutes 42 seconds:
parameter помог.

parameter adrmax=8'd129;
....
if (!nreset) adr<=maxadr;
....
ну и дальше по тексту.

Осталось понять - почему? По логике вещей это одно и тоже в данном контексте.
Я понимаю, когда параметр конфигурирует модуль, например input[parameter1:0], но тут же он выступает в качестве обычной константы

Re: quartus/verilog как так? что бы это значило?

Вт окт 09, 2018 09:45:46

Я Вам уже говорил - изучайте цифровую схемотехнику. В соседней теме Вы выступили в роли эксперта, отметая на своем пути очевидные вещи.

Re: quartus/verilog как так? что бы это значило?

Ср окт 10, 2018 18:44:27

очевидная вещь, которую Вы оспариваете это то, что
assign c = a & b генерит
....._____
а--|....& |
....|.......|--c
b--|.......|
....|____|

и без зазрения совести заменяете ее на
always @(posedge c) Q<=D;
....._____
D--|.......|
.....|.......|__Q
C--/.......|
.....|____|


А это трабла конкретно ЭТОГО компилятора. На другой версии Квартуса все собралось как надо.

Re: quartus/verilog как так? что бы это значило?

Чт окт 11, 2018 06:21:03

Я этого не оспариваю. Последняя Ваша запись абсолютно корректна.
Речь идет о том, что если переписывать данные из регистра в шину, то это делается простым присваиванием.
Если переписывать данные в регистр из шины, то это, как правило, делается через D триггер. Однако, Вы употребили термин "защелкивается", что в данном случае явлчется абсолютно неверным термином, именно поэтому я Вас спросил о разнице между FlipFlop и Latch.
Ответить