一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

代碼是如何控制硬件的?

FPGA技術(shù)江湖 ? 來(lái)源:STM32嵌入式開(kāi)發(fā) ? 2023-05-12 14:19 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

先說(shuō)代碼:我們是用電腦的鍵盤(pán)來(lái)輸入的指令,每一個(gè)指令都對(duì)應(yīng)一個(gè)ASCII碼,而這里的ASCII碼就是有序的電壓的高低(或電流的有無(wú),下面只提電壓的高低),即我們輸入的是電壓的高低,你所看到代碼是這些電壓的高低控制顯示器所顯示的圖像,其實(shí)電腦也不知道它是什么,只知道這樣顯示。

結(jié)論:代碼其實(shí)就是存儲(chǔ)在存儲(chǔ)器(內(nèi)存、硬盤(pán)或者閃存等等)中有序的電壓的高低。

再說(shuō)編譯:

編譯是一個(gè)有序的電壓的高低向另一種有序的電壓高低的一種轉(zhuǎn)換過(guò)程,下面以52單片機(jī)為例,我們編譯是從表示ASCII碼的那種有序電壓高低轉(zhuǎn)換為52單片機(jī)能夠識(shí)別的另一種規(guī)定好的有序電壓高低,即表示HEX文件的電壓高低。

結(jié)論:編譯出的結(jié)果還是電腦中存儲(chǔ)的有序電壓高低。

程序燒錄到單片機(jī):

接下倆就是燒錄,理解了上面兩點(diǎn)就很容易理解下面的內(nèi)容,燒錄就是電腦中的有序電壓高低通過(guò)數(shù)據(jù)線傳輸?shù)絾纹瑱C(jī)中的ROM中。 接下來(lái)ROM就可以釋放其中的電壓來(lái)控制外圍的電路。

總結(jié):從代碼的編輯到最后對(duì)電路的控制都是電壓在起作用,只是為了方面我們而給我們展現(xiàn)的形式不一樣而已,而其本質(zhì)都是電壓,這樣也就不存在轉(zhuǎn)換。

理解這句話(huà):世界上沒(méi)有軟件,軟件只是對(duì)硬件的一種反映,就像意識(shí)是對(duì)世界的一種反映是一樣的!

相信這樣就很容易理解了。

單片機(jī)中的0與1:

只要你提到0/1,提到軟件,這個(gè)問(wèn)題就沒(méi)法理解... 因?yàn)檐浖景?/1】和硬件始終存在一道無(wú)法跨越的鴻溝;

你說(shuō)你在單片機(jī)中寫(xiě)0,請(qǐng)問(wèn)你是如何寫(xiě)0的? 在鍵盤(pán)上敲個(gè)0? 實(shí)際還是電平【和我們理解的數(shù)字沒(méi)關(guān)系】,那個(gè)0只是你在電腦顯示器上電平的呈現(xiàn)形式,那個(gè)所謂的0【實(shí)質(zhì)是電平】可以傳輸?shù)絾纹瑱C(jī)中的ROM中,電平控制電平?jīng)]什么疑問(wèn)吧,這樣就輸出低電平了...

翻開(kāi)數(shù)字電路相關(guān)教材,最前面幾頁(yè)。

一般它都會(huì)告訴你,三極管/場(chǎng)效應(yīng)管類(lèi)似繼電器(一種通過(guò)線圈產(chǎn)生磁場(chǎng)、然后用磁場(chǎng)控制物理開(kāi)關(guān)的通斷與否的設(shè)備); 在它一個(gè)管腳上輸入/切斷電壓信號(hào),另一個(gè)管腳就會(huì)出現(xiàn)高/低電平。

PS:繼電器是一種利用電磁鐵控制的開(kāi)關(guān); 當(dāng)向電磁鐵通電時(shí)就產(chǎn)生磁場(chǎng),而這個(gè)磁場(chǎng)就會(huì)吸合或者分離開(kāi)關(guān),從而實(shí)現(xiàn)“以微弱電流控制另一條電路的通斷”這個(gè)功能。

其中,平常觸點(diǎn)接觸使得被控制電路導(dǎo)通、給控制它的電磁鐵通電后就使得開(kāi)關(guān)斷開(kāi)的那種繼電器,就等效于非門(mén)。 三極管拿來(lái)當(dāng)開(kāi)關(guān)使用時(shí),和這種繼電器效果幾乎一樣。

以上,就是數(shù)字電路的基礎(chǔ)。

指令

你敲入的任何東西,最終就是通過(guò)類(lèi)似的東西/機(jī)制儲(chǔ)存的; 所謂“指令”,其實(shí)就是“某個(gè)命令碼“(一般叫機(jī)器碼),這個(gè)”命令碼”會(huì)改變CPU內(nèi)部一堆“開(kāi)關(guān)”的狀態(tài),以激活不同的電路; 然后數(shù)據(jù)(前面提到過(guò),它也是用三極管/場(chǎng)效應(yīng)管的導(dǎo)通與否“記憶”的)利用類(lèi)似的機(jī)制,被送入這個(gè)被“指令”激活的電路。這些電路是工程師們利用最最基礎(chǔ)的三極管控制原理,用一大堆三極管組合出來(lái)的:當(dāng)數(shù)據(jù)(某種高低電平的組合)經(jīng)過(guò)這些電路后,就會(huì)變成另外一組高低電平的組合:這個(gè)組合剛好和“指令”代表的功能所應(yīng)該給出的結(jié)果一致。

這段話(huà)可能有點(diǎn)難以理解。 那么,看下最簡(jiǎn)單的與門(mén)吧:數(shù)據(jù)有兩個(gè),分別通過(guò)兩條不同的線路進(jìn)入與門(mén); 輸出只有一個(gè),必須給它輸入兩個(gè)高電平,它才會(huì)輸出高電平; 否則就輸出低電平(這一般簡(jiǎn)化表述為:只有輸入兩個(gè)1,它才輸出1,否則輸出0)。

