Სარჩევი:

ათი ბიტიანი კომპიუტერი - VHDL: 4 ნაბიჯი
ათი ბიტიანი კომპიუტერი - VHDL: 4 ნაბიჯი

ვიდეო: ათი ბიტიანი კომპიუტერი - VHDL: 4 ნაბიჯი

ვიდეო: ათი ბიტიანი კომპიუტერი - VHDL: 4 ნაბიჯი
ვიდეო: Fun with Music and Programming by Connor Harris and Stephen Krewson 2024, ივლისი
Anonim
ათი ბიტიანი კომპიუტერი - VHDL
ათი ბიტიანი კომპიუტერი - VHDL

შემქმნელი: ტაილერ სტარი და ეზედდენ გაზალი

შესავალი

ეს პროექტი დასრულდა, როგორც საბოლოო პროექტის ნაწილი CPE 133 Cal Cal SLO– ში. ეს არის დიდი პროექტი მათთვის, ვინც ეძებს იმის გაგებას, თუ როგორ ფუნქციონირებს კომპიუტერები ყველაზე დაბალ დონეზე და როგორ აღწევენ თავიანთ ამოცანებს. პროექტი მოდელირებულია 8 – ბიტიანი SAP კომპიუტერის მიხედვით, რომელიც აღწერილია ალბერტ მალვინოს წიგნში Digital Computer Electronics. თუმცა, ჩვენ გავზარდეთ კომპიუტერი 10-ბიტიანამდე, რათა უფრო მეტი op კოდი (ოპერაციული კოდები) განხორციელდეს. მომხმარებელს შეუძლია კომპიუტერის დაპროგრამება, რომ შეასრულოს მთელი რიგი ოპერაციები გარკვეული მითითებების შეყვანის გზით.

სისტემა და წრიული არქიტექტურა:

კომპიუტერი დაწერილია VHDL– ით და განთავსდება Digilent– ის Basys 3 დაფაზე. შენატანები იქნება დაფარული გადამრთველებში დაფის ბოლოში. ორი ტაქტილური გადამრთველი გამოყენებული იქნება გადატვირთვისა და ჩაწერის ფუნქციებისთვის. გამომავალი გამოჩნდება დაფის 7 სეგმენტის ეკრანზე.

კომპიუტერი დაიშლება პატარა სქემებად (მოდულებად), რომლებიც სხვადასხვა ოპერაციებს მართავენ. თითოეული მოდული დეტალურად იქნება განმარტებული შემდეგ ნაბიჯებში.

ნაბიჯი 1: მასალები

მასალები
მასალები

ამ პროექტისათვის საჭიროა მხოლოდ Basile3 FPGA დაფა Digilent– დან და მიკრო USB მავთული, რომ დააკავშიროთ დაფა თქვენს კომპიუტერს.

ნაბიჯი 2: ბლოკირება სქემა მოდულები

ბლოკის დიაგრამა წრიული მოდულები
ბლოკის დიაგრამა წრიული მოდულები
ბლოკის დიაგრამა წრიული მოდულები
ბლოკის დიაგრამა წრიული მოდულები
ბლოკირება სქემის მოდულები
ბლოკირება სქემის მოდულები

ბლოკ დიაგრამები აჩვენებს სხვადასხვა სქემის მოდულებს, რომლებიც ქმნიან 10 ბიტიან კომპიუტერს. ქვემოთ მოცემულია თითოეული ცალკეული ნაწილის/მოდულის აღწერა ზემოთ მოცემულ დიაგრამაში.

პროგრამის მრიცხველი

შეყვანის აღწერა: შეყვანა არის 5 ბიტიანი შეყვანა პროგრამის მრიცხველში რიცხვის ჩასატვირთად. Cp როდესაც მაღალი მრიცხველი ითვლის საათის კიდეების დაცემას. Clr აღადგენს მრიცხველს 0. Ep როდესაც მაღალი მრიცხველი გამოაქვს მიმდინარე რაოდენობა. Sp როდესაც მაღალი მრიცხველი ადგენს რიცხვს შეყვანისას

  • შედეგების აღწერა:

    გამომავალი არის რიცხვის ასლი LEDS 0-15-ზე გამოსაყენებლად. Count გამოაქვს მიმდინარე რაოდენობა.

  • საერთო ადგილი სისტემაში: ეს მრიცხველი თვალყურს ადევნებს პროგრამის მეხსიერების ადგილს. ყველა პროგრამა იწყებს მეხსიერების მისამართს 00000 (0) და ადის 11111 -მდე (31), თუ არ გამოიყენება გაჩერება. ნახტომის განცხადებებში, პროგრამის მრიცხველი აგრძელებს დათვლას იმ მისამართიდან, რომელზეც გადადის პროგრამა.

