Jump to content

    

Подсчет импульсов

Ну и как Вам все объяснять?

Ведь все эти ENB, LATCH, PLS не прокомментированы...

 

Вот это зачем?

else begin

CNT_REG <= 24'd0;

CNT_OUT <= 24'd0;

 

И это не "айс":

... CNT_REG <= 24'd0;

end

else CNT_REG = CNT_REG + PLS;

 

module fdb_cnt
(
input CLK,
input ENB,     //разрешение работы счётчика
input RST,
input LATCH, //запись данных в выходной регистр и сброс счётчика
input PLS,     //вход импульсов
output reg [23:0] CNT_OUT
);

reg [23:0] CNT_REG;
...
endmodule

 

Это else CNT_REG = CNT_REG + PLS; считать опечаткой, заменить на else CNT_REG <= CNT_REG + PLS;

 

else begin

CNT_REG <= 24'd0;

CNT_OUT <= 24'd0;

 

Это брос регистров при снятом сигнале ENB

 

Share this post


Link to post
Share on other sites
module fdb_cnt
(
input CLK,
input ENB,     //разрешение работы счётчика
input RST,
input LATCH, //запись данных в выходной регистр и сброс счётчика
input PLS,     //вход импульсов
output reg [23:0] CNT_OUT
);

reg [23:0] CNT_REG;
...
endmodule

 

Это else CNT_REG = CNT_REG + PLS; считать опечаткой, заменить на else CNT_REG <= CNT_REG + PLS;

 

else begin

CNT_REG <= 24'd0;

CNT_OUT <= 24'd0;

 

Это брос регистров при снятом сигнале ENB

Давайте применять общепринятые сокращения.

Есть сигнал разрешения работы счетчика, например "ena"

сигнал синхронного сброса - "sreset"

 

Счетчик считает при

if(ena) begin

CNT_REG <= CNT_REG + 1'b1;

...

Share this post


Link to post
Share on other sites
module fdb_cnt
(
input CLK,
input ENB,     //разрешение работы счётчика
input RST,
input LATCH, //запись данных в выходной регистр и сброс счётчика
input PLS,     //вход импульсов
output reg [23:0] CNT_OUT
);

reg [23:0] CNT_REG;
...
endmodule

 

Это else CNT_REG = CNT_REG + PLS; считать опечаткой, заменить на else CNT_REG <= CNT_REG + PLS;

 

else begin

CNT_REG <= 24'd0;

CNT_OUT <= 24'd0;

 

Это брос регистров при снятом сигнале ENB

Давайте применять общепринятые сокращения.

Есть сигнал разрешения работы счетчика, например "ena"

сигнал синхронного сброса - "sreset"

 

Счетчик считает при

if(ena) begin

CNT_REG <= CNT_REG + 1'b1;

...

Share this post


Link to post
Share on other sites
Давайте применять общепринятые сокращения.

Есть сигнал разрешения работы счетчика, например "ena"

сигнал синхронного сброса - "sreset"

 

Счетчик считает при

if(ena) begin

CNT_REG <= CNT_REG + 1'b1;

...

 

Тут счётчик считает не тактовые импульсы, а импульсы со входа PLS, так-что доложно быть так:

if(ena) begin

if(PLS) CNT_REG <= CNT_REG + 1'b1;

 

либо так:

if(ena) begin

CNT_REG <= CNT_REG + PLS;

 

или ещё как.

 

Вход LATCH то-же нужно учитывать, сигнал на него может прийти одновременно с сигналом PLS,

и если это произошло, то записать в выходные регистры CNT_OUT <= CNT_REG + 1'b1;

Очистка CNT_REG, по снятию сигнала разрешения работы, обязательна.

 

 

 

 

 

Share this post


Link to post
Share on other sites
Тут счётчик считает не тактовые импульсы, а импульсы со входа PLS, так-что доложно быть так:

if(ena) begin

if(PLS) CNT_REG <= CNT_REG + 1'b1;

 

либо так:

if(ena) begin

CNT_REG <= CNT_REG + PLS;

 

или ещё как.

 

Вход LATCH то-же нужно учитывать, сигнал на него может прийти одновременно с сигналом PLS,

и если это произошло, то записать в выходные регистры CNT_OUT <= CNT_REG + 1'b1;

Очистка CNT_REG, по снятию сигнала разрешения работы, обязательна.

 

Давайте еще раз...

Я пытаюсь Вам объяснить, что не нужно плодить сущности... Иначе проект будет богат ошибками.

Есть стандартный счетчик. У него есть параметр "разрядность", входы "сброс", "синхронный сброс", "разрешение счета"... Ну и возможно "направление счета"... Вот это все и ничего более быть не должно...

Такой подход позволяет вставлять куски кода из заготовок одним кликом мыша... Либо в виде "модуля", либо в виде куска текста. Но в любом случае - без ошибок. Причем сразу с комментариями и с оформлением по всем правилам. Потому что наиболее часто встречающиеся куски кода я сразу же вставляю в "заготовки" в редакторе текста.

Если в понятие "разрешение счета" входят несколько сигналов, то на входе "разрешение счета" должно быть "ena & PLS".

Но никак не дополнительные строки текста

if(ena) begin

if(PLS)

 

Тоже самое и для "Очистка CNT_REG, по снятию сигнала разрешения работы, обязательна".. Есть вход "синхронный сброс", надо просто приписать туда нужный сигнал...

 

Был бы скайп, я бы показал на примерах. Так что ищите кафе или вокзал с бесплатным WiFi, если Вы не в СПБ.. Ну или познакомьтесь с девушкой у которой скайп есть.

Share this post


Link to post
Share on other sites

module fdb_cnt
(
input CLK,
input ENB,
input RST,
input LATCH,
input PLS,
output reg [23:0] CNT_OUT
);

reg [23:0] CNT_REG;
reg CNT_CLR;

always @ (posedge CLK)
begin
  if(RST | CNT_CLR) CNT_REG <= 24'd0;
  else if(ENB && PLS) CNT_REG <= CNT_REG + 1'b1;
end

always @ (posedge CLK or posedge RST)
begin
  if(RST) begin
    CNT_OUT <= 24'd0;
    CNT_CLR <= 1'b0;
  end
  else if(ENB && LATCH) begin
    CNT_OUT <= CNT_REG + PLS;
    CNT_CLR <= 1'b1;
  end
  else CNT_CLR <= ~ENB;
end

endmodule

 

Ну а так?

В симуляторе вроде работает, максимальная частота выросла на ~50МГц, и количество логических элементов уменьшилось на 20ть, до 52х.

Edited by Димон

Share this post


Link to post
Share on other sites

module efdb_cnt
(
input CLK,
input ENB,
input RST,
input LATCH,
input PLS,
output reg [23:0] CNT_OUT
);

reg [23:0] CNT_REG;

always @ (posedge CLK or posedge RST)
begin
  if(RST) CNT_REG <= 24'd0;
  else if(~ENB || LATCH) CNT_REG <= 24'd0;
  else CNT_REG <= CNT_REG + PLS;
end

always @ (posedge CLK or posedge RST)
begin
  if(RST) CNT_OUT <= 24'd0;
  else if(ENB && LATCH) CNT_OUT <= CNT_REG + PLS;
end

endmodule

 

Или так, даже поближе к пределу мечтаний будет.

 

post-93222-1473234289_thumb.png

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