這就是所謂的“與”邏輯; 一組這樣的“與”邏輯就與計(jì)算機(jī)指令/高級(jí)語(yǔ)言里的“按位與”直接對(duì)應(yīng)。

而按位與這個(gè)指令,意思就是選擇一組線路,把數(shù)據(jù)導(dǎo)通到這組“與”邏輯電路之上; 然后這組與邏輯電路就會(huì)輸出兩組數(shù)據(jù)的按位與的結(jié)果。

類(lèi)似的,二進(jìn)制加法,1+1=0(同時(shí)進(jìn)位); 1+0=1;0+1=1;0+0=0:這可以用一個(gè)異或電路來(lái)模擬(因?yàn)楫惢螂娐返囊?guī)則就是1+1=0、1+0=1、0+1=1、0+0=0); 但這樣(同時(shí)進(jìn)位)這個(gè)說(shuō)明就會(huì)丟失了,所以需要同時(shí)用一個(gè)與門(mén)模擬高位進(jìn)位(前面說(shuō)過(guò),與門(mén)就是只有兩個(gè)1才會(huì)輸出1,其它輸出0; 綜合異或的說(shuō)明:這是不是就和二進(jìn)制加法的規(guī)則剛好一致了呢? )

然后更高一位就成了兩根輸入線上的數(shù)據(jù)相加、再加上進(jìn)位數(shù)據(jù)…… 依此類(lèi)推:這就是用開(kāi)關(guān)做加法的思路。

更多位數(shù)的數(shù)字的加法,只不過(guò)是對(duì)應(yīng)位的二進(jìn)制加法再加上前一位的進(jìn)位位罷了,沒(méi)什么特別的,這樣堆起來(lái)的一組開(kāi)關(guān),就叫加法器。

add指令呢,就是選中上面做的那一堆用來(lái)做加法的開(kāi)關(guān)們; 然后給它們輸入數(shù)據(jù)(不要忘了,兩組高低電平而已),這些數(shù)據(jù)就驅(qū)動(dòng)著構(gòu)成加法器的那些開(kāi)關(guān)們,噼里啪啦一陣亂響之后(嗯,如果是老掉牙的繼電器計(jì)算機(jī)的話(huà):還記得BUG的故事嗎? ),電路就穩(wěn)定在某個(gè)狀態(tài)了:此時(shí),加法器的輸出,恰恰就是輸入數(shù)據(jù)的和(當(dāng)然是這樣了。 前面講過(guò),我們是刻意用異或門(mén)和與門(mén)精心組合,讓它們剛好和加法的效果一致)。

其它種種指令,莫不大同小異(更復(fù)雜/高級(jí)的時(shí)鐘、流水線啥的…… 暫時(shí)就無(wú)視吧)

你可以翻翻課本,講過(guò)加法器的實(shí)現(xiàn)。

而加法器和另外一些邏輯電路加起來(lái),就是所謂的ALU(算術(shù)邏輯單元,一下子就高大上了有木有)。 (當(dāng)然了,實(shí)際上沒(méi)這么簡(jiǎn)單。 比如至少還要加上時(shí)鐘信號(hào)來(lái)打拍子協(xié)調(diào)開(kāi)關(guān)們的動(dòng)作、加上鎖存器來(lái)暫存數(shù)據(jù)之類(lèi)。前面提到過(guò),給加法器輸入數(shù)據(jù),構(gòu)成加法器的一堆開(kāi)關(guān)需要噼里啪啦一陣才能進(jìn)入穩(wěn)定態(tài),然后就可以讀出答案:時(shí)鐘信號(hào)就是用來(lái)協(xié)調(diào)這些開(kāi)關(guān),保證它們都能得到足以達(dá)到穩(wěn)定態(tài)的時(shí)間用的)

簡(jiǎn)而言之,代碼在計(jì)算機(jī)內(nèi)部,本身就是一組特定的高低電平組合; 而計(jì)算機(jī)是精心設(shè)計(jì)的、海量的、用高低電平控制通斷的開(kāi)關(guān)組; 當(dāng)給這個(gè)開(kāi)關(guān)組輸入不同的電平組合時(shí),就會(huì)導(dǎo)致它內(nèi)部出現(xiàn)復(fù)雜的開(kāi)關(guān)動(dòng)作,最終產(chǎn)生另外一組高低電平的組合作為輸出; 這些開(kāi)關(guān)動(dòng)作經(jīng)過(guò)精心設(shè)計(jì),使得它的行為是可解釋、可預(yù)測(cè)的——解釋/預(yù)測(cè)的規(guī)則,就是CPU的指令集。

換言之,在機(jī)器內(nèi)部,一切本來(lái)就是高低電平,不存在轉(zhuǎn)換問(wèn)題。

反而是鍵盤(pán)/鼠標(biāo)/mic的輸入要經(jīng)過(guò)機(jī)械過(guò)程到數(shù)字信號(hào)的轉(zhuǎn)換; 而視頻、音頻之類(lèi)的輸出,要經(jīng)過(guò)數(shù)模轉(zhuǎn)換再通過(guò)其它機(jī)制才能變成人可辨識(shí)的信息

圖靈機(jī)原理——CPU的三板斧

圖靈的貢獻(xiàn)就是,他證明了,如果一臺(tái)機(jī)器,可以接受一系列的輸入、并按輸入指示完成運(yùn)算; 那么,當(dāng)這臺(tái)機(jī)器可支持的操作滿(mǎn)足“圖靈完備”的要求時(shí),它就可以模擬任何其它數(shù)學(xué)/邏輯運(yùn)算!