შეყვანა MUX

  • შეყვანის აღწერა: მისამართი იღებს შეყვანას 11 – დან 15 – მდე 15. MAR იღებს შეყვანას 10 ბიტიანი რეგისტრიდან, რომელიც გამოიყენება როგორც MAR. პროგრამა აკონტროლებს, თუ რომელი შეყვანისას გამოდის მარშრუტი.
  • აღწერა შედეგები: გამომავალი მარშრუტირებული შერჩეული შეყვანის RAM.
  • საერთო ადგილი სისტემაში: ეს MUX განსაზღვრავს თუ არა მარშრუტის მისამართს გადამრთველებიდან ან ავტობუსიდან RAM- მდე. პროგრამის რეჟიმში გადამრთველების მისამართი მარშრუტიზდება, ხოლო გაშვების რეჟიმში - მისამართი ავტობუსიდან.

ramMUX

  • შეყვანის აღწერა: userInput არის შეყვანა, რომელსაც მომხმარებელი შეიყვანს პროგრამის რეჟიმში. aRegInput არის მონაცემები A რეგისტრში, რომელიც გამოიყენება გადაადგილების ოპერაციის დროს. კონტროლი არის ამ MUX– ის არჩეული.
  • მონაცემების აღწერა: გამომავალი არის 10-ბიტიანი მონაცემების შეყვანა RAM- ში.
  • საერთო ადგილი სისტემაში: ეს MUX გამოაქვს 10-ბიტიანი შეყვანის მონაცემები, რომლებიც გამოიყენება RAM მოდულში. როდესაც საკონტროლო ბიტი მაღალია, MUX გამოაქვს მონაცემები, რომლებიც მომხმარებელმა შეიყვანა პროგრამის რეჟიმში. როდესაც საკონტროლო ბიტი დაბალია, MUX გამოაქვს მონაცემები საკონტროლო ავტობუსზე.

ram მოდული

  • შეყვანის აღწერა: inputData არის მონაცემები, რომლებიც ინახება RAM- ში. inputAddress არის ადგილი, სადაც ინახება მონაცემები. პროგრამა მიუთითებს, არის თუ არა კომპიუტერი პროგრამის ან გაშვების რეჟიმში. readWrite მიუთითებს თუ არა წაკითხვის ან ჩაწერის ოპერაცია. notCE არის RAM მოდულის კონტროლის ბიტი. გადაადგილება მიუთითებს იმაზე, რომ მიმდინარეობს გადაადგილების ოპერაცია.
  • მონაცემების აღწერა: outputDataToBus არის მონაცემები, რომლებიც გადადის ოპერატიული მეხსიერებიდან ავტობუსში. outputData და output მისამართი არის მონაცემები და მისამართი, რომელიც გადადის ინსტრუქციის რეესტრში.
  • საერთო ადგილი სისტემაში: ოპერატიული მეხსიერება იძლევა პროგრამისა და მონაცემების მეხსიერებაში შენახვის საშუალებას პროგრამის გაშვებამდე. პროგრამის გაშვებისთანავე RAM იღებს მისამართს MAR– დან და ამ მისამართის მონაცემებს აგზავნის ავტობუსში.

მისამართი ROM

  • შეყვანის აღწერა: opCode არის შეყვანა, რომელიც შეიცავს ოპ კოდის მისამართს, რომელსაც ასრულებს კომპიუტერი
  • შედეგების აღწერა: opCodeStart არის მეხსიერების მისამართი, რომელიც მიუთითებს შესაბამისი opCode– ის პირველ მიკრო ინსტრუქციის ადგილმდებარეობას.
  • საერთო ადგილი სისტემაში: ეს მოდული იღებს ჩაკეტილ მიკრო ინსტრუქციას და გამოაქვს მეხსიერების მდებარეობა, რომელიც შეესაბამება ამ მიკრო ინსტრუქციის მიმდევრობის დაწყებას.

