Menu
CoddyTech

Số âm

Thuộc phần Kiến thức nền tảng trong hành trình Verilog của Coddy. Bài học 16 trên 90.

Trong Verilog, số âm được biểu diễn bằng định dạng bù hai. Bù hai là cách biểu diễn cả số dương lẫn số âm dưới dạng nhị phân. Bit có trọng số lớn nhất (MSB) cho biết dấu:

  • 0 = số dương
  • 1 = số âm

Cách tính bù hai

Để tìm bù hai của một số:

  1. Viết số dương ở dạng nhị phân
  2. Đảo tất cả các bit (0 thành 1, 1 thành 0)
  3. Cộng 1

Ví dụ: biểu diễn -5 bằng 4 bit

BướcThao tácKết quả
1Số 5 dương ở dạng nhị phân0101
2Đảo tất cả các bit1010
3Cộng 11011

-5 ở dạng bù hai 4 bit là 4'b1011

Viết số âm trong Verilog

Bạn có thể viết trực tiếp số âm ở dạng thập phân:

reg signed [3:0] a;
a = -5;        // Verilog tự động dùng mã bù hai

Với số nhị phân có độ rộng xác định, bạn phải viết giá trị bù hai:

a = 4'b1011;   // This is -5 in 4-bit two's complement

Có dấu và không dấu

Theo mặc định, tín hiệu reg và wire là không dấu. Để làm việc với số âm, hãy khai báo tín hiệu là signed:

reg signed [3:0] negative;   // Có thể lưu giá trị từ -8 đến 7
reg [3:0] positive;          // Có thể lưu giá trị từ 0 đến 15

Phạm vi số có dấu

Với N bit, một số có dấu có thể biểu diễn:

  • Tối thiểu: -2^(N-1)
  • Tối đa: 2^(N-1) - 1
Số bitKhoảng giá trị
4 bit-8 đến 7
8 bit-128 đến 127
16 bit-32768 đến 32767

Ghi chú quan trọng

  • Dùng từ khóa (keyword) signed để xử lý số âm
  • Nếu không có signed, reg hoặc wire sẽ xem mọi giá trị là số dương
  • Phép toán bù hai hoạt động tự động khi dùng signed
  • MSB xác định dấu: 1 = âm, 0 = dương
challenge icon

Thử thách

Hoàn thành đoạn code bằng cách viết các giá trị bù hai chính xác.

Cần làm:

  1. Gán -3 cho a bằng số nhị phân bù hai 4 bit
  2. Gán -8 cho b bằng số nhị phân bù hai 4 bit
  3. Gán -1 cho c bằng số nhị phân bù hai 4 bit

Tự làm thử

module negative_challenge;
  reg signed [3:0] a, b, c;
  
  initial begin
    a = 4'b______;   // -3 in 4-bit two's complement
    b = 4'b______;   // -8 in 4-bit two's complement
    c = 4'b______;   // -1 in 4-bit two's complement
    
    $display("a = %d", a);
    $display("b = %d", b);
    $display("c = %d", c);
    $finish;
  end
endmodule
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Kiến thức nền tảng

Tự luyện tập: Trình biên dịch Verilog online