這實(shí)在是太關(guān)鍵了。 要知道,人類(lèi)早就想利用機(jī)械裝置代替一些腦力工作了。 比如說(shuō),算盤(pán),按照口訣機(jī)械的一陣擺弄,答案就出來(lái)了; 還有老外的各種機(jī)械計(jì)算器,比如手搖計(jì)算機(jī)到炮兵用的彈道計(jì)算機(jī)、再到德軍的機(jī)械加/解密機(jī)等等,這種嘗試可以說(shuō)是數(shù)不勝數(shù)。

但,再怎么的,這些東西也只能解決特定的問(wèn)題。 想做能解決全部問(wèn)題的通用機(jī)? 天哪,那得有多復(fù)雜。

而圖靈,就在這時(shí)候,為人類(lèi)指出了一條通向機(jī)械智能的可行道路……

一臺(tái)只會(huì)做加法的機(jī)器,只要能想辦法讓它實(shí)現(xiàn)“連續(xù)做指定次數(shù)加法”,那它就可以模擬一臺(tái)乘法機(jī)(模擬二進(jìn)制乘法會(huì)更容易一些)。 而能夠模擬任何數(shù)學(xué)/邏輯運(yùn)算的機(jī)器,并不比加法機(jī)復(fù)雜太多。

換句話(huà)說(shuō),要搞出一臺(tái)“無(wú)所不能”的計(jì)算機(jī)器,并不需要窮盡一切可能,而是只要支持程序輸入、再支持少的令人發(fā)指的幾條指令,就可以辦到了。

比如說(shuō),CPU,它根本上其實(shí)只會(huì)三招:與、或、非。

與就是全為真,則輸出真; 或是只要一個(gè)為真,則輸出真; 非則是輸入真它就輸出假、輸入假就輸出真,所謂的真假,一般寫(xiě)作1、0,在計(jì)算機(jī)內(nèi)部就是高低電平。

別看CPU只會(huì)這三板斧;可當(dāng)它們巧妙的組合起來(lái)后(構(gòu)造成計(jì)數(shù)器、指令寄存器等等等等再組合成CPU),就達(dá)到了圖靈完備的要求,產(chǎn)生了質(zhì)變。比如,前面提到過(guò)的加法器,就是“如何用這類(lèi)基本邏輯模擬多位二進(jìn)制數(shù)的加法”的一個(gè)實(shí)例。

更具體是怎么做的,這就不是三言?xún)烧Z(yǔ)能說(shuō)清楚的了。還是仔細(xì)看看自己的數(shù)字電路這本書(shū)吧。

數(shù)字電路研究的,就是如何用與或非這三板斧,來(lái)實(shí)現(xiàn)各種高級(jí)運(yùn)算甚至CPU指令集這么復(fù)雜的事物(甚至是直接實(shí)現(xiàn)某些算法,如加密、視頻編碼等等)

而CPU指令集呢,則形成了另外一個(gè)強(qiáng)大得多的圖靈機(jī)(體現(xiàn)在能夠支持更多比原始的與或非更”高階“的操作上):這就是機(jī)器碼(和匯編指令幾乎一一對(duì)應(yīng))

然后呢,諸如c/c++java等高級(jí)語(yǔ)言,就是利用CPU指令集形成的、另一個(gè)更加強(qiáng)大的圖靈機(jī)(編譯器/解釋器負(fù)責(zé)兩種圖靈機(jī)之間的翻譯工作)。

程序員們研究的,就是如何用編程語(yǔ)言這樣一個(gè)強(qiáng)大的圖靈機(jī),去實(shí)現(xiàn)office、photoshop、wow甚至人工智能這樣復(fù)雜的事物。

這是一個(gè)層層模擬的過(guò)程。

總之,開(kāi)關(guān)的通斷是基礎(chǔ);而各種神奇的功能是如何用這么簡(jiǎn)單的東西組合出來(lái)的呢,那就必須理解“程序”原理(也就是圖靈機(jī)原理)了。

如果說(shuō),計(jì)算機(jī)是一個(gè)人,那么,軟件就是他掌握的知識(shí)。這個(gè)知識(shí)使得他不僅能掰著手指頭數(shù)數(shù)(相當(dāng)于硬件直接提供的基礎(chǔ)功能),甚至還可以去洞悉宇宙的奧秘(相當(dāng)于利用軟件“模擬”出來(lái)的、無(wú)窮無(wú)盡的擴(kuò)展功能)。

具體一些,人是怎樣開(kāi)車(chē)的呢?

首先,他要知道車(chē)的控制原理(知識(shí)/軟件);然后,基于這些知識(shí),大腦向他的四肢肌肉發(fā)出神經(jīng)沖動(dòng),驅(qū)使他完成轉(zhuǎn)方向盤(pán)、掛擋、踩離合器/油門(mén)等種種動(dòng)作,最終達(dá)到開(kāi)車(chē)這個(gè)目的。

軟件控制硬件的原理

前面說(shuō)過(guò),程序本身就是高低電平的組合; 它通過(guò)在CPU上執(zhí)行來(lái)模擬各種決策過(guò)程; 同時(shí),計(jì)算機(jī)就是一堆開(kāi)關(guān); 那么,通過(guò)指令向某些地址寫(xiě)出數(shù)據(jù)(訪問(wèn)特定地址是通過(guò)各種尋址機(jī)制/指令完成的,歸根結(jié)底也可以說(shuō)是通過(guò)開(kāi)關(guān)切換,改變了電路拓?fù)洌?,就等于開(kāi)啟/關(guān)閉了對(duì)應(yīng)地址上的某個(gè)開(kāi)關(guān); 這個(gè)開(kāi)關(guān)可以是類(lèi)似CPU內(nèi)部那樣的一組三極管,也可以是通向另外一個(gè)繼電器的信號(hào)線。這個(gè)信號(hào)就促使繼電器閉合,于是電機(jī)導(dǎo)通……