ringCounter

  • შეყვანის აღწერა: გადატვირთვა ადგენს მრიცხველს 100000 -ზე (პირველი "T მდგომარეობა"). Clk ზრდის მრიცხველს სათითაოდ საათის დაცემაზე. NOP მიუთითებს, რომ მიმდინარე მდგომარეობა/ციკლი არის "არასაოპერაციო" ციკლი.
  • აღწერა შედეგები: რაოდენობა არის გამომავალი counter.
  • საერთო ადგილი სისტემაში: ბეჭდის მრიცხველი აკონტროლებს წინასწარ დასახლებულ მრიცხველს და განსაზღვრავს ექვს მიკრო საფეხურს თითოეულ ინსტრუქციულ ციკლში (T1-T6).

წინასწარი კონტრ

  • შეყვანის აღწერა: opCodeStart არის მეხსიერების ადგილმდებარეობა იმ მიკრო ინსტრუქციებისათვის, რომლებიც ხორციელდება opCode– სთვის. T1 აღადგენს მრიცხველს 0 -ზე, როდესაც ის მაღალია. როდესაც T3 მაღალია, opCodeStart იტვირთება და რაოდენობა გრძელდება ამ ადგილიდან დარჩენილი 3 ციკლის განმავლობაში (T4-T6). Clr ადგენს მრიცხველს 0. Clk ზრდის მრიცხველს ერთით დაცემულ ზღვარზე.
  • Outputs- ის აღწერა: controlWordLocation გამოაქვს შესასრულებელი საკონტროლო სიტყვის მეხსიერების მდებარეობა.
  • საერთო ადგილი სისტემაში: თითოეულ ოპ კოდს აქვს 3 მიკრო ინსტრუქცია. მრიცხველი იზრდება 1 -ით 0 -დან დაწყებული პირველი 3 ციკლისთვის (მოზიდვის ციკლი). შემდეგ მრიცხველი იწყებს ბეჭდის მრიცხველს, რომ ჩატვირთოს მისამართი opCodeStart– ზე და იზრდება 1 – ით დარჩენილი 3 ციკლისთვის. ამ გზით preCounter აკონტროლებს განსახორციელებელი მიკრო ინსტრუქციების თანმიმდევრობას.

კონტროლი ROM

  • შეყვანის აღწერა: controlWordLocation არის controlWord მისამართი, რომელსაც controlROM გამოუშვებს. NOP მიუთითებს, რომ ადგილმდებარეობა არის "ოპერაციის გარეშე" ადგილმდებარეობა.
  • მონაცემების აღწერა: controlWord არის საკონტროლო სიტყვა, რომელიც საშუალებას აძლევს/გამორთავს კომპიუტერის სხვადასხვა მოდულს განახორციელოს სასურველი ოპერაცია.
  • საერთო ადგილი სისტემაში: ეს მოდული ასახავს მეხსიერების ადგილმდებარეობას წინასწარი ანგარიშიდან და გამოაქვს controlWord სასურველი ოპერაციისთვის.

ALU

  • შეყვანის აღწერა: A და B არის შეყვანა A რეგისტრიდან და B რეგისტრიდან, რომელზედაც ALU ასრულებს არითმეტიკულ და ლოგიკურ ოპერაციებს. როდესაც გამოკლება აქტიურია, ეს მიუთითებს იმაზე, რომ B იკლებს A- სგან.
  • შედეგების აღწერა: შედეგი არის A და B დამატების, ან B– ის გამოკლების შედეგი A. გამომავალი შედეგები მეტია ვიდრე ნაკლები და თანაბარია მიუთითოს თუ (AB, ან A = B) და გამოიყენება პირობითი ნახტომის მოდულში. შეცდომა მიუთითებს გადინებაზე ან გადინებაზე, როდესაც აქტიურია.
  • საერთო ადგილი სისტემაში: ALU შეიცავს კომპიუტერის მიერ არითმეტიკული და ლოგიკური ოპერაციების ლოგიკას. ამ მოდულს შეუძლია დაამატოს და გამოაკლოს ორი 10 ბიტიანი ორობითი რიცხვი. ALU– ს ასევე შეუძლია განსაზღვროს A> B, A

