Jump to content

    

Тернарный оператор VS конструкция if-else

Приветствую!

Экономия получается на отладке в Modelsim...., которая занимает ~80% времени.
На чем именно экономия?

Ведь отлаживать Вы будете генерацию сигналов управления в FSM точно так же. А кода при этом как минимум в 2 раза больше.

Удачи! Rob.

 

Share this post


Link to post
Share on other sites
....

При раздельном описании

9 линий кода для инстацирования модуля счетчика,

5 линии кода для описания сигналов управления, и собственно счетчика

4 линии для сигналов управления в начале FSM (default value)

2 (в среднем) линии для сигналов управления в каждой ветви где счетчиком надо управлять.

....

Приветствую!

На чем именно экономия?

Ведь отлаживать Вы будете генерацию сигналов управления в FSM точно так же. А кода при этом как минимум в 2 раза больше.

Удачи! Rob.

Вот только мы экономим не строчки кода, а время.

И из всех строчек кода мы фактически должны проверить только сигналы управления счетчиком. Ибо все остальное было проверено и отлажено ранее.

Если взять счетчик с сигналом разрешения работы, и синхронной загрузкой мы в FSM формируем только эти сигналы, ну возможно ещё данные, которые загружаем в счетчик, соответственно и проверяем только их. Остальное мы отладили раньше.

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

А вообще спор ни о чем. Каждый делает так, как считает правильным . Ибо так как правильно зависит от личного опыта, и субъективного взгляда на организацию HDL проектов. :beer:

Share this post


Link to post
Share on other sites

Переделал модуль. Теперь счетчик, вынесенный из автомата, описывается в комбинационной части. Да, если так, то писанины стало меньше. С точки зрения реализации же, по-моему, оба счетчика абсолютно одинаковы.

Но теперь читается хуже. Счетчик, который в автомате, сразу виден в одном месте. А вот работа второго счетчика не так очевидна. Для этого надо смотреть на сам автомат, а также на логику, которая управляет счетчом. Причем каждый сигнал описывается отдельно.

module cnt_test
(
//Global
input 					CLK_i			,
input 					nRESET_i		,

//Input
input 					IN_PULSE_i		,	

//Control
input					ENA_CNT_i		,	
input					CLR_CNT_i		,

//Output of counter
output [31:0]			OUT_CNT0_o32	,
output [31:0]			OUT_CNT1_o32
);

reg [31:0] out_cnt0_o32;
reg [31:0] out_cnt1_o32;
assign OUT_CNT0_o32 = out_cnt0_o32;
assign OUT_CNT1_o32 = out_cnt1_o32;

reg [7:0] state;	//FSM
localparam integer	sIDLE		= 0,
				sCOUNT 		= 1,
				sSTOP		= 2;

wire cnt_1_en = (state == sCOUNT) & ENA_CNT_i & IN_PULSE_i;
wire cnt_1_clr = (state == sSTOP) & CLR_CNT_i;

always @(posedge CLK_i or negedge nRESET_i)
begin
	if(~nRESET_i)
		begin
			out_cnt0_o32 <= 0;				
			state <= sIDLE;
		end
	else
		begin
			case(state)

			sIDLE:
				begin						
					if(ENA_CNT_i)
						state <= sCOUNT;
				end

			sCOUNT:
				begin
					if(ENA_CNT_i)
						begin
							if(IN_PULSE_i)
								begin
									out_cnt0_o32 <= out_cnt0_o32 + 1'b1;										
								end
						end
					else
						begin								
							state <= sSTOP;
						end
				end

			sSTOP:
				begin
					state <= sIDLE;
					if(CLR_CNT_i)
						begin
							out_cnt0_o32 <= 0;								
						end
				end

			endcase
		end

end

always @(posedge CLK_i or negedge nRESET_i)
begin
	if(~nRESET_i)
		begin				
			out_cnt1_o32 <= 0;				
		end
	else
		begin
			if(cnt_1_en)
				out_cnt1_o32 <= out_cnt1_o32 + 1'b1;
			else if(cnt_1_clr)
				out_cnt1_o32 <= 0;
		end
end

endmodule

Если же делать так, чтобы счетчик считал только в одном конкретном состоянии автомата, тогда надо добавлять состояний. В одном счетчик тикает, в другом простаивает. Однако тогда между автоматом и счетчиком будет минимум логики. Особенно при кодировке One-Hot.

Share this post


Link to post
Share on other sites
Если Вы знаете, что такое "автомат", то попробуйте представить себе набор автоматов - мастер-слэйв-слэйв.

Отличный паттерн разработки! Спасибо! А не подскажите ли, как лучше по вашему опыту: все автоматы делать в одном блоке always - в разных case (я сейчас так сделал) или "один автомат - один модуль"?

 

Share this post


Link to post
Share on other sites
как лучше по вашему опыту: все автоматы делать в одном блоке always - в разных case (я сейчас так сделал) или "один автомат - один модуль"?

Я Ваш вопрос не понял. А что касается мастер-слэйв, то об этом можно прочитать в "Кратком Курсе", раздел "дополнительный об автоматах"...

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this