就好象人開(kāi)汽車(chē)一樣,神經(jīng)發(fā)出的微不足道的電脈沖經(jīng)過(guò)肌肉放大,影響了涉及數(shù)百甚至數(shù)千馬力的能量洪流的發(fā)動(dòng)機(jī)/變速箱的運(yùn)轉(zhuǎn),然后汽車(chē)就開(kāi)走了。

計(jì)算機(jī)也一樣:它通過(guò)向控制特定地址上的開(kāi)關(guān)輸出0/1(高低電平),就可以通過(guò)事先準(zhǔn)備的物理設(shè)施驅(qū)動(dòng)諸如航模電機(jī)、舵機(jī)等等機(jī)構(gòu),這就完成了航??刂?。

完整的控制回路甚至可以是:
航模上的傳感器采集飛行姿態(tài)、地形、位置等等數(shù)據(jù)(最終轉(zhuǎn)換成高低電平構(gòu)成的信號(hào))----信號(hào)通過(guò)某些端口送到CPU-----CPU執(zhí)行程序,程序讀取傳感器發(fā)來(lái)的信號(hào),決定下一步的行動(dòng)-----經(jīng)過(guò)程序的智能判斷后,通過(guò)控制特定地址上的開(kāi)關(guān)(前面提過(guò),向這個(gè)地址發(fā)一組高低電平構(gòu)成的數(shù)據(jù)就行了),驅(qū)動(dòng)諸如航模電機(jī)、舵機(jī)等等機(jī)構(gòu), 完成航??刂?。

這,就是所謂的“機(jī)器人”(當(dāng)然,只是最簡(jiǎn)化的機(jī)器人原理而已)。

我們就用代碼展示一下怎么會(huì)顯示低電平:

<以51單片機(jī)舉例>

我把題主的意思先用51單片機(jī)C語(yǔ)言寫(xiě)出來(lái),可以在keil中運(yùn)行的

ba435e1e-f078-11ed-90ce-dac502259ad0.png

好了,題主說(shuō)在單片機(jī)控制里,寫(xiě)0就會(huì)輸出低電平,是這樣的。 題主說(shuō)的輸出低電平就是在其中的一個(gè)引腳上輸出低電平,我想看不懂代碼的人也能夠看到,代碼第七行里,p1.0這個(gè)變量被賦予了0值,那么咱們深入的看一下給他賦0值單片機(jī)內(nèi)部發(fā)生了什么變化。

首先給大家展示一下單片機(jī)一個(gè)引腳內(nèi)部到底是什么東東,如下圖。

ba525874-f078-11ed-90ce-dac502259ad0.png

左邊的大家就不用看了,右邊給大家解釋一下,最右邊的就是引腳了,雖然引腳是一個(gè),但是大家可以看到。

右邊是有兩個(gè)裝置的,上邊的裝置是用來(lái)保持內(nèi)部輸出到引腳的電平不會(huì)被外部的信號(hào)所干擾。 下邊的裝置會(huì)把從外部收集來(lái)的信號(hào)臨時(shí)存儲(chǔ)起來(lái),這里存的不是0就是1。 怎么判斷? 大于某一電壓就是1,小于某一電壓就是0。 這兩個(gè)裝置互不干擾。

第七行的代碼就是將某一引腳輸出低電平并用上邊的保持元件將其維持到低電平。

那么,就有人想問(wèn)了,為什么寫(xiě)成這樣單片機(jī)就會(huì)認(rèn)識(shí)呢? 還會(huì)奇怪為什么單片機(jī)認(rèn)識(shí)的語(yǔ)言和程序員認(rèn)識(shí)的語(yǔ)言一樣呢?

這里就牽扯到了計(jì)算機(jī)組成原理了。 我就簡(jiǎn)單的介紹一下:

首先,我寫(xiě)的這段代碼會(huì)在一個(gè)軟件里運(yùn)行,這個(gè)軟件會(huì)編譯我的代碼形成枯燥難懂但是70年代時(shí)會(huì)被人認(rèn)為高大上的匯編語(yǔ)言,類(lèi)似下圖這樣的(除綠色字部分,解釋用的):

ba691b54-f078-11ed-90ce-dac502259ad0.jpg

這還不夠,形成這樣的語(yǔ)言會(huì)讓計(jì)算機(jī)中的低等編譯器認(rèn)識(shí),低等編譯器會(huì)將代碼翻譯成如下圖所示的東東,如下圖。

ba7de426-f078-11ed-90ce-dac502259ad0.png

注意,這是16進(jìn)制的數(shù),具體怎么轉(zhuǎn)化為二進(jìn)制我就不詳細(xì)展開(kāi)了。 為什么要編譯成圖3的語(yǔ)言再編譯呢?說(shuō)白了我感覺(jué)就是跟水廠一樣,水廠把我制作的水放到一個(gè)通用的大水管里然后通到不同單片機(jī)的家里,單片機(jī)按照自己家的情況把水引到廚房等地。(就是這樣吧 - -)

那么,我們就可以讓單片機(jī)或者叫做計(jì)算機(jī)來(lái)執(zhí)行這段代碼了。

對(duì)不起,現(xiàn)在才進(jìn)入到計(jì)算機(jī)組成原理(對(duì)不起計(jì)組老師)

現(xiàn)如今,大家所用到的計(jì)算機(jī)都是馮諾依曼型計(jì)算機(jī)。

什么是馮諾依曼型計(jì)算機(jī)? 書(shū)上解釋說(shuō):

采取存儲(chǔ)程序的方式讓控制器從存儲(chǔ)器中讀取二進(jìn)制并解釋然后讓運(yùn)算器去計(jì)算數(shù)值。

