Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 120 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
120
Dung lượng
1,79 MB
Nội dung
Đại Học Quốc Gia Tp Hồ Chí Minh TRƯỜNG ĐẠI HỌC BÁCH KHOA LÊ THÀNH TỚI THIẾT KẾ BỘ VI XỬ LÝ RISC 16 BIT Chuyên ngành : Kỹ thuật vô tuyến - điện tử Mã số ngành : 2.01.07 LUẬN VĂN THẠC SỸ TP HỒ CHÍ MINH, tháng 07 năm 2006 TÓM TẮT Trong thời đại ngày nay, với phát triển ngày mạnh mẽ ngành công nghệ thông tin viễn thông vấn đề nâng cấp cải tiến kỹ thuật vấn đề thiếu Với vi xử lý thông thường khắc phục vấn đề này, nhiên tốc độ xử lý nhanh công suất tiêu thụ thấp đảm bảo Với đời vi xử lý RISC – Bộ vi xử lý có tập lệnh rút gọn – đáp ứng yêu cầu nâng cấp cải tiến kỹ thuật, đồng thời đảm bảo vấn đề tốc độ xử lý công suất tiêu thụ Trong năm gần đây, vi xử lý RISC ứng dụng rộng rãi nhiều thiết bị : máy in, máy ảnh số, điện thoại, xe … , đặc biệt thiết bị cầm tay Trong luận văn này, trình bày trình thiết kế thực thi vi xử lý RISC 16 bit treân FPGA ABSTRACT In the age of today, together with the development of powerful information technology and telecommunications, technical innovation and upgrade is one of the most important factors that can’t be missed The normal processor can solve this problem but it can not ensure the fast processing speed and low power consumpsion The appearance of RISC ( reduce instructions set computer ) processor not only responds demands of technical innovation and upgrade but also ensures processing speed and power consumption In these recent years, RISC processors are applied widely for a lot of devices including cars, phone, digital cameras, printers, etc Specially, they are the key for realization of portable electronic devices In this thesis, I will present the design and implementation of 16 bit RISC on FPGA Mục lục Lời cảm ơn Tóm tắt Abstract Chương : Giới thiệu 1.1 Tổng quan đề tài 1.1.1 Máy tính tập lệnh phức ( CISC ) 1.1.2 Đặc điểm CISC 1.1.3 Máy tính tập lệnh rút gọn ( RISC ) 1.1.4 Đặc điểm chung cấu trúc RISC 1.2 Tổ chức luận văn 1.3 Các công việc liên quan Chương : Ngôn ngữ mô tả phần cứng công nghệ FPGA 2.1 Xu hướng phát triển ngành thiết kế phần cứng 2.2 Những công cụ thông dụng hổ trợ việc thiết kế 2.2.1 Các thiết bị logic lập trình 2.2.2 Ngôn ngữ mô tả phần cứng 2.2.3 Phần mềm hỗ trợ thiết kế số 2.3 Công nghệ fpga 2.3.1 Giới thiệu FPGA 2.3.2 Sự phát triển thiết bị lập trình 2.3.3 Cấu trúc FPGA 2.3.3.1 Các khối logic 2.3.3.2 Các nguồn kết nối 2.3.3.3 Ứng dụng FPGA 2.3.3.4 Quá trình cài đặt 10 2.3.4 Coâng nghệ lập trình chip 11 2.3.4.1 Công nghệ lập trình dùng RAM tónh 12 2.3.4.2 Công nghệ lập trình dùng cầu chì nghịch ( anti – fuse ) 13 2.3.4.3 Công nghệ lập trình EPROM EEPROM 14 2.3.4.4 Tóm tắt công nghệ lập trình chip 15 2.3.5 Các loại FPGA thị trường 15 2.4 Ngôn ngữ VHDL 17 2.4.1 Khái quát VHDL 17 2.4.1.1 VHDL ? 17 2.4.1.2 Lịch sử phát triển 17 2.4.1.3 Các điểm mạnh VHDL 18 2.4.2 Cấu trúc ngôn ngữ VHDL 18 3.4.2.1 Khai baùo ENTITY ( Entity Declaration) 19 2.4.2.2 Thân kiến trúc 19 2.4.3 Các mô hình VHDL 20 2.4.3.1 Mô hình cấu truùc 20 2.4.3.2 Mô hình luồng liệu 20 2.4.3.3 Mô hình hành vi 20 2.4.3.4 Moâ hình hổn hợp 20 Chương : Cấu trúc phần cứng vi xử lí 3.1 Cấu trúc tổng quát vi xử lý 21 3.2 Cấu trúc chi tiết vi xử lý 22 3.2.1 Bộ phận nạp lệnh 22 3.2.1.1 Bộ đếm chương trình PC ( Program Counter ) 22 3.2.1.2 Bộ nhớ lệnh 22 3.2.1.3 Đơn vị định rẽ nhánh 22 3.2.2 Bộ phận giải mã lệnh 23 3.2.2.1 Đơn vị điều khiển 25 3.2.2.2 Taäp ghi 25 3.2.2.3 Thanh ghi Y 25 3.2.2.4 Đơn vị mở rộng dấu 25 3.2.2.5 Khoái inport 25 3.2.2.6 Khoái outport 25 3.2.3 Bộ phận thực thi 25 3.2.3.1 Bộ cộng nhánh ( Branch Adder ) 26 3.2.3.2 Boä nhaân 27 3.2.3.2.1 Bộ mã hóa Booth ( Booth encoder ) 27 3.2.3.2.2 Bộ tạo tích thành phaàn PPG 27 3.2.3.2.3 Wallace tree 27 3.2.3.2.4 Carry Lookahead Adder ( CLA ) 27 3.2.3.3 Đơn vị logic số học 27 3.2.3.4 Đơn vị điều khiển ALU 28 3.2.4 Bộ nhớ 28 3.2.5 Bộ phận writeback 29 3.2.6 Đơn vị data forward 29 3.2.7 Đơn vị phát hazard 29 Chương : Tập lệnh 4.1 Định dạng lệnh kiểu ghi 31 4.2 Định dạng lệnh kiểu tức thời 31 4.3 Định dạng lệnh kiểu nhánh 31 4.4 Tập lệnh 32 4.4.1 Tóm tắt tập lệnh hỗ trợ vi xử lý 32 4.4.2 Tập lệnh chi tiết 33 Chương : Mô tả cấu trúc vi xử lý ngôn ngữ VHDL 5.1 Mô tả phận nạp lệnh 38 5.1.1 Mô tả giao diện phận nạp lệnh VHDL 38 5.1.2 Mô tả cấu trúc phận nạp lệnh VHDL 39 5.1.3 Kết mô phận nạp lệnh 40 5.2 Mô tả phận giải mã lệnh 40 5.2.1 Mô tả cấu trúc đơn vị điều khiển 41 5.2.1.1 Mô tả cấu trúc đơn vị điều khiển VHDL 41 5.2.1.2 Kết mô đơn vị điều khiển 44 5.2.2 Mô tả cấu trúc tập ghi 44 5.2.2.1 Mô tả cấu trúc tập ghi VHDL 45 5.2.2.2 Kết mô tập 47 5.2.3 Mô tả ghi Y 47 5.2.3.1 Mô tả ghi Y baèng VHDL 47 5.2.3.2 Kết mô ghi Y 48 5.2.4 Mô tả cấu trúc phận giải mã lệnh 49 5.2.4.1 Mô tả cấu trúc phận giải mã lệnh mã VHDL 49 5.2.2.3 Kết mô phận giải mã lệnh 53 5.3 Mô tả cấu trúc phận thực thi 53 5.3.1 Boä cộng giá trị địa offset PC ( Branch adder ) 54 5.3.1.1 Mô tả cộng địa offset ngôn ngữ VHDL 54 5.3.2.3 Kết mô cộng địa offset 55 5.3.2 Mô tả cấu trúc nhân 57 5.3.2.1 Mô tả mã hóa booth mã VHDL 55 5.3.2.2 Mô tả tạo tích thành phần PPG 57 5.3.2.3 Wallace tree CSA 59 5.3.2.4 Boä coäng CLA ( Carry Lookahead Adder ) 65 5.3.2.5 Mô tả cấu trúc nhân mã VHDL 69 5.3.3 Mô tả đơn vị điều khiển alu 71 5.3.3.1 Mô tả cấu trúc đơn vị điều khiển mã VHDL 71 5.3.3.2 Kết mô đơn vị điều khiển ALU 73 5.3.4 Mô tả đơn vị logic số hoïc ( ALU ) 73 5.3.4.1 Mô tả cấu trúc ALU mã VHDL 74 5.3.4.2 Kết mô ALU phần mềm Xilinx ISE 78 5.3.5 Mã VHDL mô tả cấu trúc phận thực thi 78 5.3.6 Kết mô phận thực thi 83 5.4 Mô tả nhớ 84 5.4.1 Mô tả cấu trúc nhớ mã VHDL 84 5.4.2 Kết mô nhớ 86 5.5 Bộ phận writeback 86 5.5.1 Mô tả cấu trúc phận writeback mã VHDL 87 5.5.2 Kết mô phận writeback 87 5.6 Đơn vị forward data 88 5.6.1 Moâ tả cấu trúc phận forward data mã VHDL 89 5.6.2 Kết mô phận forward data 89 5.7 Bộ phận phát hazard 90 5.7.1 Mô tả cấu trúc phận phát hazard 90 5.7.2 Kết mô phận phát hazard 91 5.8 Mô tả cấu trúc tổng quát RISC 16 bit ngôn ngữ VHDL 91 5.8.1 Giao diện vi xử lí RISC 91 5.8.2 Mã VHDL mô tả tổng quát cấu trúc RISC 92 5.8.3 Kết mô kiểm tra tập lệnh vi xử lí RISC 102 5.8.3.1 Đoạn code chương trình kiểm tra tập lệnh 102 5.8.3.2 Kết mô đoạn chương trình kiểm tra tập lệnh103 Chương : Kết luận hướng phát triển đề tài 104 6.1 Kết luận 104 6.2 Hướng phát triển đề tài 104 Tài liệu tham khảo 105 CÔNG TRÌNH ĐƯC HOÀN THÀNH TẠI TRƯỜNG ĐẠI HỌC BÁCH KHOA ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH Cán hướng dẫn khoa học : TS Nguyễn Như Anh Ths Hồ Trung Mỹ Cán chấm nhận xét : Cán chấm nhận xét : Luận văn thạc só bảo vệ HỘI ĐỒNG CHẤM BẢO VỆ LUẬN VĂN THẠC SĨ TRƯỜNG ĐẠI HỌC BÁCH KHOA, ngày thaùng năm 2006 TRƯỜNG ĐẠI HỌC BÁCH KHOA PHÒNG ĐÀO TẠO SĐH CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM ĐỘC LẬP – TỰ DO – HẠNH PHÚC Tp HCM, ngày tháng năm 2006 NHIỆM VỤ LUẬN VĂN THẠC SĨ Họ tên học viên : Lê Thành Tới Ngày, tháng, năm sinh : 1977 Chuyên ngành : Kỹ thuật vô tuyến – Điện tử Phái : nam Nơi sinh : Tây Ninh MSHV : 01403332 I TÊN ĐỀ TÀI : THIẾT KẾ BỘ VI XỬ LÝ RISC 16 BIT II NHIỆM VỤ VÀ NỘI DUNG : THIẾT KẾ BỘ VI XỬ LÝ RISC 16 BIT CÀI ĐẶT BỘ VI XỬ LÝ RISC 16 BIT TRÊN FPGA III NGÀY GIAO NHIỆM VỤ : 06 / 02 / 2006 IV NGÀY HOÀN THÀNH NHIỆM VỤ : 06 / 07 / 2006 V HỌ VÀ TÊN CÁN BỘ HƯỚNG DẪN : TS NGUYỄN NHƯ ANH Ths HỒ TRUNG MỸ CÁN BỘ HƯỚNG DẪN CHỦ NHIỆM NGÀNH BỘ MÔN QUẢN LÝ CHUYÊN Ø Nội dung đề cương luận văn thạc só hội đồng chuyên ngành thông qua PHÒNG ĐÀO TẠO SĐH Ngày tháng năm 2006 KHOA QUẢN LÝ NGÀNH Thiết kế vi xử lý RISC 16 bit end Behavioral; 5.7.2 Kết mô phận phát hazard Hình 5.34: Kết mô phận phát hazard 5.8 Mô tả cấu trúc tổng quát RISC 16 bit ngôn ngữ VHDL 5.8.1 Giao diện RISC 16 bit Giao diện RISC gồm có: tín hiệu xung clock, ngõ vào rest mức, port để nhập liệu vào tập ghi, port xuất liệu tập ghi, để tiện quan sát kết trình mô phỏng, có thêm output lấy từ ngõ ALU, nhân, ngõ đếm chương trình Clk Reset Data_in HVTH: Lê Thành Tớ 16i 95 Output_ALU Output_mult_top_16 Output_Instruction Output_pc Data_out 16 16 16 16 Thiết kế vi xử lý RISC 16 bit Hình 5.35: Giao diện vi xử lí RISC 5.8.2 Mã VHDL mô tả tổng quát cấu trúc RISC library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity processor_top is Port (clk: in std_logic; reset: in std_logic; datain: in std_logic_vector (15 downto 0) ; dataout: out std_logic_vector (15 downto 0); output_ALU: out std_logic_vector(15 downto 0); output_mult_top_16: out std_logic_vector(15 downto 0); output_instruction: out std_logic_vector(15 downto 0); output_pc_plus1: out std_logic_vector(15 downto 0)); end processor_top; architecture Behavioral of processor_top is component ifetch is Port (add_result: in std_logic_vector(15 downto 0); zero: in std_logic; branch_in: in std_logic_vector(1 downto 0); clk: in std_logic; reset: in std_logic; pc_write: in std_logic; instruction: out std_logic_vector(15 downto 0); pc_plus_one_out: out std_logic_vector(15 downto 0)); end component ifetch; component if_id_pipe_reg is Port (inst_in: in std_logic_vector(15 downto 0); pc_in: in std_logic_vector(15 downto 0); if_id_write: in std_logic; clk: in std_logic; inst_out: out std_logic_vector(15 downto 0); pc_out: out std_logic_vector(15 downto 0)); end component if_id_pipe_reg; HVTH: Lê Thành Tới 96 Thiết kế vi xử lý RISC 16 bit component decode is Port (instruction: in std_logic_vector(15 downto 0); datain: in std_logic_vector(15 downto 0); ydata_in: in std_logic_vector(15 downto 0); reg_wrt_data: in std_logic_vector(15 downto 0); pc_in: in std_logic_vector(15 downto 0); reg_dest_add: in std_logic_vector(3 downto 0); reg_wrt_in: in std_logic; y_wrt_in: in std_logic; id_flush: in std_logic; reg_wrt_out: out std_logic; mem_reg: out std_logic; y_wrt_out: out std_logic; mem_wrt: out std_logic; mem_read: out std_logic; branch: out std_logic_vector(1 downto 0); sel_Y: out std_logic; mult: out std_logic; alu_src: out std_logic; cg_mult: out std_logic; cg_alu_ctrl: out std_logic; cg_add_branch: out std_logic; pc_out: out std_logic_vector(15 downto 0); regdata1: out std_logic_vector(15 downto 0); regdata2: out std_logic_vector(15 downto 0); ydata_out: out std_logic_vector(15 downto 0); signext: out std_logic_vector(15 downto 0); dataout: out std_logic_vector(15 downto 0); inst_out: out std_logic_vector(15 downto 0)); end component decode; component id_ex_pipe_reg is Port (clk: in std_logic; reg_wrt, mem_reg, y_wrt, mem_wrt, mem_read: in std_logic; branch: in std_logic_vector(1 downto 0); sel_Y, mult, alu_src, cg_mult, cg_alu_ctrl, cg_add_branch: in std_logic; pc, regdata1, regdata2, ydata: in std_logic_vector(15 downto 0); signext, inst: in std_logic_vector(15 downto 0); reg_wrt_out, mem_reg_out, y_wrt_out, mem_wrt_out, mem_read_out: out std_logic; branch_out: out std_logic_vector(1 downto 0); HVTH: Lê Thành Tới 97 Thiết kế vi xử lyù RISC 16 bit sel_Y_out, mult_out, alu_src_out, cg_mult_out: out std_logic; pc_out, regdata1_out, regdata2_out: out std_logic_vector(15 downto 0); ydata_out, signext_out: out std_logic_vector(15 downto 0); branch_offset: out std_logic_vector(11 downto 0); inst_3_0_out, inst_15_12_out, inst_7_4_out: out std_logic_vector(3 downto 0); inst_11_4_out: out std_logic_vector(7 downto 0)); end component id_ex_pipe_reg; component execute is Port (sign_ext: in std_logic_vector(15 downto 0); pc_plus1_in: in std_logic_vector(15 downto 0); reg_data1: in std_logic_vector(15 downto 0); reg_data2: in std_logic_vector(15 downto 0); yreg_data: in std_logic_vector(15 downto 0); inst_3_0: in std_logic_vector(3 downto 0); inst_15_12: in std_logic_vector(3 downto 0); inst_7_4: in std_logic_vector(3 downto 0); inst_11_4_in: in std_logic_vector(7 downto 0); branch_offset: in std_logic_vector(11 downto 0); new_y_data: in std_logic_vector(15 downto 0); new_reg_data_wb: in std_logic_vector(15 downto 0); new_reg_data_mem: in std_logic_vector(15 downto 0); fwd_y: in std_logic; fwd_A: in std_logic_vector(1 downto 0); fwd_B: in std_logic_vector(1 downto 0); y_wrt_in: in std_logic; sel_Y_in: in std_logic; branch_in: in std_logic_vector(1 downto 0); multiplier: in std_logic; mem_read_in: in std_logic; mem_to_reg_in: in std_logic; mem_wrt_in: in std_logic; alu_src: in std_logic; reg_wrt_in: in std_logic; cg_mult: in std_logic; branch_add: out std_logic_vector(15 downto 0); mult_high_16: out std_logic_vector(15 downto 0); alu_mul_result: out std_logic_vector(15 downto 0); HVTH: Lê Thành Tới 98 Thiết kế vi xử lý RISC 16 bit inst_11_4_out: out std_logic_vector(7 downto 0); reg_data1_out: out std_logic_vector(15 downto 0); zero_flag: out std_logic; overflow_flag: out std_logic; cout_flag: out std_logic; y_wrt_out: out std_logic; sel_Y_out: out std_logic; branch_out: out std_logic_vector(1 downto 0); mem_read_out: out std_logic; mem_to_reg_out: out std_logic; mem_wrt_out: out std_logic; reg_wrt_out: out std_logic); end component execute; component ex_mem_pipe_reg is Port (clk: in std_logic; y_wrt_in: in std_logic; mem_to_reg_in: in std_logic; mem_wrt_in: in std_logic; mem_rd_in: in std_logic; add_or_data_in: in std_logic_vector(15 downto 0); wrt_data_in: in std_logic_vector(15 downto 0); inst_11_8_in: in std_logic_vector(3 downto 0); mult_up_16_in: in std_logic_vector(15 downto 0); reg_wrt_in: in std_logic; zero_flag_in: in std_logic; y_wrt_out: out std_logic; mem_to_reg_out: out std_logic; mem_wrt_out: out std_logic; mem_rd_out: out std_logic; add_or_data_out: out std_logic_vector(15 downto 0); wrt_data_out: out std_logic_vector(15 downto 0); inst_11_8_out: out std_logic_vector(3 downto 0); mult_up_16_out: out std_logic_vector(15 downto 0); reg_wrt_out: out std_logic; zero_flag_out: out std_logic); end component ex_mem_pipe_reg; component memory is Port (clk: in std_logic; y_wrt_in: in std_logic; mem_to_reg_in: in std_logic; mem_wrt: in std_logic; HVTH: Lê Thành Tới 99 Thiết kế vi xử lý RISC 16 bit mem_rd: in std_logic; add_or_data_in: in std_logic_vector(15 downto 0); wrt_data: in std_logic_vector(15 downto 0); inst_11_8_in: in std_logic_vector(3 downto 0); reg_wrt_in: in std_logic; mem_to_reg_out: out std_logic; y_wrt_out: out std_logic; data_out: out std_logic_vector(15 downto 0); inst_11_8_out: out std_logic_vector(3 downto 0); reg_wrt_out: out std_logic; add_or_data_out: out std_logic_vector (15 downto 0)); end component memory; component mem_wb_pipe_reg is Port (clk: in std_logic; reg_write_in: in std_logic; mem_to_reg: in std_logic; mem_data: in std_logic_vector(15 downto 0); alu_data: in std_logic_vector(15 downto 0); inst_11_8_in: in std_logic_vector(3 downto 0); reg_write_out: out std_logic; mem_to_reg_out: out std_logic; mem_data_out: out std_logic_vector(15 downto 0); alu_data_out: out std_logic_vector(15 downto 0); inst_11_8_out: out std_logic_vector(3 downto 0)); end component mem_wb_pipe_reg; component writeback is Port (reg_write_in: in std_logic; mem_to_reg: in std_logic; mem_data: in std_logic_vector(15 downto 0); alu_data: in std_logic_vector(15 downto 0); reg_write_out: out std_logic; final_data: out std_logic_vector(15 downto 0)); end component writeback; component data_fwd is Port (ex_mem_reg_wrt: in std_logic; ex_mem_reg_rd: in std_logic_vector(3 downto 0); id_ex_reg_r1: in std_logic_vector(3 downto 0); id_ex_reg_r2: in std_logic_vector(3 downto 0); ex_mem_y_wrt: in std_logic; id_ex_y_rd: in std_logic; mem_wb_reg_wrt: in std_logic; HVTH: Lê Thành Tới 100 Thiết kế vi xử lyù RISC 16 bit mem_wb_reg_rd: in std_logic_vector(3 downto 0); forwardA: out std_logic_vector(1 downto 0); forwardB: out std_logic_vector(1 downto 0); forwardY: out std_logic); end component data_fwd; component hazard_detect is Port (id_ex_mem_read: in std_logic; id_ex_reg_rd: in std_logic_vector(3 downto 0); if_id_reg_r1: in std_logic_vector(3 downto 0); if_id_reg_r2: in std_logic_vector(3 downto 0); pc_write: out std_logic; if_id_write: out std_logic; id_flush: out std_logic); end component hazard_detect; signal if_instruction, if_pc_plus1: std_logic_vector(15 downto 0); signal pipe_ifid_inst, pipe_ifid_pc: std_logic_vector(15 downto 0); signal id_reg_wrt_out, id_mem_reg, id_y_wrt_out, id_mem_wrt: std_logic; signal id_mem_read, id_sel_Y,id_mult, id_alu_src: std_logic; signal id_cg_mult, id_cg_alu_ctrl, id_cg_add_branch: std_logic; signal id_branch: std_logic_vector(1 downto 0); signal id_pc_out, id_regdata1, id_regdata2, id_ydata_out: std_logic_vector(15 downto 0); signal id_signext, id_inst_out: std_logic_vector(15 downto 0); signal pipe_idex_reg_wrt_out, pipe_idex_mem_reg_out, pipe_idex_y_wrt_out: std_logic; signal pipe_idex_mem_wrt_out, pipe_idex_mem_read_out: std_logic; signal pipe_idex_branch_out: std_logic_vector(1 downto 0); signal pipe_idex_sel_Y_out, pipe_idex_mult_out, pipe_idex_alu_src_out, pipe_idex_cg_mult_out: std_logic; signal pipe_idex_pc_out, pipe_idex_regdata1_out, pipe_idex_regdata2_out: std_logic_vector(15 downto 0); signal pipe_idex_ydata_out, pipe_idex_signext_out: std_logic_vector(15 downto 0); signal pipe_idex_branch_offset: std_logic_vector(11 downto 0); signal pipe_idex_inst_3_0_out, pipe_idex_inst_15_12_out, pipe_idex_inst_7_4_out: std_logic_vector(3 downto 0); signal pipe_idex_inst_11_4_out: std_logic_vector(7 downto 0); signal ex_branch_add, ex_mult_high_16, ex_alu_mul_result: std_logic_vector(15 downto 0); signal ex_inst_11_4_out: std_logic_vector(7 downto 0); HVTH: Leâ Thành Tới 101 Thiết kế vi xử lý RISC 16 bit signal ex_reg_data1_out: std_logic_vector(15 downto 0); signal ex_zero_flag, ex_overflow_flag, ex_cout_flag, ex_y_wrt_out, ex_sel_Y_out: std_logic; signal ex_branch_out: std_logic_vector(1 downto 0); signal ex_mem_read_out, ex_mem_to_reg_out, ex_mem_wrt_out, ex_reg_wrt_out: std_logic; signal pipe_exmem_y_wrt_out, pipe_exmem_mem_to_reg_out: std_logic; signal pipe_exmem_branch_out: std_logic_vector(1 downto 0); signal pipe_exmem_mem_wrt_out, pipe_exmem_mem_rd_out: std_logic; signal pipe_exmem_add_or_data_out, pipe_exmem_wrt_data_out: std_logic_vector(15 downto 0); signal pipe_exmem_inst_11_8_out: std_logic_vector(3 downto 0); signal pipe_exmem_b_add_rslt_out, pipe_exmem_mult_up_16_out: std_logic_vector(15 downto 0); signal pipe_exmem_reg_wrt_out, pipe_exmem_zero_flag_out: std_logic; signal mem_mem_to_reg_out, mem_y_wrt_out: std_logic; signal mem_data_out: std_logic_vector(15 downto 0); signal mem_inst_11_8_out: std_logic_vector(3 downto 0); signal mem_reg_wrt_out: std_logic; signal mem_add_or_data_out: std_logic_vector (15 downto 0); signal pipe_memwb_reg_write_out, pipe_memwb_mem_to_reg_out: std_logic; signal pipe_memwb_mem_data_out, pipe_memwb_alu_data_out: std_logic_vector(15 downto 0); signal pipe_memwb_inst_11_8_out: std_logic_vector(3 downto 0); signal wb_reg_write_out: std_logic; signal wb_final_data: std_logic_vector(15 downto 0); signal fwd_forwardA_out, fwd_forwardB_out: std_logic_vector(1 downto 0); signal fwd_forwardY_out: std_logic; signal hzd_pc_write_out: std_logic; signal hzd_if_id_write_out: std_logic; signal hzd_id_flush_out: std_logic; begin i_fetch: ifetch port map(add_result=> ex_branch_add, zero =>pipe_exmem_zero_flag_out, branch_in => pipe_idex_branch_out, clk => clk, reset => reset, pc_write=>hzd_pc_write_out, instruction=>if_instruction, pc_plus_one_out=>if_pc_plus1);pipe_if_id: if_id_pipe_reg port map(inst_in =>if_instruction, pc_in=>if_pc_plus1, if_id_write=>hzd_if_id_write_out, clk=>clk,inst_out=>pipe_ifid_inst, pc_out=>pipe_ifid_pc); i_decode: decode port map(instruction=>pipe_ifid_inst,ydata_in=>pipe_exmem_mult_up_16_out,reg_ wrt_data=>wb_final_data, pc_in=>pipe_ifid_pc, HVTH: Lê Thành Tới 102 Thiết kế vi xử lý RISC 16 bit reg_dest_add=>pipe_memwb_inst_11_8_out, reg_wrt_in=>pipe_memwb_reg_write_out,y_wrt_in=>pipe_exmem_y_wrt_out, id_flush=>hzd_id_flush_out, reg_wrt_out=>id_reg_wrt_out, mem_reg=>id_mem_reg,y_wrt_out=>id_y_wrt_out,mem_wrt=>id_mem_wrt, mem_read=>id_mem_read, branch=>id_branch, sel_Y=>id_sel_y, mult=>id_mult, alu_src=>id_alu_src, cg_mult=>id_cg_mult, cg_alu_ctrl=>id_cg_alu_ctrl, cg_add_branch=>id_cg_add_branch,pc_out=>id_pc_out,regdata1=>id_regdata 1, regdata2=>id_regdata2, ydata_out=>id_ydata_out,signext=>id_signext, inst_out=>id_inst_out, datain=> datain, dataout =>dataout); pipe_id_ex: id_ex_pipe_reg port map(clk=>clk, reg_wrt=>id_reg_wrt_out, mem_reg=>id_mem_reg, y_wrt=>id_y_wrt_out, mem_wrt=>id_mem_wrt, mem_read=>id_mem_read, branch=>id_branch, sel_Y=>id_sel_Y, mult=>id_mult, alu_src=>id_alu_src, cg_mult=>id_cg_mult, cg_alu_ctrl=>id_cg_alu_ctrl, cg_add_branch=>id_cg_add_branch, pc=>id_pc_out, regdata1=>id_regdata1, regdata2=>id_regdata2, ydata=>id_ydata_out, signext=>id_signext, inst=>id_inst_out, reg_wrt_out=>pipe_idex_reg_wrt_out, mem_reg_out=>pipe_idex_mem_reg_out, y_wrt_out=>pipe_idex_y_wrt_out, mem_wrt_out=>pipe_idex_mem_wrt_out, mem_read_out=>pipe_idex_mem_read_out, branch_out=>pipe_idex_branch_out, sel_Y_out=>pipe_idex_sel_Y_out, mult_out=>pipe_idex_mult_out, alu_src_out=>pipe_idex_alu_src_out, cg_mult_out=>pipe_idex_cg_mult_out, pc_out=>pipe_idex_pc_out, regdata1_out=>pipe_idex_regdata1_out, regdata2_out=>pipe_idex_regdata2_out, ydata_out=>pipe_idex_ydata_out, signext_out=>pipe_idex_signext_out, branch_offset=>pipe_idex_branch_offset, inst_3_0_out=>pipe_idex_inst_3_0_out, inst_15_12_out=>pipe_idex_inst_15_12_out, inst_7_4_out=>pipe_idex_inst_7_4_out, inst_11_4_out=>pipe_idex_inst_11_4_out); execute_stg: execute port map(sign_ext=>pipe_idex_signext_out, pc_plus1_in=>pipe_idex_pc_out,reg_data1=>pipe_idex_regdata1_out, reg_data2=>pipe_idex_regdata2_out, yreg_data=>pipe_idex_ydata_out, inst_3_0=>pipe_idex_inst_3_0_out, inst_15_12=>pipe_idex_inst_15_12_out, inst_7_4=>pipe_idex_inst_7_4_out, inst_11_4_in=>pipe_idex_inst_11_4_out, branch_offset=>pipe_idex_branch_offset, ew_y_data=>pipe_exmem_mult_up_16_out, new_reg_data_wb=>wb_final_data, HVTH: Leâ Thành Tới 103 Thiết kế vi xử lý RISC 16 bit new_reg_data_mem=>pipe_exmem_add_or_data_out, fwd_y=>fwd_forwardY_out, fwd_A=>fwd_forwardA_out, fwd_B=>fwd_forwardB_out, y_wrt_in=>pipe_idex_y_wrt_out, sel_Y_in=>pipe_idex_sel_Y_out, branch_in=>pipe_idex_branch_out, multiplier=>pipe_idex_mult_out, mem_read_in=>pipe_idex_mem_read_out, mem_to_reg_in=>pipe_idex_mem_reg_out, mem_wrt_in=>pipe_idex_mem_wrt_out, alu_src=>pipe_idex_alu_src_out, reg_wrt_in=>pipe_idex_reg_wrt_out, cg_mult=>pipe_idex_cg_mult_out, branch_add=>ex_branch_add, mult_high_16=>ex_mult_high_16, alu_mul_result=>ex_alu_mul_result, inst_11_4_out=>ex_inst_11_4_out, reg_data1_out=>ex_reg_data1_out, zero_flag=>ex_zero_flag, overflow_flag=>ex_overflow_flag, cout_flag=>ex_cout_flag, y_wrt_out=>ex_y_wrt_out, sel_Y_out=>ex_sel_Y_out, branch_out=>ex_branch_out, mem_read_out=>ex_mem_read_out, mem_to_reg_out=>ex_mem_to_reg_out, mem_wrt_out=>ex_mem_wrt_out, reg_wrt_out=>ex_reg_wrt_out); pipe_ex_mem: ex_mem_pipe_reg port map(clk=>clk, y_wrt_in=> ex_y_wrt_out, mem_to_reg_in => ex_mem_to_reg_out, mem_wrt_in => ex_mem_wrt_out, mem_rd_in => ex_mem_read_out, add_or_data_in => ex_alu_mul_result, wrt_data_in => ex_reg_data1_out, inst_11_8_in => ex_inst_11_4_out(7 downto 4), mult_up_16_in=> ex_mult_high_16, reg_wrt_in => ex_reg_wrt_out, zero_flag_in=> ex_zero_flag, y_wrt_out => pipe_exmem_y_wrt_out, mem_to_reg_out => pipe_exmem_mem_to_reg_out, mem_wrt_out => pipe_exmem_mem_wrt_out, mem_rd_out => pipe_exmem_mem_rd_out, add_or_data_out => pipe_exmem_add_or_data_out, wrt_data_out => pipe_exmem_wrt_data_out, inst_11_8_out => pipe_exmem_inst_11_8_out, mult_up_16_out=> pipe_exmem_mult_up_16_out, reg_wrt_out => pipe_exmem_reg_wrt_out, zero_flag_out=> pipe_exmem_zero_flag_out); memory_stg: memory port map(clk=>clk, y_wrt_in=> pipe_exmem_y_wrt_out, mem_to_reg_in=> pipe_exmem_mem_to_reg_out, mem_wrt=> pipe_exmem_mem_wrt_out, mem_rd=> pipe_exmem_mem_rd_out, add_or_data_in=> pipe_exmem_add_or_data_out, wrt_data=> pipe_exmem_wrt_data_out, inst_11_8_in=> pipe_exmem_inst_11_8_out, reg_wrt_in=> pipe_exmem_reg_wrt_out, mem_to_reg_out=> mem_mem_to_reg_out, y_wrt_out=> mem_y_wrt_out, data_out=> mem_data_out, inst_11_8_out=> mem_inst_11_8_out, reg_wrt_out=> mem_reg_wrt_out, add_or_data_out=> mem_add_or_data_out); HVTH: Lê Thành Tới 104 Thiết kế vi xử lý RISC 16 bit pipe_mem_web: mem_wb_pipe_reg port map(clk=>clk, reg_write_in=>mem_reg_wrt_out, mem_to_reg => mem_mem_to_reg_out, mem_data => mem_data_out, alu_data=> mem_add_or_data_out, inst_11_8_in => mem_inst_11_8_out, reg_write_out => pipe_memwb_reg_write_out, mem_to_reg_out => pipe_memwb_mem_to_reg_out, mem_data_out => pipe_memwb_mem_data_out, alu_data_out => pipe_memwb_alu_data_out, inst_11_8_out => pipe_memwb_inst_11_8_out); writeback_stg: writeback port map(reg_write_in => pipe_memwb_reg_write_out, mem_to_reg => pipe_memwb_mem_to_reg_out, mem_data => pipe_memwb_mem_data_out, alu_data => pipe_memwb_alu_data_out, reg_write_out => wb_reg_write_out, final_data => wb_final_data); data_forward: data_fwd port map(ex_mem_reg_wrt=>pipe_exmem_reg_wrt_out, ex_mem_reg_rd=>pipe_exmem_inst_11_8_out, id_ex_reg_r1=>pipe_idex_inst_11_4_out(7 downto 4), id_ex_reg_r2=>pipe_idex_inst_11_4_out(3 downto 0), ex_mem_y_wrt=>pipe_exmem_y_wrt_out, id_ex_y_rd=>pipe_idex_sel_Y_out, mem_wb_reg_wrt =>wb_reg_write_out, mem_wb_reg_rd=> pipe_memwb_inst_11_8_out, forwardA=> fwd_forwardA_out, forwardB=> fwd_forwardB_out, forwardY=> fwd_forwardY_out); hazard_detection: hazard_detect port map(id_ex_mem_read=>pipe_idex_mem_read_out, id_ex_reg_rd =>pipe_idex_inst_11_4_out(7 downto 4), if_id_reg_r1=>pipe_ifid_inst(11 downto 8), if_id_reg_r2=>pipe_ifid_inst(7 downto 4), pc_write =>hzd_pc_write_out, if_id_write=>hzd_if_id_write_out, id_flush=>hzd_id_flush_out); output_ALU