#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];