•  找回密碼
     馬上注冊

    QQ登錄

    只需一步,快速開始

    搜索
    查看: 2161|回復: 6
    打印 上一主題 下一主題

    【教程】【粗略】如何使用CPLD搭建一個較簡單的數字邏輯電路?

    [復制鏈接]
    跳轉到指定樓層
    樓主
    發表于 2020-2-2 23:47:53 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
    本帖最后由 氧化鈣 于 2020-2-3 20:06 編輯

    先來個modelsim仿真圖來鎮樓:

    (此教程較適合高中人士學習)
    一、數字電路

    1、啥是數字電路?
    以下內容引自某度百科:

           用數字信號完成對數字量進行算術運算和邏輯運算的電路稱為數字電路,或數字系統。邏輯門是數字邏輯電路的基本單元。存儲器是用來存儲二進制數據的數字電路。從整體上看,數字電路可以分為組合邏輯電路和時序邏輯電路兩大類。

    2、該如何系統地學習?
    (1)詳細的學習資料:《數字電子技術基礎》(第六版)&視頻資料:
    https://www.bilibili.com/video/av62580396?from=search&seid=7590503698226064048
    第三章可以粗略看,因為我們一般是不用這一章的知識去考慮實際問題的。但是TTL電平和COMS電平、OC門和OD門、三態門等要掌握。
    (2)看完你得學會的東西:

    1. 二進制、八進制、十進制、十六進制的轉換
    2. BCD碼是什么?8421BCD呢?
    3. 字節是什么?比特是什么?1B=?bit,即一字節等于多少比特?字長是什么?
    4. 邏輯代數:
    (1) 與、或、非運算的定義以及與門、或門、非門的符號(異或門?同或門?)
    (2) 邏輯代數是什么?它的基本公式與常用公式?
    (3) 邏輯代數的基本定理:代入定理,反演定理,對偶定理
    (4) 邏輯函數什么?它的描述方法有哪些?邏輯函數的“與或”式和“與非與非”式是怎樣的?他們這么互相轉化?
    (5) 怎么把與非門當非門用?
    (6) 邏輯函數怎么用卡諾圖來化簡?(注意5變量卡諾圖的化簡)
    5. 門電路
    (1) OD門和OC門該怎么用?普通的門電路的輸出可以并聯嗎?
    (2) TTL門電路的輸入引腳可以懸空嗎?如果可以,它的懸空腳默認是高電平還是低電平?
    (3) CMOS門電路的輸入引腳可以懸空嗎?如果可以,它的懸空腳默認是高電平還是低電平?
    (4) TTL電路的高低電平分別是多少?CMOS電路的高低電平分別是多少?
    (5) 理解門電路的延時特性
    6. 了解組合邏輯電路的設計
    (1)要求:會把實際問題抽象為邏輯狀態,然后寫出邏輯表達式,最后化簡并會用基本門電路以及一些中規模邏輯電路來組成目標電路。
    (2)注意:a.無關項及其卡諾圖化簡法。
                       b.像那些74HC138的內部電路不需要記,粗略理解工作原理就行。
    7. 半導體存儲電路
    (1) SR鎖存器
    (2) 觸發器
    a. 觸發方式分:電平觸發、脈沖觸發、邊沿觸發
    b. 邏輯功能分:什么是SR觸發器、D觸發器、JK觸發器、T觸發器(只需大概記得它的特征方程或者時序圖)
    8.時序電路的分析方法
    注意:要大致理解一下74HC161的工作原理
    9.注意:脈沖波形的產生和整形之后的基本不用看了,有些東西需要微分方程的

    注:學這些東西是為了更好地了解下面的“可綜合”等關鍵詞、組合電路的組成等知識的,可以酌情跳過或粗略學習!

    二、CPLD的工作原理?
    1、工作原理簡介
         CPLD即complex programable logic device,中文為“復雜可編程邏輯器件”。
         經過上面的學習,聰明的小伙伴就會發現:對于組合電路,所有的邏輯函數都可以化為“最小與或式”的形式,即我們只需要用足夠的與門和或門以及非門,就可以搞定所有邏輯函數所對應的邏輯電路;而對于時序電路,則可以理解為組合電路的基礎上加上一些觸發器。
         接下來讓我們看看CPLD的內部結構:
    如下圖是CPLD內部的一種基本結構“與或門陣列”
    A0、A1是輸入信號,F0、F1是輸出信號。
    (圖片引自CSDN)
           通過設置“與陣列”和“或陣列”中交叉點的連接、斷開,可以得到F(A0,A1)的任意一種組合邏輯表達式。
    故,該電路在硬件不更換的條件下,通過改變交叉點狀態,對應邏輯功能是可以再次改變的,所以稱為可編程邏輯器件(PLD)。這些交叉點的通斷控制有很多實現方式,早期使用紫外線或激光對交叉點進行照射使其熔斷或熔接。現在一般用存儲器的值去控制三極管通斷實現交叉點通斷。所以,對可編程邏輯器件下載配置,實際上可以理解為給存儲器賦值。
           然后,只需要在F0、F1后面加上一些類似于觸發器陣列的東西,理論上我們就可以組成任意的數字電路了。通俗點,就像下圖一樣:
    (圖片引自必應)
           而事實上,CPLD的內部結構是比較復雜的,見下圖:


    (圖片引自必應)
    這只是CPLD里面的一部分,一個CPLD包含很多這些單元。前面一大堆縱橫交錯的東西就是實現與功能的可編程陣列,緊接著這些陣列的就是或門了,然后是可編程的一小部分陣列,再接著的就是觸發器了。觸發器后面的是一些實現單元與單元互連的功能元件,它們可以把經過某個單元之后的信號繼續串到下一個單元或者直接給IO模塊(IO即input/output,輸入輸出)。IO模塊可以選擇普通推挽輸出、三態輸出、開漏輸出等輸出方式。事實上,在實現與功能的可編程陣列之前,是經過了IO模塊的(要不怎么叫IO嘛)。


    2、CPLD的宏單元個數是啥?
    通俗但不嚴謹的講,就是這個CPLD到底有多少個觸發器可以用。

    三、我們用什么給CPLD編程?
    答:Verilog HDL語言。而不是C語言。
    1、推薦書目:夏宇聞的《Verilog數字系統設計教程》,寫的很系統但又不羞澀難懂。
    2、推薦視頻:某寶上搜索正某原子FPGA開發板,店家給了資料下載地址的。
    3、軟件下載方法:微信搜索“軟件安裝管家”,如下圖


    在軟件目錄里面有的,用的是某度的網盤,如果嫌慢的話建議用某度搜索“速盤”。所需軟件:Quartus II 11.0(要用EPM3000/EPM7000系列芯片的話)或Quartus II 11.0以上的版本(不用EPM3000/EPM7000系列芯片)。


    4、說點題外話:
    某點原子的資料是采用ALTERA公司(Intel的子公司)的FPGA進行講解的,開發環境是Quartus II.事實上FPGA的開發方法跟CPLD的開發方法是差不多的(畢竟從某種意義上說,FPGA是CPLD的升級版),只是在把程序下載到芯片的步驟有點不同。另外,Altera公司的產品性價比高,這對我們來說是異常友好的,相比之下的Xilinx公司的產品就有點那啥了。

    四、硬件部分怎么搞?
    1、買就完事了:某寶搜索“EPM240最小系統板”或者”EPM240核心板“,二十幾塊就有一塊了。不過也可以買EPM7032AE等CPLD,EPM240一般是接近十塊的(也有某個店只需4塊多),有點難以焊接;而EPM7032AE只需2塊,而且容易焊接。另外EPM240有240個觸發器,EPM570有570個觸發器,但EPM7032AE只有32個觸發器,不過可以買EPM7064/
    EPM7128等
    別忘了下載器USB-Blaster哦!買這種就有點慢,不過便宜,十幾塊包郵:


    題外話:EPM240有多難焊?EPM7032呢?見下圖(左EPM7032右EPM240):


    2、自己搭
    EPM240的最小系統電路如下:

    EPM7032也差不多:


    注意:a.把那些IO口全引出來就好
    b.晶振要用有源晶振,一般是50MHz的。沒有有源晶振的話,可以在寫程序的時候寫一個這樣的電路(主要是寫個反相器),反相器的輸出端就是震蕩輸出(那些阻容不能用Verilog寫的,要自己外加):

    未完待續......




    分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
    收藏收藏1 分享淘帖 支持支持 反對反對
    沙發
     樓主| 發表于 2020-2-5 17:17:37 | 只看該作者
    本帖最后由 氧化鈣 于 2020-2-5 18:22 編輯

    繼續
    五、CPLD的下載
    1、首先要安裝USB Blaster,詳情某度(某點原子的視頻資料里面也有),然后連接好硬件。注意最小系統板是要單獨供電的,下載器是不會電給板子的。我這里的充電寶就是給板子供電的:

    2、點擊編譯后,就按這個按鈕,就會來到下載界面了:

    3、選擇USB Blaster(安裝了USB Blaster的程序以及連接好硬件才會有此選項的)

    4、添加下載文件(編譯后才有這文件哦)

    5、記得打勾,下載進FPGA時是沒有此步驟的

    6、點擊Start就行了


    六、工程實例
    1、目標:
    看到國外友人用CPLD做的新型DRSSTC驅動(國內對此驅動方式的命名有爭議,就不說出它的名字了,反正不是UD1.3或UD2.x)的搞的TC之后就眼饞了,于是乎就干了起來:

    圖片源自網上,不是我的
    2、器件選擇:
    這個邏輯處理芯片得頂得住5V的反饋信號,輸出也得驅動得了TC442X,經對比,發現EPM7032AETC44-10不錯,便宜小巧又容易焊:
    對于輸入輸出電壓:

    而TC442X:

    (其實是我多慮了,EPM7000A還是能完全工作在5V的邏輯系統的)
    3、程序編寫:
    參照UD1.3B的原理,寫了幾個模塊,其中關鍵的就是邊沿檢測模塊和“計時模塊”了,代碼如下:
    邊沿檢測:
    1. //Title:positive edge detection
    2. //Project:drsstc series
    3. //File:posedge_cap.v
    4. //Targets:EPM series

    5. module posedge_cap
    6. (
    7.     input clk,rst_n,
    8.     input pulse,
    9.    
    10.     output pos_edge
    11.    
    12. );
    13. reg pulse_r1, pulse_r2, pulse_r3;

    14. always @ (posedge clk,negedge rst_n)
    15. if(!rst_n)
    16.     begin
    17.     pulse_r1 <= 1'b0;
    18.     pulse_r2 <= 1'b0;
    19.     pulse_r3 <= 1'b0;
    20.     end
    21. else
    22.     begin
    23.     pulse_r1 <= pulse;
    24.     pulse_r2 <= pulse_r1;
    25.     pulse_r3 <= pulse_r2;
    26.     end
    27.    
    28. assign pos_edge = (pulse_r2 && ~pulse_r3);

    29. endmodule
    復制代碼

    綜合出來大概就是這樣的:

    第一個觸發器是用來同步clk和信號的,第二個和第三個觸發器充當寄存器,當有邊沿跳變信號來的時候,它們的Q端電平是不一致的,進而可以使用組合邏輯電路來搞定。pos_edge就是上升沿來的信號輸出,是輸出持續一個clk周期的高電平的。

    計時模塊:
    1. //Targets:EPM series

    2. module counter(
    3.         input wire  clk,set,
    4.        
    5.         output reg  out,
    6.     output wire _out
    7.        
    8. );

    9. reg[9:0] counter;//1024 posedges

    10. always@(posedge clk or posedge set)
    11. begin
    12.         if(set)
    13.                 begin
    14.                 counter<=10'd700;
    15.                 out<=1'b0;
    16.                 end
    17.         else
    18.                 if(counter==0)
    19.                         begin
    20.                         out<=1'b1;
    21.                         end
    22.                 else
    23.                         begin
    24.                         counter<=counter-(10'b1);
    25.                         out<=1'b0;
    26.                         end
    27. end
    28. not(_out,out);

    29. endmodule
    復制代碼



    這個就不貼綜合之后的電路了,因為得10個觸發器。值得注意的是,那句counter<=10'd700是決定定時時間的,我這里是大概28us(25MHz的時鐘下),適合20KHz以上的DRSSTC使用。如果你的晶振不是25MHz的話,你得改改,關于怎么改,你自己參透這個驅動后就會改了,這個驅動的原理還是挺難講明白的。。。

    然后大概的邏輯框架,CLK25M就是25MHz的有源晶振的輸入:



    4、然后是modelsim仿真:

    說明都在這了:

    然后邏輯延時只有不到8ns(這是后仿真)

    5、然后是板子:
    原理圖:

    6、效果?暫時沒有,東西都在學校,沒法做
    7、源碼以及仿真文件,rtl里面是各模塊的Verilog HDL,dr.vt是仿真文件,dr.pof是下載文件。管腳分配:

    drsstc.zip (4.21 KB, 下載次數: 1)





    [The End 完]



    回復 支持 反對

    使用道具 舉報

    板凳
    發表于 2020-2-7 00:53:34 | 只看該作者
    看上去可以做一個純軟件方案的充電寶,利用單片機控制升壓電路空占比穩壓輸出,也可以利用單片機加比較器線性充電。
    回復 支持 反對

    使用道具 舉報

    地板
     樓主| 發表于 2020-2-7 18:20:45 | 只看該作者
    whseen 發表于 2020-2-7 00:53
    看上去可以做一個純軟件方案的充電寶,利用單片機控制升壓電路空占比穩壓輸出,也可以利用單片機加比較器線 ...

    這個想法不錯,但是這不是單片機哦。這個看起來在編寫程序,但嚴格來講其實不是軟件范疇,而是硬件范疇。

    單片機的電路結構
    是固定的
    ,編寫程序只是改變時序電路的輸入。即“單片機”這個時序電路已經固定了。另外,單片機是串行運行任務的,雖然某些單片機可以“并行”運行幾個任務。
    但是CPLD和FPGA的內部電路是可根據編程修改的,電路結構是可以改變的(這就是硬件范疇)。這兩個都是可以并行多個任務的。當然,也可以運行串行任務。

    或者我理解錯你的意思了,見諒見諒。或許你想說的是可以利用這個開發思想或者這個電路結構來實現電源的某些控制?

    另外,這里貼一些帖子的資料~(由于論壇的附件傳不上來,只能用某度網盤了):

    數電基礎+夏宇聞Verilog:https://pan.baidu.com/s/1Gri0GxYLvqrVZK0oeWGpoQ
    提取碼:vb8s

    某點原子視頻(侵刪):
    https://pan.baidu.com/s/1Tj5R2Ul2qOpCJ1tXIEyq-w
    提取碼:iull

    再次賣廣告:如果嫌慢,請某度搜索“速盤”
    回復 支持 反對

    使用道具 舉報

    5#
    發表于 2020-2-9 12:06:10 來自手機 | 只看該作者
    好,很少見fpga/cpld的教程

    補充內容 (2020-2-14 13:19):
    雖然我也沒有fpga
    回復 支持 反對

    使用道具 舉報

    6#
     樓主| 發表于 2020-2-9 20:27:02 | 只看該作者
    geekgeek 發表于 2020-2-9 12:06
    好,很少見fpga/cpld的教程

    的確,這方面的教程確實比較少。可能是因為一般的應用都可以使用單片機實現的原因吧,能用到的地方少了,教程可能會跟著少
    回復 支持 反對

    使用道具 舉報

    7#
    發表于 2020-2-14 18:40:05 | 只看該作者
    贊一個,雖然初中生看不懂
    回復 支持 反對

    使用道具 舉報

    您需要登錄后才可以回帖 登錄 | 馬上注冊

    本版積分規則

    QQ|極客迷網 ( ICP09011854

    44030602000010

    © 2009-2016 All Rights Reserved

    GMT+8, 2020-12-1 03:24 , Processed in 0.114149 second(s), 35 queries , Gzip On, Memcache On.

    性爱视频在线观看 - 视频 - 在线观看 - 影视资讯 - 悠然网