В контексте данной записи под переменной будет иметься в виду 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
По умолчанию все переменные в 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
Комментариев нет:
Отправить комментарий