В Verilog подсчет и вывод количества 1 в 8-битном вводе?

Что я пытаюсь сделать в уме, так это взять 8 1-битных входных данных и подсчитать единицы. Затем представьте эти единицы.

01010111 должен выводить 0101 (есть пять единиц на входе)

module 8to4 (in,out,hold,clk,reset);
input [7:0] in; //1 bit inputs
reg [7:0] hold; //possible use for case statement
output [3:0] out; //Shows the count of bits

always @(clk)
  begin
    out = in[0] + in[1] + in[2] + in[3] + in[4] + in[5] + in[6] + in[7]; //Adds the inputs from testbench and outputs it
  end
endmodule

Вопросы:

  • Это правильный способ иметь 8 1-битных входов? Или мне нужно объявить каждую переменную как один бит, например: input A, B, C, D, E, F, G, H;
  • Если мой приведенный выше код близок к правильному, это правильный способ вывести количество единиц? Нужна ли мне выписка по делу?

Я действительно новичок в verilog, поэтому пока даже не хочу думать о тестовом стенде.


person Link Page    schedule 13.10.2017    source источник


Ответы (2)


То, как вы это написали, вероятно, лучше, потому что это упрощает параметризацию количества битов. Но технически у вас есть один 8-битный ввод.

module 8to4 #(parameter WIDTH=8) (input [WIDTH-1:0] in, 
                        output reg [3:0] out,hold,
                        input clk,reset);
  reg [WIDTH-1:0] temp;
  integer ii;
  always @(clk)
    begin
      temp = 0;
      for(ii=0; ii<WIDTH; i = i + 1)   
         temp = temp + in[ii];
      out <= temp;
    end
endmodule
person dave_59    schedule 13.10.2017
comment
Извините, я все еще новичок в этом. Не могли бы вы объяснить #(WIDTH-8)? Кроме того, после нескольких гуглений integer ii; Честно говоря, я не знал, что Verilog может создавать такие целые числа, и я понятия не имел, как написать для него тестовый стенд. - person Link Page; 13.10.2017
comment
Извините, это была опечатка. Я параметризовал ваш модуль, чтобы его можно было использовать для разных размеров входов. Когда WIDTH=8, цикл for делает то же самое, что и исходное выражение. Инструменты синтеза развернут мою петлю в ваше выражение. Но теперь, когда он параметризован, вы можете переопределить WIDTH на 16 или что-то еще. - person dave_59; 13.10.2017

Логически код правильный.

Однако вы можете улучшить его следующим образом.

  • Сделайте out как reg, потому что вы используете его в процедурном задании.
  • Использование reset. В идеале любой код должен иметь состояние сброса, которого нет в вашем коде.
  • Объявите направление (ввод/вывод) для порта hold, clk и reset, которое в настоящее время не указано.
  • Как уже упоминал Дейв, вы можете использовать parameters для своего кода.
person Karan Shah    schedule 14.10.2017