преобразование проводного значения в целое число в verilog

#syntax #binary #integer #verilog

#синтаксис #двоичный #целое #verilog

Вопрос:

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

 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
  

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

Ответ №1:

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

 integer my_int;
always @( w )
    my_int = w;
  

Комментарии:

1. Спасибо. Я также хочу сделать обратное, как в w =my_int. разрешено ли это?

2. Это так, но вы получите только 3 LSBS из my_int сохраненных в w . Например, если число 'd16 ( 10000 ) находится в my_int , w станет = 3'b000

3. понял. Спасибо. Это означает, что я просто должен позаботиться о том, чтобы сохранить w достаточно долго.

Ответ №2:

Как сказал Марти: преобразование между битовыми векторами и целыми числами происходит автоматически. Но есть ряд подводных камней. Они очевидны, если вы помните, что целое число представляет собой 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];