преобразование значения провода в целое число в verilog - PullRequest
6 голосов
/ 14 апреля 2011

Я хочу преобразовать данные в проводнике в целое число.Например:

wire [2:0] w = 3'b101;

Я хочу метод, который преобразует это в «5» и сохраняет его в целое число.Как я могу сделать это лучше, чем это:

j=1;
for(i=0; i<=2; i=i+1)
begin
  a=a+(w[i]*j);   
  j=j*2;
end

Кроме того, как я могу преобразовать его обратно в двоичный файл, когда у меня есть значение в целом числе?Это кажется неуклюжим образом.Спасибо.

Ответы [ 2 ]

11 голосов
/ 14 апреля 2011

Легко! Преобразование происходит автоматически в verilog, если вы присваиваете целое число. В verilog все типы данных являются просто сборкой по битам.

integer my_int;
always @( w )
    my_int = w;
1 голос
/ 28 апреля 2018

Как сказал Марти: преобразование между битовыми векторами и целыми числами происходит автоматически.Но есть ряд подводных камней.Они очевидны, если учесть, что целое число - это 32-битное значение со знаком.

  • Не пытайтесь присвоить, например, 40-битное значение целому числу.
  • Битовый вектор по умолчанию не имеет знака, поэтому 32-битный вектор может стать отрицательным, когда он является целым числом.
  • Также верно и обратное: отрицательное целое число, например -3, станет вектором 8 со значением8'b11111101

Я не знаю, почему вы хотите преобразовать в целое число и обратно.Я просто хочу отметить, что арифметические операции полностью поддерживаются для битовых векторов со знаком и без знака.На самом деле они более мощные, поскольку нет 32-битного ограничения:

reg [127:0] huge_counter;
...
   always @(posedge clk)
      huge_counter <= huge_counter + 128'h1;

Также поддерживается использование вектора в качестве индекса:

wire [11:0] address;
reg  [ 7:0] memory [0:4095];
...
   assign read_data = memory[address];
...