Verilog несколько счетчиков - PullRequest
0 голосов
/ 04 июня 2018

У меня есть модуль Verilog с входом и выходом револьвера

  module Foo
    #(
        parameter DATA_BITS = 32,
        parameter ENUM_BITS = 8,
        parameter LED_BITS  = 8 
    )
    (
        //Module IO declarations
        input  logic    Clk_i,
        input  logic    Reset_i,
        input  logic    NoGoodError_i,
        input  logic    EncoderSignal_i,
        input  logic    [DATA_BITS-1:0]DistanceCount_i,
        //Enable the gate 
       output logic    GateEnable_o
   )

Общая идея проекта заключается в следующем.Когда я получу положительное ребро NoGoodError_i, запустите счетчик и посчитайте до счетчика DistanceCount_i через положительные ребра сигнала EncoderSignal_i.Это кажется довольно простым, однако моя задача при разработке заключается в том, что я могу получить еще один NoGoodError_i до того, как я закончу считать предыдущий счет.Итак, мне нужен способ получить до 10 сигналов NoGoodError_i в строке и начать счетчики.Затем повторно используйте счетчики, когда они истекают (Ролловер).Пожалуйста, любые советы по дизайну будет принята с благодарностью.

1 Ответ

0 голосов
/ 04 июня 2018

Я бы взял массив счетчиков, каждый с битом «занят».Если бит установлен, счетчик работает.

Далее вы используете индекс по модулю-10, какой бит занят для установки.

Я бы поднял флаг, если счетчик, который вы хотите запустить, все еще работаетзанят.


Я только что набрал это на лету: нет синтаксического анализа и возможны опечатки (даже вероятно):

reg [DATA_BITS-1:0] counter [0:9];
reg [9:0] busy;
reg [3:0] cntr_to_start;

always @(posedge Clk_i or posedge Reset_i)
begin
   if (Reset_i)
   begin
      busy <= 10'b0;
      for (i=0; i=<10; i=i+1)
         counter[i] <= 'b0;
      cntr_to_start <= 'b0;
   end
   begin

      // Run a counter if it's busy flag is set
      // At max (rollover) stop and clear the busy flag
      for (i=0; i<10; i=i+1)
      begin
         if (busy[i])
         begin
            if (counter[i]==(33'b1<<DATA_BITS)-1)
            begin
               counter[i] <= 1'b0;
               busy[i] <= 1'b0;
            end
            else
                counter[i] <= counter[i] + 1;
         end
      end

      // If no good start the next counter
      // If we have no next counter: ????
      if (NoGoodError_i)
      begin
         if (busy[cntr_to_start])
            // Houston: we have a problem!
            // More errors then we have counters
         else
         begin
            busy[cntr_to_start] <= 1'b1;
            if (cntr_to_start==9)
               cntr_to_start <= 'b0;
            else
               cntr_to_start <= cntr_to_start + 1;            
         end
   end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...