我來(lái)再解釋一下,首先讓我們了解運(yùn)算器是什么東東,如下圖。

baa8acd8-f078-11ed-90ce-dac502259ad0.png

最下面的就是運(yùn)算器,運(yùn)算器能夠進(jìn)行加減乘除邏輯運(yùn)算,控制器會(huì)從存儲(chǔ)器中讀取數(shù)據(jù)放到上圖運(yùn)算器上邊的框框里,一個(gè)框框放一個(gè)數(shù)據(jù)。

怎么放?

看到左右的兩條道道了嗎? 數(shù)據(jù)會(huì)在控制器的控制下被放到這些框框里,當(dāng)然控制器會(huì)控制最下面的運(yùn)算器做出各種運(yùn)算然后放回到上邊的框框里

那么數(shù)據(jù)是怎么回去的呢?

廢話(huà),當(dāng)然是怎么來(lái)就怎么滾了,通過(guò)左右兩條道道啊親。

讓我們來(lái)解釋一下最開(kāi)始樓主說(shuō)的輸出低電平,上邊的框框有一些是不能隨便放數(shù)據(jù)的,這些框框用來(lái)引出引腳,即有些框框里的數(shù)據(jù)連接著引腳啊親

講到這里,我想我已經(jīng)比較清楚的解釋了0是怎么控制低電平的了。

如果哪些地方?jīng)]講明白,大家可以交流一下,我會(huì)再詳細(xì)講講我理解的一些內(nèi)容。

首先看一下“低電平”是怎么形成的。

bac610b6-f078-11ed-90ce-dac502259ad0.png

可以知道,引腳輸出的電平來(lái)自右下方那一對(duì)互補(bǔ)輸出級(jí)。

所以當(dāng)PMOS關(guān)斷,NMOS導(dǎo)通,那么I/O口輸出低電平。

這個(gè)“控制信號(hào)”來(lái)自單片機(jī)的輸出寄存器(output control)。

那么這個(gè)信號(hào)的根源是怎么來(lái)的呢?

STM32控制器為例

STM32是ARM系列RISC微處理器。

bade5b4e-f078-11ed-90ce-dac502259ad0.png

我們看到I/O的部分鏈接在APB(peripheral bus 外圍總線)上。

看來(lái)這個(gè)信號(hào)就是來(lái)自這個(gè)總線。

不難知道,所有數(shù)據(jù)的調(diào)度都來(lái)自STM32的核心--Cortex-M3.

我們就可以從微處理器如何執(zhí)行指令的角度去看。

bafe4c60-f078-11ed-90ce-dac502259ad0.png

bb169464-f078-11ed-90ce-dac502259ad0.png

實(shí)際上,每一段程序都被保存在ROM里,這個(gè)ROM里保存的就是我們軟件傳達(dá)下來(lái)所賦予的“信息”,微處理器通過(guò)總線在ROM里提取所需要的指令,然后再一定的時(shí)鐘調(diào)配下,最后執(zhí)行指令的。

而指令的實(shí)質(zhì)居然是:

bb5a8e6c-f078-11ed-90ce-dac502259ad0.png

沒(méi)有錯(cuò),mem[]里表述的是地址,而右邊的二進(jìn)制碼“16‘hd000”就是本質(zhì)的0和1的組合,是能夠被機(jī)器識(shí)別的,故稱(chēng)機(jī)器碼。

我這里注釋的是他們分別代表的含義亦即匯編語(yǔ)言。

具體起來(lái),這段"機(jī)器碼"的不同位置的01排序代表不同的含義。 當(dāng)然,這個(gè)含義是約定俗成的,就是指令集嘛!

bb6b50c6-f078-11ed-90ce-dac502259ad0.png

這樣我們知道了,其實(shí)在儲(chǔ)存器里保存的01序列,我們通過(guò)機(jī)器識(shí)別即取指令,可以了解到不同含義,進(jìn)而執(zhí)行不同的操作。

那么這個(gè)儲(chǔ)存器的01序列怎么來(lái)的呢?

bb86716c-f078-11ed-90ce-dac502259ad0.png

一般就儲(chǔ)存原理來(lái)說(shuō),每一個(gè)ROM都是一個(gè)個(gè)小房間,而房間的排列組合就是信息,他們是有序的。 是通過(guò)一定模式或者條件下“燒寫(xiě)進(jìn)去”的。 即使沒(méi)有外部觸發(fā),依舊能保持原有電位。

EEPROM存儲(chǔ)原理

EEPROM基本存儲(chǔ)單元電路的工作原理如下圖所示。 與EPROM相似,它是在EPROM基本單元電路的浮空柵的上面再生成一個(gè)浮空柵,前者稱(chēng)為第一級(jí)浮空柵,后者稱(chēng)為第二級(jí)浮空柵。 可給第二級(jí)浮空柵引出一個(gè)電極,使第二級(jí)浮空柵極接某一電壓VG。 若VG為正電壓,第一浮空柵極與漏極之間產(chǎn)生隧道效應(yīng),使電子注入第一浮空柵極,即編程寫(xiě)入。 若使VG為負(fù)電壓,強(qiáng)使第一級(jí)浮空柵極的電子散失,即擦除。 擦除后可重新寫(xiě)入。

隧道效應(yīng):量子力學(xué)則認(rèn)為,即使粒子能量小于閾值能量,很多粒子沖向勢(shì)壘,一部分粒子反彈,還會(huì)有一些粒子能過(guò)去,好象有一個(gè)隧道,稱(chēng)作“量子隧道(quantum tunneling)”。

bbab9424-f078-11ed-90ce-dac502259ad0.png

那這個(gè)有序的信息就是"0"和“1”的組合。

