32 / 37 · Thực hành
Thực hành tích hợp: xung định kỳ và bộ tích lũy cho phép
Đặc tả truyền giá trị cũ và kiểm tra tạm dừng, xung liên tiếp, reset đồng thời.
Bài học miễn phí. Đăng ký để lưu tiến độ học tập.
Xác định kết nối trước ghép
Nhận sample bốn bit không dấu tại mỗi cạnh lên có enable=1. Mỗi N mẫu nhận, tạo pulse có thanh ghi. Bộ tích lũy dùng pulse và sample tương ứng đã lưu tại cạnh lên kế tiếp, kể cả enable=0 lúc đó. total tám bit quay modulo 256. Reset đồng bộ xóa các tầng, bỏ mẫu đang chờ. Độ trễ một cạnh thuộc hợp đồng: bộ tích lũy đọc pulse/saved_sample cũ, không đọc giá trị không chặn mới của cùng cạnh. Lưu modulo_tick.sv và periodic_accumulator.sv này; N dương.
module periodic_accumulator #(parameter integer N = 3) (
input logic clk, rst, enable,
input logic [3:0] sample,
output logic pulse,
output logic [7:0] total
);
localparam integer CW = (N <= 1) ? 1 : $clog2(N);
wire [CW-1:0] count;
logic [3:0] saved_sample;
modulo_tick #(.N(N)) tick_u (
.clk(clk), .rst(rst), .enable(enable),
.count(count), .pulse(pulse)
);
always_ff @(posedge clk) begin
if (rst) saved_sample <= 4'b0;
else if (enable) saved_sample <= sample;
end
always_ff @(posedge clk) begin
if (rst) total <= 8'b0;
else if (pulse) total <= total + {4'b0, saved_sample};
end
endmoduleTheo dõi dữ liệu cùng sự kiện
N=3, đầu vào trước và đầu ra sau cạnh.
| Cạnh | rst | enable | sample | pulse sau | total sau |
|---|---|---|---|---|---|
| E0 | 1 | 1 | 9 | 0 | 0 |
| E1 | 0 | 1 | 2 | 0 | 0 |
| E2 | 0 | 1 | 4 | 0 | 0 |
| E3 | 0 | 1 | 7 | 1 | 0 |
| E4 | 0 | 0 | 9 | 0 | 7 |
| E5 | 0 | 1 | 1 | 0 | 7 |
| E6 | 0 | 1 | 3 | 0 | 7 |
| E7 | 0 | 1 | 5 | 1 | 7 |
| E8 | 1 | 1 | 15 | 0 | 0 |
E4 cộng 7, không phải sample ngoài 9. enable chỉ điều khiển nhận mới, không hủy việc chờ. E8 bỏ 5 và xóa total. enable && pulse ở khâu dùng mẫu sẽ mất E4.
Tham chiếu tại ranh giới hệ thống
Giữ số mẫu nhận, giá trị chờ tùy chọn và total số nguyên. Tại cạnh không reset, trước hết dùng chờ cũ modulo 256; sau đó dùng enable/sample hiện tại tạo việc chờ ở lần nhận thứ N. Reset xóa mọi thứ. Không đọc tick_u.count hay saved_sample. Kích thích tại cạnh xuống, so sau đó: pulse, total, giữ khi không sự kiện, và loại mẫu đã dùng.
Bao phủ lỗi tích hợp
- N=1 tạo xung liên tiếp: mỗi mẫu phải dùng đúng một lần tại cạnh kế tiếp.
- N=3 với dừng trước/sau mẫu cuối: đếm nhận, không đếm mọi clock.
- Đổi sample ngoài khi dùng mẫu với enable=0: phải dùng dữ liệu lưu.
- Reset khi chờ hủy sự kiện và total.
- Cộng vượt 255 rồi kiểm tra modulo 256.
Thay saved_sample bằng sample: E4 phải lỗi. Gắn việc dùng mẫu với enable rồi xác nhận lỗi khác. Khôi phục trước PASS. Hợp đồng đã thử là chức năng, một clock, độ rộng hữu hạn; không chứng minh CDC, đóng timing vật lý hay thực hành DDS miễn phí trong sản phẩm.