პირობითი Jmp

  • შეყვანის აღწერა: inputCount გამოიყენება მიმდინარე რაოდენობის შესაჩერებლად. inputAddress გამოიყენება იმ მისამართის ჩასაკეტად, რომელზეც გადახვალთ. loadFromRegister როდესაც დაბალი latches inputAddress. loadCount როდესაც დაბალი latches inputCount. როდესაც outputEnable დაბალია, გამომავალი მითითებულია იმ მისამართზე, რომ გადავიდეს. უფრო მეტი
  • შედეგების აღწერა: outputJmp არის მისამართი, რომელშიც პროგრამის მრიცხველი წაიკითხავს.
  • საერთო ადგილი სისტემაში: ეს მოდული ამუშავებს კომპიუტერის პირობით და უპირობო ნახტომებს. GT, iT და eQ შეყვანის საფუძველზე, მოდული განსაზღვრავს რომელი პირობის შესამოწმებლად და ეს პირობა მართალია თუ მცდარი. თუ პირობა მართალია, ის გამოაქვეყნებს ინსტრუქციის მისამართს გადასვლისკენ, წინააღმდეგ შემთხვევაში ის გამოაქვეყნებს შემდეგი ინსტრუქციის რაოდენობას.

binToBCD

  • შეყვანის აღწერა: დაითვალეთ 10 ბიტიანი ნომერი ორობითი კოდირებული ათწილადის გადასაყვანად.
  • შედეგების აღწერა: ასობით ციფრი ორობითი რიცხვის ასობით ადგილას. ათობით ციფრი ორობითი რიცხვის ათეულების ადგილას. ერთნიშნა რიცხვი ორობითი რიცხვის ერთეულებში.
  • საერთო ადგილი სისტემაში: ეს მოდული გარდაქმნის 10 ბიტიან ნომერს გამომავალი რეგისტრიდან BCD- ში, რათა ჩვენი ოთხნიშნა ჩვენების დრაივერმა აჩვენოს რიცხვი ათწილადში 7 სეგმენტის ჩვენებაზე.

FourDigitDriver

  • შეყვანის აღწერა: ნომერი არის 16 ბიტიანი ორობითი შეყვანა, რომელიც ამოძრავებს დეკოდერს. inClk არის Basys დაფების შიდა საათი და გამოიყენება საათის გამყოფად. RST აღადგენს საათს, რომელიც გამოიყენება ციფრების მართვისთვის.
  • გამოსავლების აღწერა: ანოდი განსაზღვრავს რომელი ციფრული ადგილი იქნება განათებული. ციფრი არის დეკოდერის შეყვანის ნომერი.
  • საერთო ადგილი სისტემაში: ეს მოდული ამოძრავებს დეკოდერს BCD ნომრის ჩვენებაზე ეკრანზე.

დეკოდირება

  • შეყვანის აღწერა: inputNumber არის ციფრი, რომელიც მოდის მძღოლიდან და რომელიც გაიშიფრება.
  • შედეგების აღწერა: კათოდები განსაზღვრავს რომელი კათოდები იქნება ჩართული სასურველი ციფრის გამოსახატავად.
  • საერთო ადგილი სისტემაში: ეს მოდული აშიფრებს ციფრს, რომელიც უნდა იყოს ნაჩვენები 7 სეგმენტის ეკრანზე.

ოთხი ციფრული ჩვენება

  • შეყვანის აღწერა: ნომერი არის რიცხვი, რომელიც გამოჩნდება 7 სეგმენტის ეკრანზე. შეცდომა მიუთითებს, როდესაც ეკრანზე უნდა წაიკითხოს "Err". Clk არის საათის სიგნალი, რომლითაც ჩვენება მუშაობს. ეს სიგნალი უნდა იყოს დაახლოებით 60 Hz, რათა ეკრანმა ერთდროულად აჩვენოს ოთხივე ციფრული ადგილი.
  • გამოსავლების აღწერა: ანოდი განსაზღვრავს რომელი ციფრული ადგილია ჩართული. კათოდი განსაზღვრავს რომელი კათოდები გააქტიურებულია სასურველი ციფრის გამოსახატავად.
  • საერთო ადგილი სისტემაში: ეს მოდული აჩვენებს რიცხვს 7 სეგმენტის ეკრანზე. იხილეთ Basys 3 დაფის ინსტრუქციის სახელმძღვანელო ინფორმაციისთვის, თუ რომელი კათოდები და ანოდები გააქტიურდება ეკრანის გამოსაყენებლად. როდესაც შეცდომის ბიტი მაღალია, ეკრანზე ჩანს "Err".

