THIẾT kế MODULE INTERRUPT CONTROLLER TRONG KIẾN TRÚC AMBA BẰNG VERILOG (có code) THIẾT kế MODULE INTERRUPT CONTROLLER TRONG KIẾN TRÚC AMBA BẰNG VERILOG (có code) THIẾT kế MODULE INTERRUPT CONTROLLER TRONG KIẾN TRÚC AMBA BẰNG VERILOG (có code) THIẾT kế MODULE INTERRUPT CONTROLLER TRONG KIẾN TRÚC AMBA BẰNG VERILOG (có code) THIẾT kế MODULE INTERRUPT CONTROLLER TRONG KIẾN TRÚC AMBA BẰNG VERILOG (có code)
ĐỒ ÁN TỐT NGHIỆP THIẾT KẾ MODULE INTERRUPT CONTROLLER TRONG KIẾN TRÚC AMBA BẰNG VERILOG MỤC LỤC DANH MỤC CÁC HÌNH VẼ DANH MỤC CÁC BẢNG BIỂU DANH MỤC CÁC TỪ VIẾT TẮT ACE AXI Coherency Extensions AHB Advanced High-performance Bus AMBA Advanced Microcontroller Bus Architecture APB Advanced Peripheral Bus ARM Advanced RISC Machine ASIC Application-Specific Integrated Circuits AXI Advanced eXtensible Interface CPU Central Processing Unit FPGA Field-programmable Gate Array HDL Hardware Description Language INCTRL Interrupt Controller PDA Personal Digital Assistant RAM Random Access Memory ROM Read-Only Memory RTL Register Transfer Level SoC System on Chip ĐỒ ÁN TỐT NGHIỆP Trang 6/76 CHƯƠNG GIỚI THIỆU ĐỀ TÀI 1.1 Đặt vấn đề Ngày này, 75% CPU nhúng 32-bit thuộc họ ARM, điều khiến ARM trở thành cấu trúc 32-bit sản xuất nhiều giới CPU ARM tìm thấy khắp nơi sản phẩm thương mại điện tử, từ thiết bị cầm tay (PDA, điện thoại di động, máy đa phương tiện, máy trò chơi cầm tay, máy tính cầm tay) thiết bị ngoại vi máy tính (ổ đĩa cứng, định tuyến để bàn) ARM Advanced Microcontroller Bus Architecture (AMBA) tiêu chuẩn mở (open-standard) cho phép kết nối quản lý khối chức thiết kế hệ thống chip (SoC) Ngày nay, AMBA sử dụng rộng rãi nhiều phận ASIC SoC bao gồm xử lý ứng dụng sử dụng thiết bị di động di động đại điện thoại thơng minh Do đó, đề tài thiết kế khối module hệ thống SoC dựa theo kiến trúc ARM AMBA, khối module đóng vai trò quan trọng hệ thống, Interrupt Controller 1.2 Yêu cầu đề tài Việc cần làm luận văn tìm hiểu cấu trúc điều khiển ngắt (Interrupt Controller) APB Thế Interrupt Controller? Vai trò giúp cho hệ thống Vị trí nằm đâu hệ thống Và cách hoạt động module Interrupt hệ thống Ta phải tìm hiểu chuẩn giao thức APB hoạt động nào, interface bao gồm cổng nào, có tính bật lợi ích sử dụng Sau đó, ta thực viết code ngơn ngữ lập trình Verilog để thiết kế module Interrupt Controller có khả cung cấp trạng thái nguồn ngắt, ngõ vào gì, ngõ gì, có ngõ Trạng thái yêu cầu ngắt sao, có Thiết kế Interrupt Controller SVTH: Nguyễn Hải Tân ĐỒ ÁN TỐT NGHIỆP Trang 7/76 ghi, trạng thái ngắt Và điều khiển ghi để định nguồn ngắt tích cực gửi yêu cầu ngắt đến CPU không Bước vô quan trọng việc thiết kế module hay hệ thống đó, viết testbench để kiểm tra hoạt động module Kiểm tra xem module có hoạt động chức khơng Có ngõ vào, ngõ để kiểm tra Liệt kê có trường hợp kiểm tra testbench, có trường hợp đặc biệt khơng Sau thiết kế xong, bước cuối cần làm đánh giá hoạt động module dựa vào xem mô dạng sóng, đánh giá tài nguyên sử dụng, thống kê xem có cổng vào ra, khối thực thể, ghi, cổng logic, flip-flop, dây nối, dung lượng sử dụng Thiết kế Interrupt Controller SVTH: Nguyễn Hải Tân ĐỒ ÁN TỐT NGHIỆP Trang 8/76 1.3 Phương pháp Bước cần làm luận văn tìm hiểu xem lại kiến thức ngôn ngữ Verilog học trước Tìm hiểu xem bước để thiết kế module nào, sử dụng thuật toán để thiết kế Tiếp theo tìm hiểu AMBA APB protocol Chuẩn giao thức sử dụng nào, tính ưu điểm Chuẩn giao thức APB có tín hiệu nào, nêu rõ ý nghĩa chức tín hiệu Cách thức truyền nhận chuẩn giao thức diễn nào, liệu truyền thông qua đâu, hỗ trợ tối đa bit cho địa liệu [5] Để thiết kế module Interrupt Controller, ta phải tìm hiểu vai trò hoạt động module hệ thống Quyết định bào nhiêu ngõ vào cho module Module xử lý ngắt dựa vào tín hiệu nào, báo ngắt cho CPU cách Tìm hiểu xem module xử lý bit liệu có ghi khối module Sau đó, ta tìm hiểu module trước sai Interrupt Controller module Giả lập cho khối hoạt động với Các khối module bao gồm: Interrupt Controller, Timer, Interrupt Controller, hệ thống Bus CPU Sau tìm hiểu xong, việc viết code Verilog cho module riêng biệt bao gồm: Timer 0, Timer 1, Timer 2, Interrupt Controller, CPU, Bus, Wrapper Thể vai trò, chức module Sau đó, kết nối module lại với thông qua hệ thống bus viết theo chuẩn giao thức APB Thiết kế Interrupt Controller SVTH: Nguyễn Hải Tân ĐỒ ÁN TỐT NGHIỆP Trang 9/76 Tiếp theo ta thiết kế Testbench ngôn ngữ Verilog để kiểm tra hoạt động hệ thống Testbench viết để giả lập trường hợp xảy thiết kế kiểm tra trường hợp có hoạt động khơng Sau viết testbench xong, ta biên soạn mô module thiết kế phần mêm mô Một mô phổ biết mơ dạng sóng Kiểm tra dạng sóng (waveform) để xác định hệ thống hoạt động hay không Thống kê tài nguyên sử dụng hệ thống, so sánh với yêu cầu ban đầu để đánh giá Thiết kế Interrupt Controller SVTH: Nguyễn Hải Tân ĐỒ ÁN TỐT NGHIỆP Trang 10/76 CHƯƠNG CÁC VẤN ĐỀ LÝ THUYẾT LIÊN QUAN 1.4 Tổng quan ngôn ngữ Verilog 1.1.1 Giới thiệu Verilog ngôn ngữ mô tả phần cứng (Hardware Description Language)được sử dụng việc thiết kế các hệ thống số, mạch tích hợp: nhớ RAM, vi xử lý đơn giản D-FlipFlop Cùng với ngôn ngữ VHDL, Verilog hai ngôn ngữ mô tả phần cứng phổ biến [1] Verilog có đặc điểm tính độc lập cơng nghệ, dễ dàng thiết kế debug, tính đơn giản so với thiết kế sơ đồ khối (schematics), đặc biệt việc thiết kế hệ thống phức tạp Verilog dùng để xây dựng ứng dụng công nghệ FPGA, CPLDs…Code Verilog dùng để mô tả hệ thống số xây dựng thiết bị lập trình hãng Xilinx, Altera, 1.1.2 Một số ưu điểm ngơn ngữ Verilog Nền tảng mạnh : chuẩn hóa năm 1995 IEEE, hỗ trợ công nghiệp, phổ biến cho nhà ASIC dễ học, cho phép mơ tổng hợp hiệu Tính đa năng: cho phép trình thiết kế thực thể thực mơi trường thiết kế phân tích kiểm tra Tuy nhiên Verilog khơng thích hợp cho thiết kế mức hệ thống phức tạp, trở ngại Verilog Hỗ trợ cơng nghiệp: phổ biến cho nhà thiết kế ASIC dễ học , cho phép mô nhanh tổng hợp hiệu Thiết kế Interrupt Controller SVTH: Nguyễn Hải Tân ĐỒ ÁN TỐT NGHIỆP Trang 68/76 wire int_2; wire [MAX_DATA-1:0] prdata_2; wire pslverr_2; wire pready_2; reg psel_2; reg penable_2; reg pwrite_2; reg [MAX_DATA-1:0] pwdata_2; reg [MAX_ADDR-1:0] paddr_2; // // Interrupt Interfaces // input [MAX_DATA-1:0] prdata_i; input pslverr_i; input pready_i; output psel_i; output penable_i; output pwrite_i; output [MAX_DATA-1:0] pwdata_i; output [MAX_ADDR-1:0] paddr_i; wire irq; wire [MAX_DATA-1:0] prdata_i; wire pslverr_i; wire pready_i; reg psel_i; reg penable_i; Thiết kế Interrupt Controller SVTH: Nguyễn Hải Tân ĐỒ ÁN TỐT NGHIỆP Trang 69/76 reg pwrite_i; reg [MAX_DATA-1:0] pwdata_i; reg [MAX_ADDR-1:0] paddr_i; // // CPU Interfaces // input psel_u; input penable_u; input pwrite_u; input [MAX_ADDR-1:0] paddr_u; input [MAX_DATA-1:0] pwdata_u; output [MAX_DATA-1:0] prdata_u; output pslverr_u; output pready_u; wire psel_u; wire penable_u; wire pwrite_u; wire [MAX_ADDR-1:0] paddr_u; wire [MAX_DATA-1:0] pwdata_u; reg [MAX_DATA-1:0] prdata_u; reg pslverr_u; reg pready_u; always @ (*) begin prdata_u = 0; pslverr_u = 0; Thiết kế Interrupt Controller SVTH: Nguyễn Hải Tân ĐỒ ÁN TỐT NGHIỆP Trang 70/76 pready_u = 0; psel_0 = 0; penable_0 = 0; pwrite_0 = 0; paddr_0 = 0; pwdata_0 = 0; psel_1 = 0; penable_1 = 0; pwrite_1 = 0; paddr_1 = 0; pwdata_1 = 0; psel_2 = 0; penable_2 = 0; pwrite_2 = 0; paddr_2 = 0; pwdata_2 = 0; psel_i = 0; penable_i = 0; pwrite_i = 0; paddr_i = 0; pwdata_i = 0; case(paddr_u) 8'h02: begin prdata_u = prdata_0; pslverr_u = pslverr_0; pready_u = pready_0; psel_0 = psel_u; Thiết kế Interrupt Controller SVTH: Nguyễn Hải Tân ĐỒ ÁN TỐT NGHIỆP Trang 71/76 penable_0 = penable_u; pwrite_0 = pwrite_u; paddr_0 = paddr_u; pwdata_0 = pwdata_u; end 8'h04: begin prdata_u = prdata_1; pslverr_u = pslverr_1; pready_u = pready_1; psel_1 = psel_u; penable_1 = penable_u; pwrite_1 = pwrite_u; paddr_1 = paddr_u; pwdata_1 = pwdata_u; end 8'h06: begin prdata_u = prdata_2; pslverr_u = pslverr_2; pready_u = pready_2; psel_2 = psel_u; penable_2 = penable_u; pwrite_2 = pwrite_u; paddr_2 = paddr_u; pwdata_2 = pwdata_u; end 8'h07,8'h08: begin Thiết kế Interrupt Controller SVTH: Nguyễn Hải Tân ĐỒ ÁN TỐT NGHIỆP Trang 72/76 prdata_u = prdata_i; pslverr_u = pslverr_i; pready_u = pready_i; psel_i = psel_u; penable_i = penable_u; pwrite_i = pwrite_u; paddr_i = paddr_u; pwdata_i = pwdata_u; end default: begin prdata_u = 0; pslverr_u = 0; pready_u = 0; end endcase end endmodule Thiết kế Interrupt Controller SVTH: Nguyễn Hải Tân ĐỒ ÁN TỐT NGHIỆP Trang 73/76 Wrapper //***************************************************************** // INTERRUPT // CONTROLLER // // Module: dut // Author: Nguyen Hai Tan // Date : Dec 21, 2017 // //***************************************************************** module dut (pclk, pclk_timer, presetn, en_cnt_0, int_0, en_cnt_1, int_1, en_cnt_2, int_2 // posedge clock for system // posedge clock for timer // negedge reset // enable signal for timer_0 // interrupt signal of timer_0 // enable signal for timer_1 // interrupt signal of timer_1 // enable signal for timer_2 // interrupt signal of timer_2 ); // -// Parameter // -parameter MAX_DATA = 8; parameter MAX_ADDR = 8; Thiết kế Interrupt Controller SVTH: Nguyễn Hải Tân ĐỒ ÁN TỐT NGHIỆP Trang 74/76 // -// Port Declarations // -input pclk; input pclk_timer; input presetn; input en_cnt_0; input en_cnt_1; input en_cnt_2; output [2:0] int_0; output [2:0] int_1; output [2:0] int_2; // -// Internal Declarations // -wire en_cnt_0; wire en_cnt_1; wire en_cnt_2; wire [2:0] int_0; wire [2:0] int_1; wire [2:0] int_2; wire irq; // // Timer_0 Interfaces // wire wire [MAX_DATA-1:0] prdata_0; psel_0; Thiết kế Interrupt Controller SVTH: Nguyễn Hải Tân ĐỒ ÁN TỐT NGHIỆP Trang 75/76 wire penable_0; wire pwrite_0; wire [MAX_DATA-1:0] pwdata_0; wire [MAX_ADDR-1:0] paddr_0; // // Timer_1 Interfaces // wire [MAX_DATA-1:0] prdata_1; wire psel_1; wire penable_1; wire pwrite_1; wire [MAX_DATA-1:0] pwdata_1; wire [MAX_ADDR-1:0] paddr_1; // // Timer_2 Interfaces // wire [MAX_DATA-1:0] prdata_2; wire psel_2; wire penable_2; wire pwrite_2; wire [MAX_DATA-1:0] pwdata_2; wire [MAX_ADDR-1:0] paddr_2; // // Interrupt Interfaces // wire [MAX_DATA-1:0] prdata_i; Thiết kế Interrupt Controller SVTH: Nguyễn Hải Tân ĐỒ ÁN TỐT NGHIỆP Trang 76/76 wire penable_i; wire pwrite_i; wire [MAX_DATA-1:0] pwdata_i; wire [MAX_ADDR-1:0] paddr_i; // // CPU Interfaces // wire psel_u; wire penable_u; wire pwrite_u; wire [MAX_ADDR-1:0] paddr_u; wire [MAX_DATA-1:0] pwdata_u; wire [MAX_DATA-1:0] prdata_u; //================================================ // Connecting modules //================================================ bus bus(.pclk(pclk), presetn(presetn), psel_0(psel_0), penable_0(penable_0), pwrite_0(pwrite_0), paddr_0(paddr_0), pwdata_0(pwdata_0), prdata_0(prdata_0), psel_1(psel_1), penable_1(penable_1), Thiết kế Interrupt Controller SVTH: Nguyễn Hải Tân ĐỒ ÁN TỐT NGHIỆP Trang 77/76 pwrite_1(pwrite_1), paddr_1(paddr_1), pwdata_1(pwdata_1), prdata_1(prdata_1), psel_2(psel_2), penable_2(penable_2), pwrite_2(pwrite_2), paddr_2(paddr_2), pwdata_2(pwdata_2), prdata_2(prdata_2), psel_i(psel_i), penable_i(penable_i), pwrite_i(pwrite_i), paddr_i(paddr_i), pwdata_i(pwdata_i), prdata_i(prdata_i), psel_u(psel_u), penable_u(penable_u), pwrite_u(pwrite_u), paddr_u(paddr_u), pwdata_u(pwdata_u), prdata_u(prdata_u)); timer0_apb timer_0(.pclk(pclk_timer), presetn(presetn), psel(psel_0), penable(penable_0), pwrite(pwrite_0), paddr(paddr_0), Thiết kế Interrupt Controller SVTH: Nguyễn Hải Tân ĐỒ ÁN TỐT NGHIỆP Trang 78/76 pwdata(pwdata_0), en_cnt_0(en_cnt_0), int_0(int_0), prdata(prdata_0)); timer1_apb timer_1(.pclk(pclk_timer), presetn(presetn), psel(psel_1), penable(penable_1), pwrite(pwrite_1), paddr(paddr_1), pwdata(pwdata_1), en_cnt_1(en_cnt_1), int_1(int_1), prdata(prdata_1)); timer2_apb timer_2(.pclk(pclk_timer), presetn(presetn), psel(psel_2), penable(penable_2), pwrite(pwrite_2), paddr(paddr_2), pwdata(pwdata_2), en_cnt_2(en_cnt_2), int_2(int_2), prdata(prdata_2)); inctrl_apb inctrl(.pclk(pclk), presetn(presetn), Thiết kế Interrupt Controller SVTH: Nguyễn Hải Tân ĐỒ ÁN TỐT NGHIỆP Trang 79/76 psel(psel_i), penable(penable_i), pwrite(pwrite_i), pwdata(pwdata_i), paddr(paddr_i), int_0(int_0), int_1(int_1), int_2(int_2), irq(irq), prdata(prdata_i)); cpu_apb cpu(.pclk(pclk), presetn(presetn), irq(irq), prdata(prdata_u), pready(1'b1), psel(psel_u), penable(penable_u), pwrite(pwrite_u), paddr(paddr_u), pwdata(pwdata_u)); endmodule `include "timer0_apb.v" `include "timer1_apb.v" `include "timer2_apb.v" `include "inctrl_apb.v" `include "cpu_apb.v" `include "bus.v" Thiết kế Interrupt Controller SVTH: Nguyễn Hải Tân ĐỒ ÁN TỐT NGHIỆP Trang 80/76 Testbench //***************************************************************** // INTERRUPT // CONTROLLER // // Module: testbench // Author: Nguyen Hai Tan // Date : Dec 01, 2017 // //***************************************************************** module testbench; // -// Parameter // -parameter HALF_CYCLE = 5; parameter HALF_CYCLE_TIMER = 15; // -// Internal Declarations // -reg pclk; reg pclk_timer; reg presetn; reg en_cnt_0; reg en_cnt_1; reg en_cnt_2; Thiết kế Interrupt Controller SVTH: Nguyễn Hải Tân ĐỒ ÁN TỐT NGHIỆP Trang 81/76 wire [2:0] int_0; wire [2:0] int_1; wire [2:0] int_2; // -// Connecting with dut // -dut dut(.pclk(pclk), pclk_timer(pclk_timer), presetn(presetn), en_cnt_0(en_cnt_0), en_cnt_1(en_cnt_1), en_cnt_2(en_cnt_2), int_0(int_0), int_1(int_1), int_2(int_2)); // -initial begin $vcdplusfile ("wave.vpd"); $vcdpluson (); end always begin pclk = 1'b0; #HALF_CYCLE pclk = 1'b1; #HALF_CYCLE; Thiết kế Interrupt Controller SVTH: Nguyễn Hải Tân ĐỒ ÁN TỐT NGHIỆP Trang 82/76 end always begin pclk_timer = 1'b0; #HALF_CYCLE_TIMER pclk_timer = 1'b1; #HALF_CYCLE_TIMER; end initial begin en_cnt_0 = 1'b0; en_cnt_1 = 1'b0; en_cnt_2 = 1'b0; pclk = 1'b0; pclk_timer = 1'b0; presetn = 1'b0; #(HALF_CYCLE*2) presetn = 1'b1; repeat (2) @(posedge pclk_timer); en_cnt_1 = 1'b1; // repeat (2) @(posedge pclk_timer); en_cnt_2 = 1'b1; repeat (3) @(posedge pclk_timer); en_cnt_0 = 1'b1; repeat (10) @(posedge pclk_timer); $finish; end endmodule `include "wrapper.v" Thiết kế Interrupt Controller SVTH: Nguyễn Hải Tân ... thống thiết kế tạo mơ hình mơ mà sử dụng công cụ mô Verilog 1.1.1.4 Đánh giá thiết kế Một nhiêm vụ quan trọng thiết kế số cần đánh giá thiết kế Đánh giá thiết kế trình mà người thiết kế kiểm tra thiết. .. kiểm tra thiết kế họ có sai sót xảy suốt q trình thiết kế hay khơng Một sai sót thiết kế xảy mơ tả thiết kế mơ hồ, sai sót người thiết kế, sử dụng khối thiết kế Đánh giá thiết kế thực mô phỏng,... mở rộng khả Verilog Nó tập hợp định tuyến cho phép chức bên truy nhập thông tin chức thiết kế Verilog 1.1.3 Thiết kế hệ thống số với Verilog 1.1.1.1 Qui trình thiết kế số Trong thiết kế hệ thống