[TOC] # 數位邏輯電路基礎知識 ## 重要性 - 數位電路使用離散的電壓水平(例如高電壓和低電壓)來表示數據。這種二進制表示法(0和1)不容易受到噪聲和干擾的影響,因此具有更高的穩定性和可靠性。 - 可編程、可集成性等等其他優勢,可上網自己查 ## 處理器與FPGA - [微處理器基礎](https://hackmd.io/6Rj1vNC5S2ya2y2MNScFbg) - [MCU 與 FPGA](https://hackmd.io/@metal35x/BJamZmpVL) - 亦可見 <手把手教你DSP> - "什麼是DSP" 章節 - 在MCU(CPU)晶片中,固定好的電路形成的是可操控的算術邏輯單元(ALU),直接實現運算 - FPGA晶片中,內部電路形成的是可操控(重新連接輸入與輸出)的邏輯閘,實際上電路沒有變,但形式上開發者每次開發出的功能電路都是不同的邏輯閘編排,如同新電路一樣。 - 以實現加法來說,CPU像是有一個module可以直接做加法,開發者只能用不能改,FPGA則需要使用者自行刻出一個加法器module,加法器具體如何由電路實現完全可以讓開發者自由發揮。 ## 數位電路 ### 組合邏輯電路(Combinatorial logic) - 組合邏輯電路的輸出僅取決於當前的輸入信號,沒有記憶或存儲能力 - 也就是純由一堆邏輯閘形成的電路,一般的加法器、比較器都是。 ### 時序邏輯電路(Sequential logic) - 時序邏輯電路的輸出不僅取決於當前的輸入信號,還取決於先前的輸入狀態,也就是說它具有記憶能力,見 [flip-flop](#latch-與-flip-flop) - 通常包含了時鐘信號,電路的輸出狀態可能會根據時間的推移而變化 -  ## [同步與異步電路](https://medium.com/@joe82512/soc%E8%A8%AD%E8%A8%88%E6%96%B9%E6%B3%95%E8%88%87%E5%AF%A6%E7%8F%BE-2dd997a364d6) - 依時鐘源是否相同做區分 - 通常使用同步電路做設計,設計簡單、可靠,現代數位系統多使用同步電路。 - <font color="red">請記得同步電路這張圖</font> -  ## 同步與異步訊號 - 取決於訊號變為有效狀態時,是否受時鐘clk的[限制](https://blog.csdn.net/XPhp95/article/details/108455056) - 同步與異步復位(reset) - 異步:復位訊號一產生,系統就立即復位 - 同步:復位訊號一產生,須等下一個時鐘延(clk edge)出現,系統才復位。 ## 有限狀態機(Finite State Machine, FSM)概念 - 狀態機教學我只推[天璇](https://youtu.be/1iHzcralz1E) - 狀態機概念也可用在程式設計中,簡化複雜的邏輯判斷 - [verilog實現](##實現狀態機) - ## 其他你應該要知道(先確定這些都知道) ### 類比與數位 ### 布林運算與邏輯閘 ### 進位制 ### 負數與補數 ### latch 與 flip-flop ### 時序圖 - 首先看到反向器的時序圖 -  - 上圖為理想,下圖為現實情況,會產生一個propagation delay,一般時序圖不會特別畫出來 - 考慮JK flip-flop的時序圖 - 一般長這樣 -  - **Q** : 在clk上升瞬間J、Q有變動但都畫在同一條線上,怎麼從JK flip-flop得真值表看出做動原因? - **A** : 可以在心裡把圖看成實際有延遲的樣子,就會看出輸出Q的變動與輸入J和時鐘上升當下的Q有關,也就是我們熟知的JK flip-flop運作方式喔 - 把輸出Q往後移一點 -  # Verilog ## 語法與使用 - 一開始不認識語法可以同時搭配這兩個一起看 - [verilog HDL教學講義](https://hom-wang.gitbooks.io/verilog-hdl/content/index.html),作為筆記用,忘記可翻一翻 - [教學](https://youtube.com/playlist?list=PLuhWBQnV46Q-3oMz33PFSqjhJOvDDVUbJ&si=vjxkgB_RJiQg2Hdy) - 確定以下問題都清楚,能說得出來嗎 - module的概念 - 變數什麼時候用wire,什麼時候用reg,為什麼 - assign、=、<=使用時機,代表什麼意思,blocking、nonblocking是什麼 - always@(),括弧內的變量有什麼功用,always是幹嘛的 - 以上語法代表的概念,你能夠在同步電路示意圖中指出是哪個部份嗎 ## 實現狀態機 - 見[範例](https://www.runoob.com/w3cnote/verilog-fsm.html)或sample code ## testbench撰寫 - [介紹與寫法](https://hackmd.io/@dppa1008/testbench#Testbench-%E4%BB%8B%E7%B4%B9) - [`timescale用法](https://blog.csdn.net/super_haifeng/article/details/50110371) # Quartus與ModelSim Quartus主要用於燒錄用,ModelSim模擬看波型,可以有兩種做法: 1. 只使用Quartus建立專案,在Quartus(或其他編輯器軟體)打好主要的.v檔與testbench,然後從Quartus開啟ModelSim模擬,OK後進燒錄步驟 2. 一開始在ModelSim建立專案,在ModelSim(或其他編輯器軟體)打好主要的.v檔與testbench並進行模擬,都OK後將檔案加入至Quartus,進燒錄步驟 - ModelSim 教學見PPT - Quartus 教學見PPT # 實作 ## 板子 - 使用DE0-CV Board,Cyclone V 5CEBA4F23C7N Device - 請至FTP下載manual ## 流程 1. 思考你的module有哪些輸入輸出 2. 畫出你的狀態機 3. 依狀態機打程式 4. 寫testbench 5. 模擬 6. 燒錄 7. ## hint - 思考一下按鈕事件該如何判斷 - 狀態機的設計全憑開發者,一個系統的狀態機可以不只一個,兩個狀態機可能交互影響對方 # 新訓項目 - [demo](https://youtube.com/playlist?list=PLMZMEiIur5WdNAFBSu73WYQ_LzzhDAegV&si=BdSivlERDIgNvZ9g) ## 項目1 -- 學號顯示 - 功能描述 : - 每按一次按鈕就使7段顯示器依序顯示學號,按reset鍵則都不顯示 ## 項目2 -- 青蛙跳 - 至少完成ver1 - ver1 功能描述 : - 在10顆LED燈上以燈亮作為青蛙在該位置,兩隻青蛙各用一顆按鈕控制。 - 按reset後,兩隻青蛙在最左邊與最右邊(表示最左邊與最右邊的LED燈亮起) - 按下控制左邊青蛙的按鈕,左邊青蛙往右跳1格,按下控制右邊青蛙的按鈕,右邊青蛙往左跳1格。 - 當兩隻青蛙相遇時(兩顆LED相鄰),青蛙跳要跳過對方。 - 當青蛙到達邊緣時,例如,左邊青蛙到達最右邊,再繼續跳的話要回到最左邊。 - ver2 功能描述 : - 兩隻青蛙可以往左跳也可以往右跳 - 多新增2顆按鈕,一隻青蛙對應兩顆按鈕,控制青蛙往左跳或往右跳 - 其他同ver1 ## 新訓項目3 -- QEP - QEP(Quadrature Encoder Pulse)介紹 - 專指DSP中事件管理器內的一個模組電路,該電路功能為對引腳輸入的正交編碼脈衝信號進行譯碼和計數 - 一般用於旋轉編碼器,以獲得其位置和速率信息 - [編碼器與正交編碼脈衝信號](https://youtu.be/Y5HBvbbmW_g) - 思考一下如何從AB相波形判斷應該加1或減1 - 功能描述 : - 使用7段顯示器顯示編碼器計數,需能增加也能減少 - 以下情況擇一自我挑戰 - 1(基礎). - 3個7段顯示器,從0上數直至7段顯示器最高顯示數值(999),回歸到0,從0下數會跳至7段顯示器最高顯示數值(999)再繼續往下數 - 2(進階). - 4個7段顯示器,最左邊的用於顯示正或負,從0下數後顯示負值,從0上數至最高顯示數值(999)後跳至最低顯示數值(-999)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up