Переделал модуль. Теперь счетчик, вынесенный из автомата, описывается в комбинационной части. Да, если так, то писанины стало меньше. С точки зрения реализации же, по-моему, оба счетчика абсолютно одинаковы.
Но теперь читается хуже. Счетчик, который в автомате, сразу виден в одном месте. А вот работа второго счетчика не так очевидна. Для этого надо смотреть на сам автомат, а также на логику, которая управляет счетчом. Причем каждый сигнал описывается отдельно.
CODE
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.