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
65 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 3290 | Lượt tải: 0
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:
- Thiết kế Risc Microcontroller dùng VHDL.pdf