這個(gè)序列如何燒寫(xiě)進(jìn)單片機(jī),當(dāng)然是有外圍電路啦,具體就是通過(guò)一定的時(shí)序打開(kāi)單片機(jī)的儲(chǔ)存通路,然后把信息燒寫(xiě)進(jìn)去。

如何燒寫(xiě)呢?

JTAG(Joint Test Action Group; 聯(lián)合測(cè)試工作組)是一種國(guó)際標(biāo)準(zhǔn)測(cè)試協(xié)議(IEEE 1149.1兼容),主要用于芯片內(nèi)部測(cè)試。 現(xiàn)在多數(shù)的高級(jí)器件都支持JTAG協(xié)議,如DSP、FPGA器件等。 標(biāo)準(zhǔn)的JTAG接口是4線:TMS、TCK、TDI、TDO,分別為模式選擇、時(shí)鐘、數(shù)據(jù)輸入和數(shù)據(jù)輸出線。

bbc9782c-f078-11ed-90ce-dac502259ad0.png

然后那些高高低低的01信息就這樣在時(shí)序里被輸出、被接收。

接下來(lái)我們說(shuō)軟件。

我們寫(xiě)的軟件都是高級(jí)語(yǔ)言,離機(jī)器很遠(yuǎn),但是很容易被人的邏輯所理解,聰明的我們由一些翻譯官完成更繁雜的工作:

這些翻譯官就是編譯器,比如KEIL,就是把C語(yǔ)言翻譯成匯編語(yǔ)言,再通過(guò)匯編器,把匯編語(yǔ)言變成機(jī)器碼,然后把機(jī)器碼燒寫(xiě)進(jìn)單片機(jī)的ROM,單片機(jī)上電之后,運(yùn)行程序,讀取指令也就是那些信息,然后執(zhí)行,控制IO口的寄存器,最后使IO口接地,哈哈,低電平就這樣完成了。

我們寫(xiě)的軟件經(jīng)過(guò)這幾個(gè)步驟 高級(jí)語(yǔ)言-->匯編語(yǔ)言--->機(jī)器語(yǔ)言。機(jī)器語(yǔ)言是二進(jìn)制的,每一種指令操作都有對(duì)應(yīng)的二進(jìn)制編碼,比如我們執(zhí)行 ADD R1,R2 指令, ADD有一個(gè)唯一的二進(jìn)制編碼假設(shè)為編碼1 ,R1 R2是CPU寄存器地址也有唯一的編碼設(shè)為編碼2 編碼3.這些編碼的具體格式和數(shù)值是根據(jù)指令格式和具體cpu架構(gòu)確定的。比如arm的指令字長(zhǎng)就固定為32位,特定的位代表著條件碼操作碼等。arm的指令可參考《arm 體系結(jié)構(gòu)與編程》杜春雷編。

我們的程序就是以這種二進(jìn)制編碼格式存儲(chǔ)在cpu的存儲(chǔ)器里。

有了這幾個(gè)唯一編碼之后呢?cpu就開(kāi)始譯碼操作,進(jìn)行一些數(shù)字電路的組合運(yùn)算,假設(shè)編碼1是 0x10(只是假設(shè),實(shí)際各個(gè)指令集編號(hào)不同),當(dāng)譯碼電路發(fā)現(xiàn)指令的操作碼是0x10時(shí)就知道是進(jìn)行加法運(yùn)算,此時(shí)會(huì)輸出一個(gè)有效信號(hào)選通加法器;同時(shí)也對(duì)編碼2和編碼3進(jìn)行譯碼,選通對(duì)應(yīng)的寄存器(哪一個(gè)是源寄存器哪一個(gè)是目標(biāo)寄存器是由指令集格式規(guī)定的),然后就將寄存器輸出的數(shù)據(jù)通過(guò)CPU內(nèi)部的數(shù)據(jù)線送入加法器進(jìn)行加法運(yùn)算,運(yùn)算的結(jié)果送入目標(biāo)寄存器。這就運(yùn)行了一個(gè)加法運(yùn)算。

直接回答題主的問(wèn)題,當(dāng)你在程序中對(duì)IO管腳的寄存器寫(xiě)0時(shí),單片機(jī)將通過(guò)類(lèi)似上述的步驟對(duì)指令進(jìn)行譯碼,然后將0這個(gè)數(shù)據(jù)寫(xiě)入到IO管腳寄存器中。寄存器的數(shù)值如何送到對(duì)應(yīng)的IO管腳?一般是通過(guò)D 觸發(fā)器(如圖):

bbe09b42-f078-11ed-90ce-dac502259ad0.png

在單片機(jī)內(nèi)部IO寄存器的數(shù)據(jù)口連接到D觸發(fā)器的D管腳(實(shí)際上還有其他電路,用來(lái)增大驅(qū)動(dòng)能力等),D管腳下面有小三角的管腳是時(shí)鐘信號(hào)管腳,當(dāng)時(shí)鐘信號(hào)上升沿來(lái)臨時(shí),D觸發(fā)器D端口的數(shù)據(jù)將輸出到Q端口,Q端口是連接著外部的管腳的。所以只要IO寄存器不改變,Q管腳將一直保持著高電平或者低電平,即你程序表現(xiàn)出來(lái)的寫(xiě)0就使管腳輸出低電平。

總結(jié)

你的程序編寫(xiě)完后通過(guò)編譯器將變成一堆二進(jìn)制的機(jī)器編碼----->單片機(jī)對(duì)這些編碼進(jìn)行譯碼,知道你要對(duì)哪一個(gè)寄存器進(jìn)行什么樣的操作----->對(duì)應(yīng)的寄存器被寫(xiě)入正確的值,如果是IO管腳的話(huà)將根據(jù)時(shí)鐘將寄存器的值輸出到外部IO管腳。所以實(shí)際上單片機(jī)也就是一堆數(shù)字電路的組合,只不過(guò)我們?nèi)藶榈囊?guī)定什么樣的編碼要進(jìn)行什么樣的操作而已。

