52 / 63 · Khái niệm
Barrel shifter và các tầng MUX
Hiện thực lượng dịch thay đổi bằng các tầng MUX dịch 1·2·4·8 vị trí, xử lý chia sẻ hướng dịch, điền dấu và lượng dịch vượt độ rộng.
Bài học miễn phí. Đăng ký để lưu tiến độ học tập.
Kiến thức trước: MUXBộ chọn kênh Mạch tổ hợp nối một trong nhiều đầu vào tới đầu ra theo tín hiệu chọn. Phải quy định quan hệ giữa bit chọn và số đầu vào. Tìm hiểu thêm, dịch logic/số học và trễ lan truyềnĐộ trễ lan truyền Thời gian từ khi đầu vào đổi đến khi đầu ra ổn định ở giá trị đúng. Tương đương logic và đặc tính thời gian là hai vấn đề riêng. Tìm hiểu thêm của mạch tổ hợp.
Đổi dịch biến thiên thành chọn dây cố định
Thanh ghi dịchThanh ghi Mạch lưu trạng thái nhiều bit. Thanh ghi đồng bộ trong khóa học lưu đầu vào đã quy định tại cạnh clock. Tìm hiểu thêm từng bit dùng số clock bằng số lần dịch. Barrel shifter nhận lượng dịch và tạo kết quả trong một đường tổ hợp. Bit không di chuyển nhiều lần theo thời gian; mạch chọn đường dây nối bit đầu vào cần thiết tới đầu ra.
Dịch số 16 bit từ 0~15 vị trí có . Nối tiếp bốn tầng dịch 1,2,4,8 vị trí. Mỗi tầng dùng MUX chọn “đi qua nguyên” hoặc “dịch số vị trí cố định”.
11 là nhị phân 1011 nên chọn tầng 1,2,8, đi thẳng qua tầng 4. Dịch logic phải cho lần lượt 0x6952,0x1A54,0x1A54,0x001A. Đây là giá trị bốn tầng tổ hợp, không phải bốn clock.
Mỗi tầng có 16 MUX; bốn tầng có 64 điểm chọn 2:1 một bit trước khi tối ưu dây và hằng. Tổng quát , cấu trúc chọn tỷ lệ , độ sâu tỷ lệ . Ngay cả khi viết MUX W:1 riêng cho từng đầu ra, công cụ tổng hợp cũng có thể đổi thành cây; không suy diện tích hoặc tần số từ số dòng RTL.
Dịch logic phải 0xD2A5 đi 11 vị trí. Hình chỉ bốn tầng tổ hợp được chọn bởi các bit 1011, không phải thực thi qua bốn clock.
- Tầng dịch 1 · s0=1: D2A5 → 6952
- Tầng dịch 2 · s1=1: 6952 → 1A54
- Tầng dịch 4 · s2=0: Cho 1A54 đi nguyên
- Tầng dịch 8 · s3=1: 1A54 → 001A
Dùng mạch dịch phải để dịch trái
Đảo thứ tự bit, dịch logic phải s vị trí rồi đảo lại sẽ được dịch logic trái. Tính đối xứng này cho phép chia sẻ bốn tầng, nhưng phải thêm MUX chọn hướng ở đầu vào/ra nên tổng chi phí không dừng ở 64. Khi không cần chọn hướng, việc đảo thứ tự bit cố định tự nó chỉ cần dây nối.
Dịch phải số học điền bit dấu của đầu vào gốc vào chỗ cao trống. Dịch trái vẫn điền 0 dù chế độ số học. Trong bù haiBù hai Cách biểu diễn số nguyên có dấu bằng chuỗi bit có độ rộng cố định. Phạm vi n bit là −2^(n−1) đến 2^(n−1)−1. Tìm hiểu thêm, dịch trái số học và logic có cùng dịch bit, không tự kiểm overflow signed.
Phạm vi lượng dịch cũng thuộc hợp đồng của mạch. Ví dụ dưới đây nhận giá trị 0–31 qua shamt 5 bit. Khi lượng dịch từ 16 trở lên, dịch logic và dịch trái cho 0; dịch phải số học cho 16 bản sao của bit dấu. Chỉ dùng 4 bit thấp của shamt sẽ nhầm dịch 16 vị trí thành dịch 0 vị trí, nên phải xử lý riêng trường hợp này.
module barrel16 (
input wire [15:0] x,
input wire [4:0] shamt,
input wire left,
input wire arithmetic,
output wire [15:0] y
);
wire fill;
wire [15:0] stage [0:4];
assign fill = (!left) && arithmetic && x[15];
for (genvar i = 0; i < 16; i++) begin : direction
assign stage[0][i] = left ? x[15-i] : x[i];
assign y[i] = shamt[4] ? fill :
(left ? stage[4][15-i] : stage[4][i]);
end
for (genvar k = 0; k < 4; k++) begin : shift_stage
localparam int D = 1 << k;
assign stage[k+1] = shamt[k]
? {{D{fill}}, stage[k][15:D]}
: stage[k];
end
endmodulek trong generate là hằng số được xác định khi tạo mạch. Đây không phải thiết bị chạy vòng lặp bốn lần lúc hoạt động. Độ dài part-select và phép nối lặp ở mỗi tầng đều cố định, nên mạch được biểu diễn bằng bốn kiểu nối dây cố định cùng MUX. fill không thay đổi theo tầng; dù chọn nhiều tầng, mạch vẫn mở rộng bằng cùng một bit dấu.
RTL này chỉ rõ bit điền để thực hiện dịch số học ngay cả trên vector unsignedunsigned Quy tắc diễn giải chuỗi bit là số nguyên không âm. Phạm vi n bit là 0 đến 2^n−1 và có thể khác diễn giải signed của cùng chuỗi bit. Tìm hiểu thêm. Nếu viết gọn bằng toán tử, dịch phải số học cần toán hạng signed và >>>. Đừng cho rằng chỉ thêm ký hiệu >>> hoặc khai báo biến gốc của một part-select là signed đã bảo đảm đúng. Phép nối và một số phép chọn có thể làm mất cách diễn giải signed; cần chuyển trước sang giá trị signed có độ rộng mong muốn. Xem các toán tử được công cụ tổng hợp hỗ trợ trong tài liệu biểu thức Verilog của AMD.
Xử lý riêng độ trễ và mất thông tin
Ngoài bốn tầng tổ hợp còn có độ trễ chọn hướng, chọn phạm vi và dây nối. Nếu không đạt timing, có thể chèn thanh ghi giữa các tầng, nhưng phải trì hoãn cả dữ liệu lẫn các điều khiển lượng dịch còn lại và hướng dịch cùng số chu kỳ. Khi đó latencyĐộ trễ Thời gian hoặc số chu kỳ từ lúc nhận đầu vào đến lúc có đầu ra tương ứng. Khác với thông lượng, tức số lượng xử lý trong một đơn vị thời gian. Tìm hiểu thêm đầu ra thay đổi và không thể coi giao diện giống mô-đun tổ hợp đơn giản nữa.
Phép dịch không khôi phục được thông tin đã bị loại. Với dịch trái unsigned, nếu có bất kỳ bit cao nào bị đẩy ra là 1 thì kết quả vượt phạm vi. Với signed, cần xét cả dấu ban đầu và các bit bị loại. Mô-đun này không xuất các cờ đó. Ngoài ra, dịch phải số học một số âm làm tròn thương khi chia cho xuống số nguyên phía dưới. Vì vậy dịch một vị trí cho , khác kết quả của phép chia nguyên làm tròn về 0.
Tự thử
Với x=0x8123 có 16 bit, hãy tính kết quả của (1) dịch logic phải 3 vị trí, (2) dịch số học phải 3 vị trí, (3) dịch logic trái 16 vị trí và (4) dịch số học phải 20 vị trí. Giải thích các tầng được chọn ở (2) và lỗi ở (3) nếu bỏ xử lý shamt[4].
Đọc giải thích
Kết quả (1) là 0x1024, (2) là 0xF024, (3) là 0x0000, (4) là 0xFFFF. Vì 3=1+2, mạch chọn tầng dịch 1 và 2 vị trí. Giá trị trung gian của dịch số học là 0xC091→0xF024; dấu ban đầu bằng 1 nên các vị trí cao được điền 1. Với 16, shamt=10000; nếu chỉ dùng bốn bit thấp, mạch bỏ qua mọi tầng và xuất nguyên giá trị 0x8123. Do đó phải phát hiện riêng lượng dịch từ 16 trở lên. Dù bật chế độ số học, dịch trái vẫn điền 0 vào các vị trí thấp còn trống.