среда, 25 сентября 2013 г.

Числа в INT

В контексте данной записи под переменной будет иметься в виду reg[2:0].
По умолчанию все переменные в Verilog беззнаковые, а не наоборот. Поэтому объявленная переменная может принимать значения от 0 (3'b000) до 7(3'b111).
Чтобы сделать переменную знаковой, нужно добавить ключевое слово signed. Тогда переменная может принять значение в диапазоне:

011 //3
010 //2
001 //1
000 //0
111 //-1
110 //-2
101 //-3
100 //-4

Тут стоит обратить внимание на то, что для числа -4 не существует противоположного. Получить -1 из 1 можно проинвертировав все биты(~) и прибавив единицу:
1 = 001; ~1 = 110; -1 = ~1+1 = 110 + 001 = 111 == -1;
-4 = 100; ~(-4) = 011; ~(-4)+1 = 011 + 001 = 100 == -4;
Например, если нам понадобиться генерировать синус и косинус применительно к нашей переменной, то амплитуду нужно брать в диапазоне -3..3.
Для того, чтобы получить противоположное число на Verilog достаточно поставить "-" :
reg     [  2 :  0 ] a = 3'b001; //1
wire    [  2 :  0 ] na = -a; //111
и
reg     [  2 :  0 ] a = 3'b100; //-4
wire    [  2 :  0 ] na = -a; //100

Важно помнить, хоть na = -a, это число все равно остается беззнаковым. И если сравнить два числа, то большим окажется "отрицательное".
reg     [  2 :  0 ] a = 3'b001; //001
wire    [  2 :  0 ] na = -a; //111
wire    [  2 :  0 ] bigger = na > a ? na : a; //111

Поэтому, если будут проводиться какие-то операции над числами, лучше использовать знаковые числа. При этом результат так же должен быть знаковым.
reg     signed  [  2 :  0 ] a = 3'b001; //001
wire    signed  [  2 :  0 ] na = -a;    //111
wire    signed  [  2 :  0 ] bigger = na > a ? na : a;   //001




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

Отправить комментарий