cpu內(nèi)部就是一堆門(mén)電路,門(mén)電路導(dǎo)通和閉合對(duì)應(yīng)著輸出為1或者0;那怎么讓它導(dǎo)通呢?用電壓讓它導(dǎo)通,你可以認(rèn)為這個(gè)電壓是一個(gè)能量,用能量驅(qū)動(dòng)這個(gè)道理很通俗了吧。

那你可能又要說(shuō)了,那電壓導(dǎo)通那它輸出是一個(gè)具體的電壓啊它也不是1呀,這個(gè)就是數(shù)電和模電之間的聯(lián)系和區(qū)別了:我們之所以制造數(shù)字電路,是要通過(guò)數(shù)字電路得到一種邏輯實(shí)現(xiàn),而模電才是想得到一個(gè)電壓輸出,這就是模電和數(shù)電的天壤之別。那什么又是邏輯實(shí)現(xiàn)?簡(jiǎn)單的說(shuō)其實(shí)也就是數(shù)學(xué)實(shí)現(xiàn),所謂編程就是把我們的需求變成數(shù)學(xué)問(wèn)題,用編程語(yǔ)言編輯出來(lái),給到cpu,讓它計(jì)算并驅(qū)動(dòng)終端,最終把我們的邏輯顯示出來(lái)。

至于數(shù)模之間的聯(lián)系,它們之間的聯(lián)系就是器件都是靠電壓驅(qū)動(dòng),那你又要問(wèn)了,那么電壓為什么可以驅(qū)動(dòng)半導(dǎo)體器件?well,這個(gè)你要去看電磁場(chǎng)+半導(dǎo)體物理,可能還得看一點(diǎn)量子力學(xué),我也都沒(méi)看呢Orz。

說(shuō)到這總結(jié)一下:我們制造數(shù)字電路,就是想得到一個(gè)能讓我們自由表達(dá)邏輯,并能讓我們眼睜睜看見(jiàn)我們的邏輯實(shí)現(xiàn)了的一個(gè)工具,至于這個(gè)工具是數(shù)字電路,還是量子路,還是光路,只要你低功耗性能好,是啥都無(wú)所謂,最好是真空才好呢,對(duì)人類(lèi)來(lái)說(shuō),空氣都智能了才好呢。

接下來(lái)就要說(shuō)說(shuō)cpu架構(gòu)+指令集。

我們常常聽(tīng)說(shuō),一種cpu架構(gòu)對(duì)應(yīng)著一種指令集,那這是為什么呢?

我們說(shuō)所謂數(shù)字系統(tǒng),其實(shí)很簡(jiǎn)單,你給我輸入,我就給你輸出;你想要什么樣的輸出,那你就要分析分析你要給到我什么樣的輸入我才能輸出你想要看到的輸出,編程也就是這個(gè)過(guò)程;可是問(wèn)題來(lái)了,你隨隨便便給我什么輸入我都hold住嗎?很明顯是hold不住的,這個(gè)例子,我就不舉了。

給這段下個(gè)結(jié)論就是:所謂指令集,其實(shí)就是給cpu這個(gè)數(shù)字系統(tǒng)一套驅(qū)動(dòng)編碼,說(shuō)到這其實(shí)大的框架就差不多了,剩下的比較重要的部分就是布爾代數(shù)和數(shù)學(xué)之間的聯(lián)系,數(shù)學(xué)和實(shí)際需求之間的聯(lián)系,然后就是顯示這一部分,慢慢來(lái)吧。

從高級(jí)語(yǔ)言網(wǎng)下到晶體管開(kāi)關(guān)都有直接的映射關(guān)系,于是代碼就這樣控制硬件了。

詳細(xì)說(shuō)一下,高級(jí)語(yǔ)言可以通過(guò)編譯器轉(zhuǎn)換成匯編語(yǔ)言。匯編語(yǔ)言就是硬件的指令,可以直接轉(zhuǎn)換成0101010101。而這些010101就是電路中的低電平和高電平。這些電平控制開(kāi)關(guān)的打開(kāi)關(guān)斷,于是各種組合就產(chǎn)生了復(fù)雜的邏輯電路。

bbf3390a-f078-11ed-90ce-dac502259ad0.png

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6067

    文章

    44991

    瀏覽量

    650436
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11080

    瀏覽量

    217071
  • 硬件
    +關(guān)注

    關(guān)注

    11

    文章

    3484

    瀏覽量

    67498
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4900

    瀏覽量

    70735
  • 燒錄
    +關(guān)注

    關(guān)注

    8

    文章

    289

    瀏覽量

    36350

原文標(biāo)題:學(xué)習(xí)了,代碼是如何控制硬件的?