გამომავალი

  • შეყვანის აღწერა: progModeInput განსაზღვრავს რომელი led ჩართულია პროგრამირების რეჟიმში. runModeInput განსაზღვრავს რომელი led ჩართულია გაშვების დროს. modeSelect არის შერჩეული ან საკონტროლო ბიტი MUX– ისთვის.
  • აღწერა შედეგები: ledOutput მიუთითებს რომელი led იქნება ჩართული.
  • საერთო ადგილი სისტემაში: იმისდა მიხედვით, თუ რა რეჟიმშია კომპიუტერი (პროგრამა ან რომი), MUX ჩართავს სხვადასხვა led- ებს. პროგრამის რეჟიმში (modeSelect არის '0'), MUX ჩართავს led- ს, რათა დაემსგავსოს მეხსიერების ადგილს, რომელშიც არის კომპიუტერი და რას შეიცავს იგი. გაშვების რეჟიმში (modeSelect არის '1'), MUX გამოიყენება გამართვისთვის, მაგრამ მისი დაყენება შესაძლებელია სხვა რამის ჩვენებაზე.

საათი გამყოფი

  • შეყვანის აღწერა: გაჩერება კითხულობს ავტობუსიდან MSB– ს ხუთ ბიტს, რათა აღმოაჩინოს შეჩერების ბრძანება („11111“) და აჩერებს საათს. inputClk არის Basys 3 დაფის შიდა საათის სიგნალი.
  • შედეგების აღწერა: ouputClk არის ახალი საათი, რომელიც შენელებულია.
  • საერთო ადგილი სისტემაში: ეს საათი გამოიყენება კომპიუტერის შენელებისთვის, რათა მომხმარებელს შეეძლოს განსაზღვროს რა ხდება. საათს შეუძლია გაცილებით სწრაფად იმოძრაოს, თუმცა ის ამჟამად 2 ჰც -ზეა დაყენებული.

triStateBuffer

  • შეყვანის აღწერა: Din არის 5 ბიტიანი შეყვანა, რომელიც შედის ბუფერში. Ep არის საკონტროლო ბიტი.
  • გამოსავლების აღწერა: Dout არის ბუფერის 5 ბიტიანი გამომავალი
  • საერთო ადგილი სისტემაში: როდესაც საკონტროლო ბიტი Ep აქტიურია, ბუფერი გამოაქვს შეყვანა. როდესაც საკონტროლო ბიტი არ არის აქტიური, ბუფერი არაფერს გამოაქვს.

tenBitDRegister

  • შეყვანის აღწერა: Dbus არის შეყვანა, რომლითაც რეგისტრი უნდა იყოს. Clk საშუალებას აძლევს რეგისტრს წაიკითხოს მონაცემები მზარდი საათის ზღვარზე. ARST ადგენს რეგისტრს 0 ასინქრონულად. როდესაც outputEnable დაბალია, რეესტრის შინაარსი არის გამომავალი. როდესაც readIn დაბალია, რეესტრი იჭერს Dbus– ს მზარდი საათის ზღვარზე.
  • შედეგების აღწერა: Qbus არის რეესტრის გამომავალი
  • საერთო ადგილი სისტემაში: რეგისტრი მრავალჯერ გამოიყენება მთელ კომპიუტერში და გამოიყენება ინფორმაციის შესანახად ოპერაციების შესრულებისას.

FiveBitDRegister

  • შეყვანის აღწერა: Dbus არის შეყვანა, რომლითაც რეგისტრი უნდა იყოს. Clk საშუალებას აძლევს რეგისტრს წაიკითხოს მონაცემები მზარდი საათის ზღვარზე. ARST ადგენს რეგისტრს 0 ასინქრონულად. როდესაც outputEnable დაბალია, რეესტრის შინაარსი არის გამომავალი. როდესაც readIn დაბალია, რეესტრი იჭერს Dbus– ს მზარდი საათის ზღვარზე.
  • შედეგების აღწერა: Qbus არის რეესტრის გამომავალი.
  • საერთო ადგილი სისტემაში: რეგისტრი მრავალჯერ გამოიყენება მთელ კომპიუტერში და გამოიყენება ინფორმაციის შესანახად ოპერაციების შესრულებისას.

ნაბიჯი 3: კოდი

ქვემოთ არის საქაღალდე, რომელიც შეიცავს შეზღუდვებს და წყაროს ფაილებს 10 ბიტიანი კომპიუტერისთვის.

ნაბიჯი 4: დემო და საცდელი კოდი

ზემოთ მოყვანილი ვიდეო გვიჩვენებს, თუ როგორ უნდა დაპროგრამდეს 10 ბიტიანი კომპიუტერი Basys 3 FPGA დაფაზე. ქვემოთ მოცემულია PDF ფაილი, რომელიც შეიცავს ოპ კოდებს და პროგრამის ნიმუშს.

გირჩევთ: