Đồ án Mô Phỏng Mạch Logic số

Máy tính hiện nay là một công cụ rất mạnh để giải quyết những bài toán về kĩ thuật đòi hỏi khả năng tính toán cao. Với khả năng đồ hoạ của mình máy tính cho phép không chỉ thể hiện ưu điểm của mình ở khả năng tihns toán nhanh mà nó còn cho phép chúng ta biểu thị các đối tượng các hoạt động, các sự kiện một cách sinh động bằng hình ảnh.Đây là nguyên nhân vì sao hiện nay cùng với sự phát triển nhanh về tốc độ ,su hướng làm phần mềm về đồ hoạ mô phỏng ,hoặc những phần mềm đồ hoạ 3D phát triển rất mạnh.

doc19 trang | Chia sẻ: diunt88 | Lượt xem: 2187 | Lượt tải: 0download
Bạn đang xem nội dung tài liệu Đồ án Mô Phỏng Mạch Logic số, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Trường đại học Bách khoa hà nội Khoa điện tử viễn thông hà nội 6/2000 Trường đại học Bách khoa hà nội Khoa điện tử viễn thông BàI Tập Lớn Đề tài Mô Phỏng Mạch Logic số Giáo viên hướng dẫn Vũ Song Tùng Thực hiện chương trình Đặng Hiếu Nhơn Nguyễn Hoàng Nga Nguyễn Thị Ngọc Thuỷ Nguyễn Xuân Thuỳ Nguyễn Thị Thu Hà Ngô Đức Thường Hà Nội - 6/2000 I.Đặt vấn đề: Máy tính hiện nay là một công cụ rất mạnh để giải quyết những bài toán về kĩ thuật đòi hỏi khả năng tính toán cao. Với khả năng đồ hoạ của mình máy tính cho phép không chỉ thể hiện ưu điểm của mình ở khả năng tihns toán nhanh mà nó còn cho phép chúng ta biểu thị các đối tượng các hoạt động, các sự kiện một cách sinh động bằng hình ảnh.Đây là nguyên nhân vì sao hiện nay cùng với sự phát triển nhanh về tốc độ ,su hướng làm phần mềm về đồ hoạ mô phỏng ,hoặc những phần mềm đồ hoạ 3D phát triển rất mạnh. Để bắt kịp với sự phát triển của thế giới chúngta cần phải khai thác một cách triệt để khả năng của máy tính. Với sự hướng dẫn của thầy giáo Vũ Song Tùng chúng tôi thiết kế phần mềm Mô phỏng Mạch Logic số vơí mục đích: Khai thác khả năng về đồ hoạ của máy tính Bước đầu làm quen với lập trình hướng đối tượng Tăng dần khả năng lập trình với việc giải quyết các vấn đề nảy sinh trong kĩ thuật lập trình mô phỏng(chưa phải theo thời gian thực) Chúng tôi chọn ngôn ngữ C++ để thực hiện chương trình của mình bởi vì hiện nay C++ đang được dạy trong các trường đại học và khả năng lập trình hướng đối tượng của nó rất mạnh rất thích hợp với các bài toán về đối tượng. Tuy nhiên do thời gian có hạn nên một số ý tưởng của tác giả cũng như một số kĩ thuật lập trình chưa được đưa vào.Vì thế chương trình còn nhiều vấn đề chưa được hoàn thiện.Phần mềm này chỉ thích hợp với khuôn khổ một bài tập lớn.Chương trình chỉ dừng ở mức hướng đối tượng một nửa,cho nên rất thích hợp với những người mới học lập trình hướng đối tượng.Chương trình được trình bày một cách dõ dàng ,dễ đọc dễ hiểu,có thể là tài liệu tham khảo của những người mới học lập trình hướng đối tượng. Cuối cùng thay mặt cả nhóm xin chân thành cám ơn thầy :Vũ Song Tùng đã nhiệt tình giúp đỡ chúng em hoàn thành chương trình này. Nhóm trưởng: Đặng Hiếu Nhơn II.Cơ sở lý thuyết: Các phần tử logic cơ bản là AND,OR,NOT,XOR,NAND,NOR.Các cổng logic hoạt động theo một bảng gọi là bảng chân lí(True Table).Tưong ứng với 6 cổng logic ta có 6 bảng chân lí sau: 1.Cổng AND: Kí hiệu: Bảng chân lý: x  y  z   0  0  0   0  1  0   1  0  0   1  1  1   2.Cổng OR: Kí hiệu: Bảng chân lý: x  y  z   0  0  0   0  1  1   1  0  1   1  1  1   3.Cổng NOT: Kí hiệu: Bảng chân lí: x  x   0  1   1  0   4.Cổng NAND: Kí hiệu: Bảng chân lí: x  y  z   0  0  1   0  1  1   1  0  1   1  1  0   5.Cổng NOR: Kí hiệu: Bảng chân lí: x  y  z   0  0  1   0  1  1   1  0  1   1  1  0   6.Cổng XOR: Kí hiệu: Bảng chân lí: x  y  z   0  0  1   0  1  1   1  0  1   1  1  0   III.Thiết kế chương trình: 3.1.Các đối tượng: Ta chia các đối tượng ra làm 2 loại: Đối tượng nguyên tố : đối tượng này là nhỏ nhất không thể chia nhỏ được nữa Đối tượng nhóm(Group): đối tượng này gồm nhiều đối tượng con ghép lại. Chương trình được thiết kế theo kiểu giao diện của Windows bao gồm hệ thống Menu(Bảng chọn), ToolBar(Thanh công cụ), Các nút bấm (Button), Hộp thoại (MessageBox), Hộp nhập liệu (InputBox), các đối tượng lựa chọn(Option), Các đối tượng ảnh(Image). Hoạt động của mỗi mạch logic được thiết kế ở những của sổ riêng gọi là các FORM.Thể hiện hoạt động theo thời gian ta dùng đối tượng Osilo,Bảng chân lý ta dùng đối tượng TrueTable,để thay đổi các đầu vào ta dùng các nút chuyển mạch(SwitchButton) 3.2.Các hàm và các đối tượng: Các hàm và các đối tượng được khai báo trong file logic.h như sau: #ifndef_LOGIC_H_ #define _LOGIC_H_ #include #include #include #include #include #ifndef byte typedef unsigned char byte; #endif #ifndef word typedef unsigned int word; #endif #ifndef dword typedef unsigned long dword; #endif #ifndef bool typedef int bool; #endif #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #define LEFT_MOUSE_PRESS 0xff01 #define RIGHT_MOUSE_PRESS 0xff02 #define LEFT_MOUSE_REL 0xff11 #define RIGHT_MOUSE_REL 0xff12 #define MOUSE_MOVE 0xff00 #define MS_GET_STATUS 3 #define MS_GET_MOVE 11 #define MS_HID_BOX 16 #define ABOUT 10 #define HELP 11 #define EXIT 12 #define SHOWICON 22 #define HIDEICON 23 #define SHOWTOOLBAR 20 #define HIDETOOLBAR 21 #define AND 1 #define OR 2 #define NAND 3 #define NOR 4 #define XOR 5 #define NOT 6 #endif IV.ý nghĩa các hàm và các tham số: 4.1.Các hàm về đồ hoạ: extern int TextHeight(); Trả về chiều cao của phông chữ sử dụng extern int TextWidth(char ch); Trả về độ rộng của kí tự ch extern int Strlen(char *s); Trả về độ dài sâu s theo pixel extern void ShowString(int x,int y,const char* s,byte color); Vẽ sâu s tai vị trí (x,y) có màu là color extern void ShowChar(int x,int y,byte ch,byte color); Vẽ kí tự có mã ch tại vị trí (x,y) màu là color extern void Load_fnt(); Đọc phông tiếng việt đưa vào bộ nhớ extern void Load_Bmp(int l,int t,char *fname); Đọc một file ảnh từ tệp có tên *fname ,sau đó đưa ra man hình ở vị trí(l,t) extern void ShowText(int l,int t,int w,int h,char *s,int c); Vẽ một sâu kí tự s ở giữa hình chữ nhật có góc trái trên(l,t) độ rộng w,cao h có màu c extern void DrawBar(int l,int t,int w,int h,int type); Vẽ hình chữ nhật có góc tría trên(l,t),rộng w,cao h,với kiểu là type extern void Drawcaption(int l,int t,int w,int h,char *s); Vẽ tiêu đề trong một hình chữ nhật extern void Dohoa(); Khởi tạo đồ hoạ extern void Linec(int x1,int y1,int x2,int y2,byte c); Vẽ đường thẳng với màu c extern void Lineh3d(int x1,int x2,int y,int st); Vẽ đường thẳng 3d theo chiều ngang kiểu st(nổi hay chìm) extern void Linev3d(int y1,int y2,int x,char st); Vẽ đường thẳng 3d theo chiều dọc kiểu st(nổi hay chìm) extern void Bound(int x1,int y1,int x2,int y2,char tborder); Vẽ đường viền hình chữ nhật có kiểu tborder extern void Bbar(int x1,int y1,int x2,int y2,byte c); Điền màu c vào một hình chữ nhật extern void Rectangle(int x1,int y1,int x2,int y2,byte c); Vẽ hình chữ nhật với màu c void WaitforVR(); Chờ tín hiệu đồng bộ 4.2.Các hàm về Mouse: extern bool Msmoved(); Kiểm tra xem chuột có di chuyển không extern void Msmove(word x, word y); Di chuyển chuột đến vị trí(x,y) extern void Ms_shape(word x); extern void mouse(word *ax, word *bx, word *cx, word *dx); extern bool Mscheck(void); extern bool Msinit(void); extern word Msreset(void); extern void Mslimit(word left,word top,word right,word bottom); extern void Msshow(void); extern void Mshide(void); extern void Mshidebox(word left,word top,word right,word bottom); extern word MsXpos(void); extern word MsYpos(void); extern void Msgetpos(int *,int *); extern bool Msinbox(word left,word top,word right,word bottom); extern int Msbpress(word b); extern int Msbreles(word b); extern int Msbstate(void); extern int Mslastmove(bool dir); extern void SetPointerShape(word Horiz,word Vert); extern int Msleftpress(); extern void MsSpeed(); extern int Msrightpress(); 4.3.Các đối tượng nguyên tố: class BITMAP{ private: word left,top;//G public: BITMAP(int l,int t){left=l,top=t;}; void ReadBMP (char *FileName ); /*Đọc một file ảnh bitmap }; class CloseButton { public: int left,top,width,height; byte down;//biến trạng thái chỉ nút nổi hay chìm byte hint;//biến trạng thái xác định đã Showhint chưa int hintx,hinty;//vị trí của hint void *Img;//con trỏ lưu ảnh khi Showhint CloseButton() { left=top=width=height=0; down=0; hint=hintx=hinty=0; }; void Init(int l,int t,int w,int h);//Hàm tạo void Show();//Hàm hiển thị đối tượng void Showhint();//Hiện hint void Hidehint();//ẩn hint int GetEvent();//Nhận sự kiện void Hide();//ẩn đối tượng int Click();//trả về 1 nếu chuột trái kích vào đối tượng void Move(int,int);//Di chuyển đối tượng void DoEvent();//thi hành sự kiện }; class CommandButton{ public: int left,top,width,height; char caption[30]; byte drag;//biến trạng thái xem chuột có di qua đối tượng hay không byte isdown; CommandButton(); void Init(int l,int t,int w,int h,char *s);//Khởi tạo void Show();//Hiển thị void Draw_up();//Vẽ nổi void Draw_down();//Vẽ chìm int GetEvent(); void DoEvent(); int Click(); }; //Nút chuyển mạch class SwitchButton { public: int left,top,width,height; int value;//Giá trị của nút char fname1[20],fname2[20]; SwitchButton(){value=0; }; void Init( int l,int t,int w,int h) { left=l; top=t; width=w; height=h; value=0; strcpy(fname1,"switch1.bm"); strcpy(fname2,"switch2.bm"); }; void Draw();//Vẽ nút tuỳ theo giá trị của nút void Show(); int Click(); int GetEvent(); void DoEvent(); }; //Nút 2 trạng thái class BiButton { public: int left,top,width,height; int value; char fname1[20],fname2[20]; BiButton(){value=0; }; void Init( int l,int t,int w,int h) { left=l; top=t; width=w; height=h; value=0; strcpy(fname1,"run.bm"); strcpy(fname2,"st.bm"); }; void ChangeImg(char *,char *);//thay đổi các ảnh hiển thị của nút void Draw(); void Show(); int Click(); int GetEvent(); void DoEvent(); }; class BmButton { public: int left,top,width,height; char fname[20]; byte drag,down;//Biến trạng thái char caption[20]; BmButton(){left=top=width=height=drag=down=0;}; void Init(int l,int t,int w,int h,char *s,char *fn); void Show(); int GetEvent(); int Drag(); int Click(); void DoEvent(); ~BmButton(); }; //lớp nút mũi tên lên class Upbut { public: int left,top; byte isdown; Upbut(){left=top=isdown=0;}; void Init(int,int); void Show(); int GetEvent(); void Draw_up(); void Draw_down(); }; //Lớp nút mũi tên xuống class Downbut { public: int left,top; byte isdown; Downbut(){left=top=isdown=0;}; void Init(int,int); void Show(); int GetEvent(); void Draw_up(); void Draw_down(); }; 4.4.Các đối tượng nhóm: class MessageBox{ // phan du lieu public: int left, top, width, height; char caption[30]; CloseButton Cl; CommandButton cmd; void *Img; byte hide; byte move; // phan xu ly MessageBox(){ left=200; top=160; width=240; height=160; strcpy(caption," Logic Gate"); hide=move=1; } void Show(); void Init( int l, int t, int w, int h ); void Hide(); void Move( int dx, int dy ); int GetEvent(); void DoEvent(); ~MessageBox() { delete(Img); delete(caption); }; }; //Lớp osilo class Osilo { public: int left,top,width,height; BiButton on; BiButton close; char in1[15];//Lưu dãy tín hiệu vào char in2[15]; char out[15];//Lưu dãy tín hiệu ra char fname[30];//tên file ảnh byte type;//Kiểu mạch AND,OR ,NOT,... byte show, event;//biến trạng thái byte OK,done; int i;//biến đếm Osilo(){left=top=0;show=event=0;memset(in1,'0',15);memset(in2,'0',15); strcpy(fname,"osilo.bm"); OK=1;done=0;i=0; }; void Init(int,int,int); void Setvalue();//hàm đặt giá trị void Black_Box(int,int,int,int);//Vẽ một hộp đen void ShowText();//Hiển thị chữ void Screen();//Vẽ màn hình void Show();//Hiển thị đối tượng void Hide(); void Run();//Hoạt động của tín hiệu quét int GetEvent(); void DoEvent(); ~Osilo(){delete (fname);delete(in1);delete(in2);delete(out);}; }; //Lớp thanh công cụ class ToolBar{ public: int left,top,width,height; byte show,active,event;//Các biến trạng thái BmButton button[8];//8 nút của thanh công cụ ToolBar(){left=top=width=height=show=active=event=0;}; void Init(int,int,int,int); void Show(); void Hide(); int GetEvent(); int And_Click();//trả về 1 naếu kích chuột vào nút AND int Or_CLick();//trả về 1 naếu kích chuột vào nút OR int Nand_Click();//trả về 1 naếu kích chuột vào nút NAND int Nor_Click();// int Xor_Click();// void Doevent();// ~ToolBar(){delete (button);}; }; //Lớp Menu //node là lớp nguyên tố của lớp Menu class Menu{ public: node *Menuhead,*Menutail,*current; node *Pophead,*Poptail,*subcur; void *Img; Menu(){Menuhead=Menutail=Pophead=Poptail=NULL;}; void InsertPop(int,int,byte,int,char *);//Thêm một node vào MenuPop void InsertMenu(int, int,int,int,char *);//Thêm một node vào Menu void DelMenu();// void Init();//Khởi tạo Menu int ManageBar(); void Draw_Bar(node *p);//Vẽ một node ở menubar void Draw_Pop(node *p);//Vẽ một node ở menupop void ShowBar();//Hiển thị menubar void Show();//Hiển thị Menu void HidePop();//ẩn menupop void ShowPop();//Hiện menupop int DoEvent();//Thi hành sự kiện }; //Lớp thanh cuộn class ScrollBar { public: int left,top,width,height; byte scrup,scrdown;//biến trạng thái int curpos,oldpos;//vị trí cũ và mới của thanh phân cách int indicatorsize;//độ dài thanh phân cách int minvalue,maxvalue;//giá trị lớn nhất và bé nhất mà thanh phân con chạy có thể di chuyển Upbut scrollup;//Mũi tên lên Downbut scrolldown;//Mũi tên xuống ScrollBar(){left=top=width=height=0;}; void Init(int,int,int,int,int);//Khởi tạo void Draw_scrollup();// void Draw_scrolldown(); int Getpos();//Nhận vị trí của con chạy int GetEvent();//Nhận sự kiện void Draw_scrollbar();//Vẽ thanh cuộn void Draw_indicator();//Vẽ con chạy void DoEvent();//Thi hành sự kiện void Show();//Hiện thanh cuộn }; //Lớp Image class Image { public: int left,top,width,height; byte show;//Biến trạng thái char fname[30];//tên file ảnh Image (){left=top=width=height=show=0;}; void Init(int,int,int,int);//Khởi tạo void ChangeIcon(char *s);/Thay đổi file ảnh void Show();//Hiển thị void Hide();//ẩn }; //Lop TrueTable class TrueTable { public: int left,top,width,height; char caption[30]; int N;//Số đầu vào char X[4][17];//Mảng chứa đầu vào char Y[17];//Mảng ra ScrollBar scrbar;//thanh cuộn int value,show;//Biến trạng thái int type;//Kiểu mạch gì AND,OR,NOT... TrueTable() { left=top=width=height=N=show=0; strcpy(caption,"Bảng chân lý"); } void Init(int l,int t,int n);//Khởi tạo void Set_type(int);//Đặt kiểu mạch void Change_in(int);//Thay đổi đầu vào void Draw_invisible();//vẽ phần không nhìn thấy ở trang màn hanình khác void Draw_visible();//Vẽ phần thấy void Show();//Hiện đối tuợng void Hide();//ẩn đối tượng void Setvalue();//Đặt giá trị cho đầu vào void Redraw(int);//Vẽ lại đối tượng int GetEvent();//Nhận sự kiện void DoEvent(); ~TrueTable(); }; //Lop AndImg class AndImg { public: int left,top,width,height;//Vị trí đối tượng trên màn hình SwitchButton in[4];//4 nút chuyển mạch BiButton out;//Nút thể hiện đầu ra byte show; int N;//số đầu vào char fname[30];//tên file ảnh AndImg(){left=top=show=0;height=150;width=112;}; void Init(int,int,int);//Khởi tạo void Draw(); void Show(); void Hide(); int GetEvent(); void DoEvent(); int Drag(); ~AndImg(); }; class InputBox { public: int left,top,width,height; char caption[30]; int cursorx,cursory; CommandButton OK; CloseButton Close; char *Img; int show; InputBox(){left=top=width=height=show=0;}; void Init(int,int,int,int,char *); void Show(); void Hide(); int GetEvent(); int text_click(); void DoEvent(); void show_cursor(); void move_cursor(int,int); char *Input(char *); ~InputBox() { delete(caption); }; }; class TForm { public: int left,top,width,height; char caption[30]; CloseButton close; byte show; TForm(){left=top=width=height=show=0;strcpy(caption,"");}; void Init(int,int,int,int,char *); void Show(); void Hide(); }; class AboutForm:public TForm {public: char *Img; AboutForm():TForm(){}; void Init(int,int,int,int,char *); void Show(); void Hide(); void Move(int,int); int GetEvent(); void DoEvent(); }; class HelpForm:public TForm { public: char *Img; HelpForm():TForm(){}; void Init(int,int,int,int,char *); void Show(); void Hide(); void Move(int,int); int GetEvent(); void DoEvent(); }; class AndForm:public TForm { public: Option option; CommandButton cl,display; AndImg img; TrueTable truetab; Osilo osilo; int N;//so dau vao AndForm():TForm(){}; void Init(int,int,int,int,char *); void Setin(int); void Show(); void Hide(); int GetEvent(); void DoEvent(); }; class App:public TForm { public: Menu menu; AboutForm *about; HelpForm *help; AndForm *and; OrForm *or; NAndForm *nand; NorForm *nor; XorForm *xor; ToolBar toolbar; Image img1,img2; App():TForm(){}; void Init(int l,int t,int w,int h,char *s); void Show(); void Hide(); int GetEvent(); void DoEvent(); int And_Click(); int Or_Click(); int NAnd_Click(); int Nor_Click(); int Xor_Click(); int Not_Click(); int About_Click(); int Help_Click(); ~App() { delete(and);delete(nand);delete(or); delete(nor);delete(xor); }; }; V. Lời Kết: Tuy chương trình đã giải quyết được một số vấn đề trong việc xử lý sự kiện của các đối tượng nhưng do việc xây dựng cơ sở ban đầu là những đối tượng rời rạc không có liên hệ gì với nhau cho nên khi một sự kiện phát sinh ta phải duyệt hết tất cả các đối tượng xem sự kiện này rơi vào đối tượng nào thì để cho đối tượng đó sử lí.Do vậy thời gian cho việc duyệt sẽ lâu hơn. Ta có thể giải quyết vấn đề này bằng cách xây dựng một cấu trúc theo dạng cây nhiều nhánh kết hợp với danh sách liên kết đơn như sau: Một đối tượng lớn nhất chính là ứng dụng của ta.Ta gọi nó là MainApplication(đối tượng cha).Trong đối tượng cha gồm nhiều đối tượng con,mỗi đối tượng con là một nhóm các đối tượng nguyên tố (Group Object). Đối tượng nguyên tố là đối tượng bé nhất chỉ gồm một đối tượng. Hệ thống này được hoạt động theo nguyên tắc sau: Trong một đối tượng nhóm: Các đối tượng nguyên tố gồm một con trỏ (next) trỏ đến phần tử tiếp theo,một con trỏ (parent) trỏ đến cha nó. Tương tự như vậy ,mỗi đối tượng nhóm cũng có một con trỏ next và một con trỏ parent trỏ đến đối tượng MainApplication. Khi xảy ra một sự kiện bất kì(Sự kiện chuột,bàn phím,hay sự kiện do các đối tượng khác sinh ra) thì đối tượng MainApplication nhận sự kiện này( GetEvent()),sau đó nó sẽ sử lý sự kiện để loại ra là sự kiện gì (Mouse,Key,Common) ,tuỳ loại sự kiện mà nó sẽ gửi các sự kiện này đến các đối tượng con.Một sự kiện nếu không có phản ứng với đối twongj con srx được gửi đến cho phần tử kế tiếp.Khi tìm thấy một đối tượng có phản ứng với sự kiện thì đối tượng đó sẽ xử lý sự kiện sau đó phản hồi về cho đối tượng cha nó,đối tượng cha lại phản hồi về cho đối tượng MainApplication.Lúc đó đối tượng MainApplication mới cho phép nhận vào sự kiện mới hay không. Để xử lí các sự kiện một cách linh hoạt phải tổ chức cấu trúc các sự kiện theo kiểu hàng đợi,sự kiện nào xảy ra trước thì phải được sử lý trước,sau khi xử lí song sự kiện này mới sử lí sự kiện tiếp theo,như vậy các sự kiện sẽ không bị chồng nhau. Với cách xử lí như vậy mới có thể đáp ứng cho việc phát triển chương trình thành một ứng dụng lớn.