文章出處:【微信號(hào):HXSLH1010101010,微信公眾號(hào):FPGA技術(shù)江湖】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何使用MATLAB代碼控制連接到Arduino板的LED

    在 MATLAB 軟件中為 Arduino 設(shè)置硬件支持包后,我們將使用 MATLAB 代碼控制連接到 Arduino 板的 LED。
    的頭像 發(fā)表于 11-16 17:36 ?8456次閱讀
    如何使用MATLAB<b class='flag-5'>代碼</b><b class='flag-5'>控制</b>連接到Arduino板的LED

    單片機(jī)基礎(chǔ):代碼如何控制硬件的?

    繼電器是一種利用電磁鐵控制的開(kāi)關(guān);當(dāng)向電磁鐵通電時(shí)就產(chǎn)生磁場(chǎng),而這個(gè)磁場(chǎng)就會(huì)吸合或者分離開(kāi)關(guān),從而實(shí)現(xiàn)“以微弱電流控制另一條電路的通斷”這個(gè)功能。
    發(fā)表于 02-21 14:43 ?1837次閱讀
    單片機(jī)基礎(chǔ):<b class='flag-5'>代碼</b>如何<b class='flag-5'>控制</b><b class='flag-5'>硬件</b>的?

    基于STM32藍(lán)牙控制小車(chē)系統(tǒng)設(shè)計(jì)(硬件+源代碼+論文)下載

    基于STM32藍(lán)牙控制小車(chē)系統(tǒng)設(shè)計(jì)(硬件+源代碼+論文)推薦下載!
    發(fā)表于 05-29 21:45

    零編碼生成智能硬件APP代碼

    本帖最后由 機(jī)智小編 于 2017-3-29 13:59 編輯 為了降低開(kāi)發(fā)智能硬件APP開(kāi)發(fā)門(mén)檻,降低開(kāi)發(fā)資源的投入,機(jī)智云在《APP開(kāi)源框架》基礎(chǔ)上進(jìn)一步推出了實(shí)現(xiàn)項(xiàng)目完整控制功能的APP
    發(fā)表于 03-29 09:52

    如何優(yōu)化控制算法的代碼

    編者按:在電力電子控制應(yīng)用中,優(yōu)化控制算法的代碼,是開(kāi)發(fā)人員常常要考慮的問(wèn)題。在更多的時(shí)間內(nèi)執(zhí)行更多的算法,就意味著更高的控制頻率和更快的系統(tǒng)響應(yīng)。下面這篇文章來(lái)網(wǎng)絡(luò),很全面的總結(jié)了在
    發(fā)表于 08-30 07:57

    Python控制硬件

    端口,使用 pyvisa 庫(kù)來(lái)控制儀器設(shè)備等。首先,你需要在計(jì)算機(jī)上安裝相應(yīng)的庫(kù),然后就可以使用 Python 代碼來(lái)控制硬件了。例如,如果你要
    發(fā)表于 03-26 19:42

    基于開(kāi)放源代碼硬件設(shè)計(jì)方法研究

    基于開(kāi)放源代碼硬件設(shè)計(jì)方法研究 摘要:可重用性是當(dāng)今超大規(guī)模集成電路設(shè)計(jì)的必要元素。與傳統(tǒng)的封閉源代碼付費(fèi)IP 相比,開(kāi)源硬件以共享設(shè)計(jì)文檔和IP
    發(fā)表于 02-10 13:50 ?9次下載

    基于開(kāi)放源代碼硬件設(shè)計(jì)方法研究

    可重用性是當(dāng)今超大規(guī)模集成電路設(shè)計(jì)的必要元素。與傳統(tǒng)的封閉源代碼付費(fèi)IP 相比,開(kāi)源硬件以共享設(shè)計(jì)文檔和IP 模塊的方式為硬件設(shè)計(jì)的重用提供了更加徹底有效的解決辦法。
    發(fā)表于 04-23 08:40 ?18次下載

    STM32按鍵控制小車(chē)代碼

    好用的stm32小車(chē)代碼,STM32按鍵控制小車(chē)代碼,STM32按鍵控制小車(chē)代碼,STM32按鍵控制
    發(fā)表于 06-08 16:28 ?52次下載

    怎樣僅使用3個(gè)Arduino引腳控制8個(gè)輸出數(shù)量的倍數(shù)所需的硬件代碼

    最后,下面給出了控制引腳的總體代碼,我還附帶了該程序的代碼。因此,在此代碼中,以下引腳設(shè)置為高電平,并且可以使用清除寄存器功能將其復(fù)位。我使用3個(gè)移位寄存器模塊,因此如果使用2個(gè)移位寄
    的頭像 發(fā)表于 11-20 11:09 ?5807次閱讀
    怎樣僅使用3個(gè)Arduino引腳<b class='flag-5'>控制</b>8個(gè)輸出數(shù)量的倍數(shù)所需的<b class='flag-5'>硬件</b>和<b class='flag-5'>代碼</b>

    關(guān)于C程序源代碼是如何在硬件上運(yùn)行的?

    C程序源代碼是如何在硬件上運(yùn)行的?
    的頭像 發(fā)表于 02-05 12:37 ?3238次閱讀

    直流電機(jī)控制代碼

    直流電機(jī)控制代碼(深圳市普德新星電源技術(shù)有限公司官網(wǎng))-?直流機(jī)控制代碼 可以控制直流機(jī)的轉(zhuǎn)速以及正反轉(zhuǎn)
    發(fā)表于 09-28 12:24 ?31次下載
    直流電機(jī)<b class='flag-5'>控制</b><b class='flag-5'>代碼</b>

    代碼如何控制硬件的?

    我們學(xué)習(xí)單片機(jī)時(shí),把代碼編譯后燒錄到單片機(jī)上,單片機(jī)就能控制外設(shè)工作,如LED的亮滅閃爍。
    的頭像 發(fā)表于 02-09 17:21 ?2199次閱讀

    單片機(jī)如何通過(guò)代碼控制硬件:一名工程師的分享

    今天跟大家聊聊單片機(jī)是怎樣通過(guò)代碼來(lái)操控硬件的。作為一名單片機(jī)工程師,我們平時(shí)的工作就像是給單片機(jī)編寫(xiě)“指令集”,讓它按照我們的意圖去驅(qū)動(dòng)各種硬件設(shè)備。
    的頭像 發(fā)表于 03-06 14:46 ?2142次閱讀
    單片機(jī)如何通過(guò)<b class='flag-5'>代碼</b><b class='flag-5'>控制</b><b class='flag-5'>硬件</b>:一名工程師的分享

    手柄控制代碼及使用方法

    手柄控制代碼及使用方法
    的頭像 發(fā)表于 05-15 10:19 ?3293次閱讀