Đề tài Thiết kế risc microcontroller dùng vhdl

Lời mở đầu Hiện nay, công nghệ vi mạch phát triển rất nhanh và tạo ra rất nhiều hướng phát triển mới cho tương lai. Điển hình cho sự phát triển nay là xuất hiện của các IC logic lập trình được như PLA, FPGA, ASIC các IC nay có mức độ tích hợp ngày càng cao(có thể chứa trên 1 triệu Transitor đối với loại VLSI), các ứng dụng của nó cũng trở nên phổ biến hơn.Do mức độ tích hợp của các IC cao dẫn theo sự phức tạp trong cấu trúc của nó,chinh vì vây yêu cầu đặt ra là cần có 1 công cụ vạn năng để hỗ trợ cho việc thiết kế số. Từ đó dẫn đến sự ra đời của các ngôn ngữ mô tả phần cứng như VHDL,Verilog .Nó giúp cho các nhà thiết kế dễ dàng hơn trong việc thiết kế hệ thống số dựa trên các IC lập trình được này. Em chọn đề tài “Thiết kế Risc Microcontroller dùng VHDL” với mục đích là tìm hiểu về các IC Logic lập trình được, cách thức lập trình mô tả phần cứng trên ngôn ngữ VHDL, và cấu trúc, họat động của 1 MCU dạng RISC. Em xin chân thành cảm ơn các thầy cô trong trường Đại học Bách khoa TPHCM nói chung và các thầy cô trong khoa Điện- Điện tử nói riêng đã truyền dạy những kinh nghiệm quý báu và giúp đở em trong suốt quá trình học tập. Đặc biệt, em xin gửi lời cảm ơn chân thành đến thầy HỒ TRUNG MỸ người đã tận tình giúp đở em hoàn thành đồ án này. Thiết kế RISC microcontroller Mục lục trang I > Giới Thiệu đề tài 4 II> KHÁI QUÁT VỀ RISC VÀ CISC 5 III> TẬP LỆNH 6 IV > PIPELINE PROCESSING 12 V> SƠ ĐỒ KHỐI CỦA THIẾT KẾ RISC 14 VI> THIẾT KẾ ĐƯỜNG DỮ LIỆU (DATAPATH) 16 VII> THIẾT KẾ ĐƠN VỊ ĐIỀU KHIỂN (CONTROL UNIT) 25 VIII> CHƯƠNG TRÌNH VHDL VÀ KẾT QUẢ MÔ PHỎNG 28 I> GIỚI THIỆU ĐỀ TÀI 1. Mục đích cùa đồ án: Tìm hiểu cấu trúc, và hoạt động của 1 RISC Microcontroller cơ bản, Thiết kế và dùng ngôn ngữ VHDL để mô tả RISC MCU. 2. Phạm vi thiết kế của đồ án: Thiết kế chỉ thực hiện các chức năng cơ bản của 1 MCU như: thưc hiện các phép tóan cộng trừ, logic, dịch, di chuyển dữ liệu, rẽ nhánh không điều kiện và có điều kiện, gọi hàm, và các lệnh tác động lên bit. Thiết kế dựa trên tập lệnh của Atmel AVR AT90S1200. Bằng cách này, Thiết kế có thể sử dụng các công cụ assempler, simulater do Atmel cung cấp. Do giới hạn của đề tài nên RISC MCU không hỗ trợ ngắt ngoài, Timer, Port IO 2 chiều, analog comparator, điện trở kéo lên bên trong, watchdog reset . như AVR AT90s1200. Thiết kế sử dụng phần mềm MAX + plus II để thực hiện và mô phỏng thiết kế. MAX + plus II là phần mềm do ALTERA phát triển. Nó có một số Modul quan trọng cho thiết kế, ví dụ như Compiler, Simulater, Wavefrom editor, và Programmer . Thiết kế RISC microcontroller II> KHÁI QUÁT VỀ RISC VÀ CISC 1. Comples Instruction Set Computer (CISC) Những năm trước đây, Tập lệnh của máy tính có số lượng lệnh ít và đơn giản. Với sự phát triển của kỹ thuật và yêu cầu của các ứng dụng khác nhau, tập lệnh của máy tính ngày càng tăng về số lượng lẫn độ phức tạp( sử dụng nhiều loại dữ liệu và nhiều mode định địa chỉ). Một máy tính có tập lệnh lớn và phức tạp được gọi là CISC(Complex Intrucstion Set Computer). Đặc tính cơ bản của cấu trúc CISC: - Có số lượng lệnh rất nhiều, thông thường từ 100 tới 250 lệnh. - Một số lệnh thực hiện các chức năng đặc biệt và thường không được sử dụng. - Rất nhiều chế độ định địa chỉ, thường có khoảng từ 5->20 chế độ định địa chỉ. - Cấu trúc lệnh không cố định và dài, thường từ 2 tới 6 bytes. - Lệnh có tóan hạng chứa trong ô nhớ. 2. Reduce Instruction Set Computer (RISC) Vào đầu năm 1980, trong các thống kế của hệ thống máy tính, người ta thấy hầu hết 80% số lệnh trong tập lệnh ít được sử dụng. Vì vậy để tăng hiệu quả cho ứng dụng và việc thiết kế, người ta đặt ra vấn đề về một máy tính có tập lệnh được rút gọn và đơn giản được gọi là RISC (Reduce Intruction Set Computer). Đặc tính cơ bản của cấu trúc RISC: - Chu kỳ lệnh được chia thành 2 chu kỳ: tìm nạp lệnh và thực thi lệnh. - Lệnh được thực thi trong 1 chu kỳ xung clock. - Lệnh có chiều dài cố định(16 bit hay 32 bit), và có định dạng dễ giải mã. - Tập lệnh có số lượng lệnh ít. - Ít chế độ định địa chỉ. - Hạn chế lệnh truy xuất bộ nhớ, chỉ truy xuất thông qua con trỏ dữ liệu. - Tất cả các lệnh được thự hiện thông qua các thanh ghi của CPU. - Thường sử dụng mạch logic để điều khiển thực thi lệnh hơn là sử dụng vi chương trình (microprogram) như CISC. - Số lượng thanh ghi đa năng khá nhiều (ít nhất là 32 Register). Thiết kế RISC microcontroller III> TẬP LỆNH: 1. Tóm tắt Tập lệnh Thiết kế dựa trên tập lệnh của Atmel AVR AT90S1200. Bằng cách này, Thiết kế có thể sử dụng các công cụ assempler, simulater do Atmel cung cấp. Tập lệnh được chia thành 4 nhóm lệnhxem bảng 3.1) - Nhóm lệnh số học và logic: gồm các lệnh tính tóan số học và logic - Nhóm lệnh rẽ nhánh: gồm các lệnh nhảy không điều kiện, nhảy có điều kiện theo các cờ trạng thái, lệnh gọi hàm và Return. - Nhóm lệnh truyền dữ liệu: gồm các lệnh di chuyển dữ liệu giữa các thanh ghi, ô nhớ RAM và Port IO bên ngoài. - Nhóm lệnh về bit: gồm các lệnh bit như xóa, đặt bit, lệnh dịch xoay . 2. Chế độ định Địa chỉ (Addressing Modes): Theo thiết kế thì RISC có 6 chế độ định địa chỉ. RA, RB được xem như là tóan hạng đích và toán hạng nguồn. 2.1 Định địa chỉ trực tiếp thanh ghi đơn: Lệnh có một toán hạng là RA: vừa là thanh ghi nguồn vừa là thanh ghi đích. Ví dụ như lệnh: dịch, xoay, set bit . 2.2 Định địa chỉ trực tiếp thanh ghi đôi: Lệnh có hai toán hạng là RA và RB. Sau khi tính tóan kết quả được ghi vào RA.Ví dụ như lệnh tóan học và logic 2.3 Định địa chỉ I/O trực tiếp : Toán hạng là I/O register. Địa chỉ được chứa trong 6 bit trong từ lệnh. Cách định địa chỉ này được sử dụng trong lệnh IN và OUT. 2.4 Định địa chỉ dữ liệu gián tiếp: Tóan hạng là ô nhớ Ram có địa chỉ chứa trong thanh ghi Z. Cách định địa chỉ được sử dụng trong lệnh LD và St. 2.5 Định địa chỉ tương đối bộ nhớ chương trình: Cách định địa chỉ này được sử dụng trong lệnh RJMP, RCALL. Địa chỉ lệnh kế được tính bằng PC + Offset. Offset được chứa trong từ lệnh. 2.6 Định địa chỉ tức thời: Tóan hạng là hằng số 8 bit đựơc cho trong từ lệnh

pdf65 trang | Chia sẻ: lvcdongnoi | Lượt xem: 3290 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Đề tài Thiết kế risc microcontroller dùng vhdl, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Tại pha đầu trạng thái S0 lệnh đã tìm nạp được đưa vào giải mã lệnh các chức năng đơn vị đường dữ liệu được xác lập, địa chỉ PC mới được tính toán, ngỏ vào của đơn vị điều khiển INS_TYPE= ”100” , tại pha thứ 2 trạng thái sẽ là S7 địa chỉ quay về được cất vào Stack. Tại pha cuối trạng thái S8 PC được nạp địa chỉ lệnh mới. Khi RISC thực hiện lệnh RET. Tại pha đầu trạng thái S0 lệnh đã tìm nạp được đưa vào giải mã lệnh các chức năng đơn vị đường dữ liệu được xác lập, địa chỉ PC mới được tính toán, ngỏ vào của đơn vị điều khiển INS_TYPE= ”101”, tại pha thứ 2 trạng thái sẽ là S8 địa chỉ quay về được nạp vào PC để tìm nạp lệnh mới. Tại pha cuối trạng thái S7 địa chỉ quay về được POP ra khỏi vùng Stack. Khi RISC thực hiện nhóm lệnh LD, ST. tại pha đầu trạng thái S0 lệnh đã tìm nạp được đưa vào giải mã lệnh các chức năng đơn vị đường dữ liệu được xác lập, dữ liệu từ nguồn đưa đến đích, ngỏ vào của đơn vị điều khiển Ins_TYPE= ”010”, tại pha thứ 2 trạng thái sẽ là S6 thực hiện ghi dữ liệu và PC tìm nạp lệnh mới. Tại pha cuối trạng thái S3 là trạng thái rãnh. ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 28 VIII> CHƯƠNG TRÌNH VHDL VÀ KẾT QUẢ MÔ PHỎNG. 1. Chương trình VHDL mô tả thanh ghi -----------------------////////////////////////////////////////////////////////////////////------------------------- -----------------------//-- DO AN DIEN TU - VIEN THONG II --//--------------------------- ----------------------//-- THAY HUONG DAN: HO TRUNG MY --//------------------------ -----------------------//-- SINH VIEN: PHAM HUNG THINH--//----------------------------- ----------//--DE TAI: THIET KE RISC 8 BIT MICROCONTROLLER --//---------------- ---------////////////////////////////////////////////////////////////////////////////////////////////////---------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY REG IS PORT( DI:IN STD_LOGIC_VECTOR(7 DOWNTO 0); CLR,CLK: IN STD_LOGIC; DO:OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ); END REG; ARCHITECTURE BEV OF REG IS SIGNAL DATA: STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN PROCESS(CLK,CLR) BEGIN IF CLR='0' THEN DATA<="00000000"; ELSE IF(CLK'EVENT AND CLK='0')THEN DATA<=DI; END IF; END IF; END PROCESS; DO<=DATA AFTER 0 ns; -- KET QUA THOI GIAN TRE 6.4 ns ~ 7 ns END BEV; ---------------/////////////////////////////////////////////////////------------------- ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 29 Kết quả mô phỏng: 2. Chương trình VHDL mô tả bộ mux 8Æ1 -----------------------////////////////////////////////////////////////////////////////////------------------------- -----------------------//-- DO AN DIEN TU - VIEN THONG II --//--------------------------- ----------------------//-- THAY HUONG DAN: HO TRUNG MY --//------------------------ -----------------------//-- SINH VIEN: PHAM HUNG THINH--//----------------------------- ----------//--DE TAI: THIET KE RISC 8 BIT MICROCONTROLLER --//---------------- ---------////////////////////////////////////////////////////////////////////////////////////////////////---------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY MUX8T1V8 IS PORT( IN0,IN1,IN2,IN3,IN4,IN5,IN6,IN7: IN STD_LOGIC_VECTOR (7 DOWNTO 0); SEL :IN STD_LOGIC_VECTOR(2 DOWNTO 0); OUTPUT: OUT STD_LOGIc_VECTOR(7 DOWNTO 0) ); END MUX8T1V8; ARCHITECTURE MULTIPLEX OF MUX8T1V8 IS BEGIN WITH SEL SELECT OUTPUT<= IN0 WHEN "000", IN1 WHEN "001", IN2 WHEN "010", IN3 WHEN "011", IN4 WHEN "100", IN5 WHEN "101", IN6 WHEN "110", ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 30 IN7 WHEN OTHERS; END MULTIPLEX; ---------------/////////////////////////////////////////////////////------------------- Kết quả mô phỏng: 3. Chương trình VHDL mô tả ROM -----------------------////////////////////////////////////////////////////////////////////------------------------- -----------------------//-- DO AN DIEN TU - VIEN THONG II --//--------------------------- ----------------------//-- THAY HUONG DAN: HO TRUNG MY --//------------------------ -----------------------//-- SINH VIEN: PHAM HUNG THINH--//----------------------------- ----------//--DE TAI: THIET KE RISC 8 BIT MICROCONTROLLER --//---------------- ---------////////////////////////////////////////////////////////////////////////////////////////////////---------------- library ieee; use ieee.std_logic_1164.all; entity effrom is port( pc : in std_logic_vector(8 downto 0); instruction : out std_logic_vector(15 downto 0)); end effrom; architecture rom of effrom is ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 31 component LPM_ROM generic ( LPM_WIDTH: integer := 16; LPM_WIDTHAD: integer := 9; LPM_NUMWORDS: integer := 512; LPM_FILE: string := "program.mif"; LPM_ADDRESS_CONTROL: string := "UNREGISTERED"; LPM_OUTDATA: string := "UNREGISTERED" ); port ( ADDRESS: in STD_LOGIC_VECTOR(LPM_WIDTHAD-1 downto 0); inclock: IN STD_LOGIC := '0'; outclock: IN STD_LOGIC := '0'; memenab: IN STD_LOGIC := '1'; Q: out STD_LOGIC_VECTOR(LPM_WIDTH-1 downto 0) ); end component; signal gnd, vcc : std_logic; begin vcc <= '1'; gnd <= '0'; v1 : LPM_ROM port map (address => pc, memenab => vcc, q => instruction); end rom; ---------------/////////////////////////////////////////////////////------------------- Kết quả mô phỏng: ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 32 4. Chương trình VHDL mô tả RAM -----------------------////////////////////////////////////////////////////////////////////------------------------- -----------------------//-- DO AN DIEN TU - VIEN THONG II --//--------------------------- ----------------------//-- THAY HUONG DAN: HO TRUNG MY --//------------------------ -----------------------//-- SINH VIEN: PHAM HUNG THINH--//----------------------------- ----------//--DE TAI: THIET KE RISC 8 BIT MICROCONTROLLER --//---------------- ---------////////////////////////////////////////////////////////////////////////////////////////////////---------------- library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity ram is port( addr : in std_logic_vector(7 downto 0); DATAWR: in std_logic_vector(7 downto 0); wr_ram,clkW: in std_logic; --clrn : in std_logic; c : out std_logic_vector(7 downto 0) ); end entity; architecture Sram of ram is component lpm_ram_dq generic( lpm_width: positive := 8; lpm_widthad: positive := 8; lpm_numwords: natural := 256; lpm_file: string := "ram.mif"; lpm_indata: string := "registered"; lpm_address_control: string := "registered"; lpm_outdata: string := "unregistered" ); port( data: in std_logic_vector(lpm_width-1 downto 0); address: in std_logic_vector(lpm_widthad-1 downto 0); we: in std_logic; inclock: in std_logic := '0'; outclock: in std_logic := '0'; q: out std_logic_vector(lpm_width-1 downto 0) ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 33 ); end component; signal mar, mbr, ram_out : std_logic_vector(7 downto 0); signal wr,wre: std_logic; begin mar <= addr; mbr <= datawr; wre <= not wr_ram; wr <= not clkW; sram: lpm_ram_dq port map(data => mbr, address => mar, we => wre, inclock =>wr, q => ram_out); c <= ram_out; end Sram; ---------------/////////////////////////////////////////////////////------------------- Kết quả mô phỏng: 5. Chương trình VHDL mô tả thanh ghi IO -----------------------////////////////////////////////////////////////////////////////////------------------------- -----------------------//-- DO AN DIEN TU - VIEN THONG II --//--------------------------- ----------------------//-- THAY HUONG DAN: HO TRUNG MY --//------------------------ -----------------------//-- SINH VIEN: PHAM HUNG THINH--//----------------------------- ----------//--DE TAI: THIET KE RISC 8 BIT MICROCONTROLLER --//---------------- ---------////////////////////////////////////////////////////////////////////////////////////////////////---------------- ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 34 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY I_O IS PORT( DATA: IN STD_LOGIC_VECTOR(7 DOWNTO 0); IO_SEL: IN STD_LOGIC_VECTOR(1 DOWNTO 0); --"00": A ; "01": B ; "10": C CLK_WR: IN STD_LOGIC; CLRN: IN STD_LOGIC; A: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); B: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); C: OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ); END I_O; ARCHITECTURE BEV OF I_O IS SIGNAL REGA: STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL REGB: STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL REGC: STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN PROCESS(CLRN,CLK_WR) BEGIN IF (CLRN='0') THEN REGA <= X"00"; REGB <= X"00"; REGC <= X"00"; ELSIF CLK_WR'EVENT AND CLK_WR='0' THEN CASE IO_SEL IS WHEN "00"=> REGA <= DATA; WHEN "01"=> REGB <= DATA; WHEN "10" => REGC <= DATA; WHEN OTHERS => END CASE; END IF; END PROCESS; ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 35 A <= REGA; B <= REGB; C <= REGC; END BEV; ---------------/////////////////////////////////////////////////////------------------- Kết quả mô phỏng: 6. Chương trình VHDL mô tả tập thanh ghi đa dụng -----------------------////////////////////////////////////////////////////////////////////------------------------- -----------------------//-- DO AN DIEN TU - VIEN THONG II --//--------------------------- ----------------------//-- THAY HUONG DAN: HO TRUNG MY --//------------------------ -----------------------//-- SINH VIEN: PHAM HUNG THINH--//----------------------------- ----------//--DE TAI: THIET KE RISC 8 BIT MICROCONTROLLER --//---------------- ---------////////////////////////////////////////////////////////////////////////////////////////////////---------------- library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity gpreg is port( data : in std_logic_vector(7 downto 0); wre, inc_zp, dec_zp : in std_logic; addA, addB, addW : in std_logic_vector(3 downto 0); ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 36 clkW,clrn : in std_logic; RA, RB, ZP : out std_logic_vector(7 downto 0) ); end gpreg; architecture gpr of gpreg is type regfiletype is array (0 to 15) of std_logic_vector(7 downto 0); signal reg : regfiletype; begin ZP <= reg(14); RA <= reg(CONV_INTEGER(addA)); RB <= reg(CONV_INTEGER(addB)); process(clkW, clrn) begin if clrn = '0' then for i in 0 to 15 loop reg(i) <= "00000000"; end loop; elsif clkW'event and clkW = '0' then if wre = '0' then reg(conv_integer(addW)) <= data; end if; if inc_zp = '0' then reg(14) <= reg(14) + 1; elsif dec_zp = '0' then reg(14) <= reg(14) - 1; end if; end if; end process; end gpr; ---------------/////////////////////////////////////////////////////------------------- ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 37 Kết quả mô phỏng: 7. Chương trình VHDL mô tả thanh ghi Trạng thái -----------------------////////////////////////////////////////////////////////////////////------------------------- -----------------------//-- DO AN DIEN TU - VIEN THONG II --//--------------------------- ----------------------//-- THAY HUONG DAN: HO TRUNG MY --//------------------------ -----------------------//-- SINH VIEN: PHAM HUNG THINH--//----------------------------- ----------//--DE TAI: THIET KE RISC 8 BIT MICROCONTROLLER --//---------------- ---------////////////////////////////////////////////////////////////////////////////////////////////////---------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY STATUS_REG IS PORT( FR_ALU,M_SR:IN STD_LOGIC_VECTOR(5 DOWNTO 0); --FR_ALU CONNECT TO TOSR SIGNAL DATA_BUS: IN STD_LOGIC_VECTOR(7 DOWNTO 0); LD_M,CLK: IN STD_LOGIC; --LOAD ='1' MODIFY='0' SEL_BIT: IN STD_LOGIC_VECTOR(2 DOWNTO 0); ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 38 SR_OUT: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); CB: OUT STD_LOGIC ); END STATUS_REG; ARCHITECTURE SREG OF STATUS_REG IS SIGNAL SR:STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN PROCESS (CLK) BEGIN IF CLK'EVENT AND CLK='0' THEN IF LD_M='1' THEN SR<=DATA_BUS; ELSE FOR I IN 0 TO 5 LOOP IF M_SR(I)='0' THEN SR(I)<=FR_ALU(I); END IF; END LOOP; END IF; END IF; END PROCESS; CB<= SR(CONV_INTEGER(SEL_BIT)); SR_OUT<=SR; END SREG; ---------------/////////////////////////////////////////////////////------------------- Kết quả mô phỏng: ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 39 8. Chương trình VHDL mô tả Program Counter -----------------------////////////////////////////////////////////////////////////////////------------------------- -----------------------//-- DO AN DIEN TU - VIEN THONG II --//--------------------------- ----------------------//-- THAY HUONG DAN: HO TRUNG MY --//------------------------ -----------------------//-- SINH VIEN: PHAM HUNG THINH--//----------------------------- ----------//--DE TAI: THIET KE RISC 8 BIT MICROCONTROLLER --//---------------- ---------////////////////////////////////////////////////////////////////////////////////////////////////---------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY PC IS PORT( OFFSET: IN STD_LOGIC_VECTOR(8 DOWNTO 0); SPC: IN STD_LOGIC; --SELECT VALUE OF PC REG. PUSH,POP: IN STD_LOGIC; CLKPP: IN STD_LOGIC; -- CLOCK PUSH POP LD_C: IN STD_LOGIC; --PC LOAD='1'/ COUNT='0' CLK: IN STD_LOGIC; CLR: IN STD_LOGIC; PCV: OUT STD_LOGIC_VECTOR(8 DOWNTO 0) ); END PC; ARCHITECTURE COM OF PC IS SIGNAL PC0: STD_LOGIC_VECTOR(8 DOWNTO 0); -- PC VALUE SIGNAL PC1: STD_LOGIC_VECTOR(8 DOWNTO 0); -- PC-1 SIGNAL SPC0: STD_LOGIC_VECTOR(8 DOWNTO 0); -- SELECT PC SIGNAL SPC1: STD_LOGIC_VECTOR(8 DOWNTO 0); -- SELECT PC SIGNAL LPC: STD_LOGIC_VECTOR(8 DOWNTO 0); -- LOAD PC VALUE SIGNAL STK0: STD_LOGIC_VECTOR(8 DOWNTO 0); --STACK; TOPOF STACK IS STK(3) SIGNAL STK1: STD_LOGIC_VECTOR(8 DOWNTO 0); SIGNAL STK2: STD_LOGIC_VECTOR(8 DOWNTO 0); SIGNAL STK3: STD_LOGIC_VECTOR(8 DOWNTO 0); BEGIN SPC0<= PC1 + OFFSET; SPC1<=STK3; LPC<=SPC0 WHEN SPC='0' ELSE SPC1; ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 40 A:PROCESS(CLK,CLR) -- PC COUNT BEGIN IF CLR='0' THEN PC0<="000000000"; ELSIF (CLK'EVENT AND CLK='0') THEN IF LD_C='0' THEN PC1<=PC0; PC0<=PC0+1; ELSE PC0<=LPC; END IF; END IF; END PROCESS; B:PROCESS (CLKPP,CLR) --STACK BEGIN IF CLR='0' THEN STK0 <= "000000000"; STK1 <= "000000000"; STK2 <= "000000000"; STK3 <= "000000000"; ELSIF ( CLKPP'EVENT AND CLKPP='0') THEN IF (PUSH='0') THEN STK0<=STK1; STK1<=STK2; STK2<=STK3; STK3<=PC0; ELSIF (POP='0') THEN STK3<=STK2; STK2<=STK1; STK1<=STK0; END IF; END IF; END PROCESS; PCV<=PC0; END COM; ---------------/////////////////////////////////////////////////////------------------- ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 41 Kết quả mô phỏng: 9. Chương trình VHDL mô tả đơn vị ALU -----------------------////////////////////////////////////////////////////////////////////------------------------- -----------------------//-- DO AN DIEN TU - VIEN THONG II --//--------------------------- ----------------------//-- THAY HUONG DAN: HO TRUNG MY --//------------------------ -----------------------//-- SINH VIEN: PHAM HUNG THINH--//----------------------------- ----------//--DE TAI: THIET KE RISC 8 BIT MICROCONTROLLER --//---------------- ---------////////////////////////////////////////////////////////////////////////////////////////////////---------------- library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; library lpm; use lpm.lpm_components.all; entity alu is port( RA, RB, imm_value,data_bus : in std_logic_vector(7 downto 0); ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 42 asel : in std_logic_vector(1 downto 0); bsel : in std_logic_vector(1 downto 0); c_flag : in std_logic; alu_sel : in std_logic_vector(1 downto 0); -- select result of ALU wcarry,add : in std_logic; logicsel : in std_logic_vector(1 downto 0); rightsel : in std_logic_vector(1 downto 0); dirsel : in std_logic; result : buffer std_logic_vector(7 downto 0); tosr : buffer std_logic_vector (5 downto 0) ); end alu; architecture R_alu of alu is signal a, b : std_logic_vector(7 downto 0); signal sr : std_logic_vector(5 downto 0); signal cin, overflow, cout : std_logic; signal sum, logic_out, right_out, dir_out : std_logic_vector(7 downto 0); begin -- Operand Fetch Unit -- process(asel,bsel) begin case asel is when "00" => a <= RA ; when "01" => a <= NOT RA; when "10" => a <= "00000000"; when others => a <= data_bus; end case; ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 43 case bsel is when "00" => b <= RB; when "01" => b <= data_bus; when "10" => b <= imm_value; when others => b <= "00000001"; end case; end process; -- Execution Unit -- -- carry enable cin <= c_flag when add = '1' and wcarry = '1' else '0' when add = '1' and wcarry = '0' else not c_flag when wcarry = '1' else '1'; -- Adder-Subtracter adder1 : lpm_add_sub generic map(lpm_width => 8) port map (dataa => a, datab => b, cin => cin, add_sub => add, result => sum, cout => cout, overflow => overflow); -- Logic Unit with logicsel select logic_out <= a and b when "00", -- and, andi a or b when "01", -- or, ori a xor b when "10", -- eor not a when others; -- com -- Shifter right_out(6 downto 0) <= a(7 downto 1); with rightsel select right_out(7) <= '0' when "00", -- lsr c_flag when "01", -- ror ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 44 a(7) when others; -- asr -- Direct Unit with dirsel select dir_out <= b when '0', -- ldi, mov (a(3 downto 0) & a(7 downto 4)) when others; -- swap -- Results of ALU --sum, logic_out, right_out, dir_out process(ALU_sel) begin case alu_sel is when "00" => result <= sum; when "01" => result <= logic_out; when "10" => result <= right_out; when others => result <= dir_out; end case; end process; -- Flags Evaluation Unit -- process(add, cout, alu_sel, a, b, sum, logic_out, right_out, overflow, sr) begin -- C sr(0) if add = '1' then sr(0) <= cout; elsif alu_sel = "10" then sr(0) <= a(0); elsif alu_sel = "01" then -- com sr(0) <= '1'; else -- subcp sr(0) <= not cout; end if; ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 45 -- Z sr(1) if (add = '1') and sum = "00000000" then sr(1) <= '1'; elsif alu_sel = "01" and logic_out = "00000000" then sr(1) <= '1'; elsif alu_sel = "10" and right_out = "00000000" then sr(1) <= '1'; else sr(1) <= '0'; end if; -- N sr(2) if (add = '1') and sum(7) = '1' then sr(2) <= '1'; elsif alu_sel = "01" and logic_out(7) = '1' then sr(2) <= '1'; elsif alu_sel = "10" and right_out(7) = '1' then sr(2) <= '1'; else sr(2) <= '0'; end if; -- V sr(3) if alu_sel = "10" then sr(3) <= right_out(7) xor a(0); elsif alu_sel = "01" then sr(3) <= '0'; else sr(3) <= overflow; end if; -- S sr(4) sr(4) <= sr(2) xor sr(3); -- H sr(5) if add = '1' then sr(5) <= (a(3) and b(3)) or (b(3) and not sum(3)) or (not sum(3) and a(3)); else -- subcp ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 46 sr(5) <= (not a(3) and b(3)) or (b(3) and sum(3)) or (sum(3) and not a(3)); end if; end process; tosr <= sr; end R_alu; ---------------/////////////////////////////////////////////////////------------------- Kết quả mô phỏng: ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 47 10. Chương trình VHDL mô tả đơn vị điều khiển thực thi -----------------------////////////////////////////////////////////////////////////////////------------------------- -----------------------//-- DO AN DIEN TU - VIEN THONG II --//--------------------------- ----------------------//-- THAY HUONG DAN: HO TRUNG MY --//------------------------ -----------------------//-- SINH VIEN: PHAM HUNG THINH--//----------------------------- ----------//--DE TAI: THIET KE RISC 8 BIT MICROCONTROLLER --//---------------- ---------////////////////////////////////////////////////////////////////////////////////////////////////---------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY CTRL_UNIT IS PORT( INS_CTRL : IN STD_LOGIC_VECTOR(2 DOWNTO 0); CLK : IN STD_LOGIC; RESET : IN STD_LOGIC; CLK_PC : OUT STD_LOGIC; --FETCH INSTRUCTION CLK_PP : OUT STD_LOGIC; -- PUSH POP CLK_LATCH : OUT STD_LOGIC; -- LATCH RESULT OF -- ALU CLK_INSTR : OUT STD_LOGIC; -- LATCH INSTRUCTION CLK_RW : OUT STD_LOGIC; -- WRITE RESULT TO --RAM, IO, GPREG, SR CLR : OUT STD_LOGIC ); END CTRL_UNIT; ARCHITECTURE BEV OF CTRL_UNIT IS TYPE STATE_TYPE IS (S0,S1,S2,S3,S4,S5,S6,S7,S8); SIGNAL STATE : STATE_TYPE; BEGIN PROCESS (RESET,CLK) BEGIN IF RESET='0' THEN STATE <= S0; CLR <= '0'; ELSE CLR <= '1'; IF (CLK'EVENT AND CLK='0') THEN CASE STATE IS ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 48 WHEN S0 => STATE <= S1; WHEN S1 => CASE INS_CTRL IS WHEN "000" => STATE <= S2; WHEN "001" => STATE <= S4; WHEN "010" => STATE <= S6; WHEN "100" => STATE <= S7; WHEN "101" => STATE <= S8; WHEN "110" => STATE <= S2; WHEN OTHERS => END CASE; WHEN S2 => STATE <= S3; WHEN S3 => STATE <= S1; WHEN S4 => STATE <= S5; WHEN S5 => STATE <= S1; WHEN S6 => STATE <= S3; WHEN S7 => IF INS_CTRL="101" THEN STATE <= S1; ELSIF INS_CTRL="100" THEN STATE <= S8; END IF; WHEN OTHERS => IF INS_CTRL="100" THEN STATE <= S1; ELSIF INS_CTRL="101" THEN STATE <= S7; END IF; END CASE; END IF; END IF; END PROCESS; PROCESS (STATE) BEGIN CASE STATE IS ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 49 WHEN S0 => CLK_PC <= '1'; CLK_PP <= '1'; CLK_LATCH <= '1'; CLK_INSTR <= '1'; CLK_RW <= '1'; WHEN S1 => CLK_PC <= '1'; CLK_PP <= '1'; CLK_LATCH <= '1'; CLK_INSTR <= '0'; CLK_RW <= '1'; WHEN S2 => CLK_PC <= '0'; CLK_PP <= '1'; CLK_LATCH <= '1'; CLK_INSTR <= '1'; CLK_RW <= '1'; WHEN S3 => CLK_PC <= '1'; CLK_PP <= '1'; CLK_LATCH <= '1'; CLK_INSTR <= '1'; CLK_RW <= '1'; WHEN S4 => CLK_PC <= '0'; CLK_PP <= '1'; CLK_LATCH <= '0'; CLK_INSTR <= '1'; CLK_RW <= '1'; WHEN S5 => CLK_PC <= '1'; CLK_PP <= '1'; CLK_LATCH <= '1'; CLK_INSTR <= '1'; CLK_RW <= '0'; WHEN S6 => CLK_PC <= '0'; CLK_PP <= '1'; CLK_LATCH <= '1'; CLK_INSTR <= '1'; CLK_RW <= '0'; ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 50 WHEN S7 => CLK_PC <= '1'; CLK_PP <= '0'; CLK_LATCH <= '1'; CLK_INSTR <= '1'; CLK_RW <= '1'; WHEN OTHERS => CLK_PC <= '0'; CLK_PP <= '1'; CLK_LATCH <= '1'; CLK_INSTR <= '1'; CLK_RW <= '1'; END CASE; END PROCESS; END BEV; ---------------/////////////////////////////////////////////////////------------------- Kết quả mô phỏng: ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 51 11. Chương trình VHDL mô tả thanh ghi -----------------------////////////////////////////////////////////////////////////////////------------------------- -----------------------//-- DO AN DIEN TU - VIEN THONG II --//--------------------------- ----------------------//-- THAY HUONG DAN: HO TRUNG MY --//------------------------ -----------------------//-- SINH VIEN: PHAM HUNG THINH--//----------------------------- ----------//--DE TAI: THIET KE RISC 8 BIT MICROCONTROLLER --//---------------- ---------////////////////////////////////////////////////////////////////////////////////////////////////---------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY INSTR_DEC IS PORT( --// ALU BIT CONTROL DECODER //-- INSTR : IN STD_LOGIC_VECTOR(15 DOWNTO 0); CB : IN STD_LOGIC; IMM_VALUE: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); ASEL : OUT STD_LOGIC_VECTOR(1 DOWNTO 0); BSEL : OUT STD_LOGIC_VECTOR(1 DOWNTO 0); ALU_SEL : OUT STD_LOGIC_VECTOR(1 DOWNTO 0); LOGICSEL: OUT STD_LOGIC_VECTOR(1 DOWNTO 0); RIGHTSEL: OUT STD_LOGIC_VECTOR(1 DOWNTO 0); DIRSEL : OUT STD_LOGIC; ADD : OUT STD_LOGIC; WCARRY : OUT STD_LOGIC; --// GPREG BIT CONTROL DECODER //-- ADDA : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); ADDB : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); ADDW : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); WRE : OUT STD_LOGIC; INC_ZP : OUT STD_LOGIC; DEC_ZP : OUT STD_LOGIC; --// PC BIT CONTROL DECODER //-- SPC : OUT STD_LOGIC; PUSH : OUT STD_LOGIC; POP : OUT STD_LOGIC; LD_C : OUT STD_LOGIC; ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 52 OFFSET : OUT STD_LOGIC_VECTOR(8 DOWNTO 0); --// STATUS REGISTER BIT CONTROL DECODER //-- M_SR : OUT STD_LOGIC_VECTOR(5 DOWNTO 0); LD_M : OUT STD_LOGIC; SEL_BIT : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); --// DATA BIT CONTROL DECODER //-- DATAMUX : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); --// IO BIT CONTROL DECODER //-- IO_SEL : OUT STD_LOGIC_VECTOR(1 DOWNTO 0); --// IO BIT CONTROL DECODER //-- WR_RAM : OUT STD_LOGIC; INS_CONTROL: OUT STD_LOGIC_VECTOR(2 DOWNTO 0) ); END INSTR_DEC; ARCHITECTURE BEV OF INSTR_DEC IS BEGIN PROCESS (INSTR) VARIABLE INS_TYPE : STD_LOGIC_VECTOR(2 DOWNTO 0); VARIABLE V_IO_SEL : STD_LOGIC_VECTOR(1 DOWNTO 0); VARIABLE V_LD_M : STD_LOGIC; VARIABLE V_INC_ZP : STD_LOGIC; VARIABLE V_DEC_ZP : STD_LOGIC; VARIABLE V_LD_C : STD_LOGIC; VARIABLE V_WRE : STD_LOGIC; VARIABLE V_WR_RAM : STD_LOGIC; VARIABLE V_TEM : STD_LOGIC_VECTOR(7 DOWNTO 0); VARIABLE V_BR : STD_LOGIC; -- BRANCH CONDITION BEGIN INS_TYPE := "001"; V_LD_M := '0'; --MODIFY SR V_INC_ZP := '1'; --DISABLE V_DEC_ZP := '1'; --DISABLE V_LD_C := '0'; --PC COUNT V_WRE := '1'; --DISABLE WRITE GPREG V_IO_SEL := "11"; --DISABLE WRITE IO V_WR_RAM:= '1'; --DISABLE WRITE RAM ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 53 V_BR := '0'; --DISABLE BRANCH CASE INSTR(15 DOWNTO 12) IS WHEN "0000" => ADDA <= INSTR(7 DOWNTO 4); ADDW <= INSTR(7 DOWNTO 4); ADDB <= INSTR(3 DOWNTO 0); ASEL <= "00"; --ORA<=(dddd) BSEL <= "00"; --ORB<=(rrrr) DATAMUX <= "000"; --DATA BUS<= RESULT OF ALU CASE INSTR(11 DOWNTO 10) IS WHEN "01" => ADD <= '0'; WCARRY <= '1'; ALU_SEL <= "00"; M_SR <= "000000"; WHEN "10" => ADD <= '0'; --SUBTRACT WCARRY <= '1'; --USE CARRY IN ALU_SEL <= "00"; V_WRE := '0'; --ENABLE WRITE GPREG M_SR <= "000000"; WHEN "11" => ADD <= '1'; --ADD WCARRY <= '0'; --DISABLE CARRY IN ALU_SEL <= "00"; V_WRE := '0'; --ENABLE WRITE GPREG M_SR <= "000000"; WHEN OTHERS => INS_TYPE:="000"; END CASE; WHEN "0001" => ADDA <= INSTR(7 DOWNTO 4); ADDW <= INSTR(7 DOWNTO 4); ADDB <= INSTR(3 DOWNTO 0); ASEL <= "00"; --ORA<=(dddd) BSEL <= "00"; --ORB<=(rrrr) DATAMUX <= "000"; --DATA BUS<= RESULT OF ALU CASE INSTR(11 DOWNTO 10) IS WHEN "01" => ADD <= '0'; WCARRY <= '0'; ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 54 ALU_SEL <= "00"; M_SR <= "000000"; WHEN "10" => ADD <= '0'; --SUBTRACT WCARRY <= '0'; --DISABLE CARRY IN ALU_SEL <= "00"; V_WRE := '0'; --ENABLE WRITE GPREG M_SR <= "000000"; WHEN "11" => ADD <= '1'; --ADD WCARRY <= '1'; --ANABLE CARRY IN ALU_SEL <= "00"; V_WRE := '0'; --ENABLE WRITE GPREG M_SR <= "000000"; WHEN OTHERS => END CASE; WHEN "0010" => ADDA <= INSTR(7 DOWNTO 4); ADDW <= INSTR(7 DOWNTO 4); ADDB <= INSTR(3 DOWNTO 0); ASEL <= "00"; --ORA<=(dddd) BSEL <= "00"; --ORB<=(rrrr) DATAMUX <= "000"; --DATA BUS<= RESULT OF ALU CASE INSTR(11 DOWNTO 10) IS WHEN "00" => LOGICSEL <= "00"; --AND LOGIC ALU_SEL <= "01"; V_WRE := '0'; --ENABLE WRITE GPREG M_SR <= "001001"; --S,C,Z,N,V,H WHEN "01" => LOGICSEL <= "10"; --XOR LOGIC ALU_SEL <= "01"; V_WRE := '0'; --ENABLE WRITE GPREG M_SR <= "001001"; --S,C,Z,N,V,H WHEN "10" => LOGICSEL <= "01"; --OR LOGIC ALU_SEL <= "01"; V_WRE := '0'; --ENABLE WRITE GPREG ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 55 M_SR <= "001001"; --S,C,Z,N,V,H WHEN OTHERS => DIRSEL <= '0'; --PASS B ALU_SEL <= "11"; V_WRE := '0'; --ENABLE WRITE GPREG M_SR <= "111111"; --S,C,Z,N,V,H END CASE; WHEN "0011" => IMM_VALUE <= INSTR(11 DOWNTO 8) & INSTR(3 DOWNTO 0); ADDW <= INSTR(7 DOWNTO 4); ASEL <= "00"; --ORA<=(dddd) BSEL <= "10"; --ORB<=KKKKKKKK DATAMUX <= "000"; --DATA BUS<= RESULT OF ALU ADD <= '0'; --SUB WCARRY <= '0'; --DISABLE CARRY IN ALU_SEL <= "00"; M_SR <= "000000"; WHEN "0100" => IMM_VALUE <= INSTR(11 DOWNTO 8) & INSTR(3 DOWNTO 0); ADDW <= INSTR(7 DOWNTO 4); ASEL <= "00"; --ORA<=(dddd) BSEL <= "10"; --ORB<=KKKKKKKK DATAMUX <= "000"; --DATA BUS<= RESULT OF ALU ADD <= '0'; --SUB WCARRY <= '1'; --USE CARRY IN ALU_SEL <= "00"; V_WRE := '0'; --ENABLE WRITE GPREG M_SR <= "000000"; WHEN "0101" => IMM_VALUE <= INSTR(11 DOWNTO 8) & INSTR(3 DOWNTO 0); ADDW <= INSTR(7 DOWNTO 4); ASEL <= "00"; --ORA<=(dddd) BSEL <= "10"; --ORB<=KKKKKKKK ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 56 DATAMUX <= "000"; --DATA BUS<= RESULT OF ALU ADD <= '0'; --SUB WCARRY <= '0'; --DISABLE CARRY IN ALU_SEL <= "00"; V_WRE := '0'; --ENABLE WRITE GPREG M_SR <= "000000"; WHEN "0110" => IMM_VALUE <= INSTR(11 DOWNTO 8) & INSTR(3 DOWNTO 0); ADDW <= INSTR(7 DOWNTO 4); ASEL <= "00"; --ORA<=(dddd) BSEL <= "10"; --ORB<=KKKKKKKK DATAMUX <= "000"; --DATA BUS<= RESULT OF ALU LOGICSEL <= "01"; --OR LOGIC ALU_SEL <= "01"; V_WRE := '0'; --ENABLE WRITE GPREG M_SR <= "001001"; --S,C,Z,N,V,H WHEN "0111" => IMM_VALUE <= INSTR(11 DOWNTO 8) & INSTR(3 DOWNTO 0); ADDW <= INSTR(7 DOWNTO 4); ASEL <= "00"; --ORA<=(dddd) BSEL <= "10"; --ORB<=KKKKKKKK DATAMUX <= "000"; --DATA BUS<= RESULT OF ALU LOGICSEL <= "00"; --AND LOGIC ALU_SEL <= "01"; V_WRE := '0'; --ENABLE WRITE GPREG M_SR = "001001"; --S,C,Z,N,V,H WHEN "1000" => IF INSTR(11 DOWNTO 9)= "000" THEN DATAMUX <= "010"; --DATA BUS <= RAM ADDW <= INSTR(7 DOWNTO 4); V_WRE := '0'; --ENABLE WRITE GPREG INS_TYPE = "010"; ELSIF INSTR(11 DOWNTO 9)= "001" THEN ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 57 ADDB <= INSTR(7 DOWNTO 4); BSEL <= "00"; --ORB <= B DIRSEL <= '0'; --PASS B ALU_SEL <= "11"; DATAMUX <= "000"; --DATA BUS <= ALU V_WR_RAM:= '0'; --ENABLE WRITE TO RAM INS_TYPE := "010"; --WRITE TO RAM END IF; M_SR <= "111111"; --S,C,Z,N,V,H WHEN "1001" => CASE instr(11 DOWNTO 10) IS WHEN "00" => IF INSTR(9)= '0' THEN --LOAD INSTR DATAMUX <= "010";--DATA BUS <= RAM ADDW <= INSTR(7 DOWNTO 4); V_WRE := '0'; --ENABLE WRITE GPREG ELSE --STORE INSTR ADDB <= INSTR(7 DOWNTO 3); BSEL <= "00"; --ORB <= B DIRSEL <= '0'; --PASS B ALU_SEL <= "11"; V_WR_RAM:= '0'; --ENABLE WRITE TO RAM DATAMUX <= "000";--DATA BUS <= ALU END IF; IF INSTR(1 DOWNTO 0)="01" THEN V_INC_ZP := '0'; --ENABLE ELSIF INSTR(1 DOWNTO 0)="10" THEN V_DEC_ZP := '0'; --ENABLE END IF; INS_TYPE := "010"; M_SR <= "111111"; --S,C,Z,N,V,H WHEN "01" => ADDW <= INSTR(7 DOWNTO 0); ADDA <= INSTR(7 DOWNTO 0); BSEL <= "11"; --B<="00000001" DATAMUX <= "000"; --DATA BUS<= RESULT OF ALU V_WRE := '0'; --ENABLE WRITE GPREG ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 58 CASE INSTR(2 DOWNTO 0) IS WHEN "000" => IF INSTR(3)='0' THEN --COMPLEMENT INSTRUCTIO ASEL <= "00"; LOGICSEL <= "11"; --NOT LOGIC ALU_SEL <= "01"; M_SR <= "000001"; --S,C,Z,N,V,H ELSIF INSTR(8)='1' THEN --RETURN INSTRUCTION SPC <= '1'; V_LD_C := '0'; PUSH <= '1'; POP <= '0'; INS_TYPE:= "101"; ELSE --BSET; BCLR INSTRUCTION CASE INSTR(6 DOWNTO 4) IS WHEN "000" => V_TEM := "00000001"; WHEN "001" => V_TEM := "00000010"; WHEN "010" => V_TEM := "00000100"; WHEN "011" => V_TEM := "00001000"; WHEN "100" => V_TEM := "00010000"; WHEN "101" => V_TEM := "00100000"; WHEN "110" => V_TEM := "01000000"; WHENOTHERS => V_TEM := "10000000"; END CASE; IF INSTR(10 DOWNTO 8) ="001" THEN IMM_VALUE <= NOT V_TEM; LOGICSEL <= "00"; --AND LOGIC ELSIF INSTR(10 DOWNTO 8) ="000" THEN IMM_VALUE <= V_TEM; ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 59 LOGICSEL <= "01"; --OR LOGIC END IF; ASEL <= "11"; --DATA BUS BSEL <= "10"; --IMMEDIATE DATAMUX <= '1'& INSTR(5 DOWNTO 4); V_LD_M := '1';-- LOAD DATA TO SR ALU_SEL <= "01"; INS_TYPE :="010"; M_SR <= "111111"; --S,C,Z,N,V,H END IF; WHEN "001" => ASEL <= "01"; ADD <= '1'; ALU_SEL <= "00"; M_SR <= "000000"; WHEN "010" => ASEL <= "00"; DIRSEL <= '1'; -- SWAP A ALU_SEL <= "11"; M_SR <= "111111"; WHEN "011" => ASEL <= "00"; IF INSTR(3) = '0' THEN --INC ADD <= '1'; ELSE --DEC ADD <= '0'; END IF; ALU_SEL <= "00"; M_SR <= "000000"; WHEN OTHERS => --101,110,111 CASE INSTR(1 DOWNTO 0)IS WHEN "01" => RIGHTSEL <= "10"; --ASR WHEN "10" => RIGHTSEL <= "00"; --LSR WHEN "11" => RIGHTSEL <= "01"; --ROR WHEN OTHERS => END CASE; ASEL <= "00"; ALU_SEL <= "01"; ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 60 M_SR <= "000001"; END CASE; WHEN "10" => CASE INSTR(2 DOWNTO 0) IS WHEN "000" => V_TEM := "00000001"; WHEN "001" => V_TEM := "00000010"; WHEN "010" => V_TEM := "00000100"; WHEN "011" => V_TEM := "00001000"; WHEN "100" => V_TEM := "00010000"; WHEN "101" => V_TEM := "00100000"; WHEN "110" => V_TEM := "01000000"; WHEN OTHERS =>V_TEM := "10000000"; END CASE; IF INSTR(9 DOWNTO 8) ="00" THEN IMM_VALUE<= NOT V_TEM; LOGICSEL <= "00"; --AND LOGIC ELSIF INSTR(9 DOWNTO 8) ="10" THEN IMM_VALUE <= V_TEM; LOGICSEL <= "01"; END IF; ASEL <= "11"; --DATA BUS BSEL <= "10"; --IMMEDIATE DATAMUX <='1' & INSTR(5 DOWNTO 4); V_IO_SEL := INSTR(5 DOWNTO 4); ALU_SEL <= "01"; INS_TYPE :="010"; M_SR <= "111111"; --S,C,Z,N,V,H WHEN OTHERS => END CASE; WHEN "1010" => WHEN "1011" => IF INSTR(11)= '0' THEN --IN ADDW <= INSTR(7 DOWNTO 4); DATAMUX <= '1' & INSTR(1 DOWNTO 0); V_WRE := '0';-- ENABLE WRITE TO GPREG ELSE --OUT ADDB <= INSTR(7 DOWNTO 4); BSEL <= "00"; --ORB <= B DIRSEL <= '0'; --PASS B ALU_SEL <= "11"; ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 61 V_IO_SEL:= INSTR(1 DOWNTO 0); --WRITE IO --REGISTER END IF; INS_TYPE := "010"; M_SR <= "111111"; --S,C,Z,N,V,H WHEN "1100" => OFFSET <= INSTR(11 DOWNTO 0); SPC <= '0'; PUSH <= '1'; POP <= '1'; V_LD_C := '1'; INS_TYPE := "110"; M_SR <= "111111"; --S,C,Z,N,V,H WHEN "1101" => OFFSET <= INSTR(8 DOWNTO 0); SPC <= '0'; PUSH <= '0'; POP <= '1'; V_LD_C := '1'; --LOAD PC INS_TYPE := "100"; M_SR <= "111111"; --S,C,Z,N,V,H WHEN "1110" => IMM_VALUE <= INSTR(11 DOWNTO 8) & INSTR(3 DOWNTO 0); ADDW <= INSTR(7 DOWNTO 4); BSEL <= "10"; DIRSEL <= '0'; --PASS B ALU_SEL <= "11"; --DIR SELECT DATAMUX <= "000"; --RESULT OF ALU INS_TYPE := "001"; M_SR <= "111111"; --S,C,Z,N,V,H WHEN OTHERS => SEL_BIT <= INSTR(2 DOWNTO 0); OFFSET <= "00" & INSTR(9 DOWNTO 3); V_BR := INSTR(10) XOR CB; IF V_BR ='1' THEN V_LD_C := '1'; SPC <= '0'; ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 62 PUSH <= '1'; POP <= '1'; INS_TYPE:= "110"; ELSE INS_TYPE:= "000"; END IF; M_SR <= "111111"; --S,C,Z,N,V,H END CASE; LD_M <= V_LD_M; INC_ZP <= V_INC_ZP; DEC_ZP <= V_DEC_ZP; LD_C <= V_LD_C; WRE <= V_WRE; IO_SEL <= V_IO_SEL; WR_RAM <= V_WR_RAM; INS_CONTROL<=INS_TYPE; END PROCESS; END BEV; ---------------/////////////////////////////////////////////////////------------------- Kết quả mô phỏng: ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 63 ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 64 Tài Liệu Tham Khảo [1] Nguyên lý mạch tích hơp Tập 2: Lập trình ASIC, Tống Văn On [2] Digital Systems Design Using VHDL, Charles H. Roth [3] Building a RISC system in an FPGA, Part 1,2,3, Jan Gray, Circuit Cellar Magazine [4] Design Your Own Microprocessor, Jim Turley, Circuit Cellar Magazine [5] Building a RISC system in an FPGA, Yah Zi He [6] www.altera.com [7] www.opencores.org [8] www.Atmel.com ĐAMH Điện Tử Viễn Thông II ___________________________________ GVHD: Hồ Trung Mỹ _____________________________________*******______________________________________ Thiết kế RISC microcontroller _________________________________ SVTH: Phạm Hưng Thịnh _____________________________________*******______________________________________ 65

Các file đính kèm theo tài liệu này:

  • pdfThiết kế Risc Microcontroller dùng VHDL.pdf