最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

【深圳 IO 攻略】第 3 關(guān):脈沖發(fā)生器

2022-05-31 16:12 作者:ココアお姉ちゃん  | 我要投稿

本文首發(fā)于 B 站《深圳 IO》文集(https://www.bilibili.com/read/readlist/rl569860)。原創(chuàng)不易,轉(zhuǎn)載請注明出處。

關(guān)卡展示

這一關(guān)需要讓你在按鈕未按下時(對應(yīng)的輸入信號為 0)保持待命,而在按鈕按下時(對應(yīng)的輸入信號為 100)生成 100×1s,0×1s 的循環(huán)脈沖信號。

這一關(guān)我們需要了解【測試指令】這個新概念。

測試指令一共有 4 條:

  1. teq I1/R1/P1 I2/R2/P2,測試(test)第一個操作數(shù)是否等于(equals)第二個操作數(shù)。若兩數(shù)相等,激活所有帶 + 前綴的指令,關(guān)閉所有帶 - 前綴的指令。若兩數(shù)不等,激活所有帶 - 前綴的指令,關(guān)閉所有帶 + 前綴的指令。

  2. tlt I1/R1/P1?I2/R2/P2,測試第一個操作數(shù)是否小于(lower than)第二個操作數(shù)。若第一個數(shù)小于第二個數(shù),激活所有帶 + 前綴的指令,關(guān)閉所有帶 - 前綴的指令。若第一個數(shù)大于或等于第二個數(shù),激活所有帶 - 前綴的指令,關(guān)閉所有帶 + 前綴的指令。

  3. tgt I1/R1/P1 I2/R2/P2,測試第一個操作數(shù)是否大于(greater?than)第二個操作數(shù)。若第一個數(shù)大于第二個數(shù),激活所有帶 + 前綴的指令,關(guān)閉所有帶 - 前綴的指令。若第一個數(shù)小于或等于第二個數(shù),激活所有帶 - 前綴的指令,關(guān)閉所有帶 + 前綴的指令。

  4. tcp I1/R1/P1 I2/R2/P2,比較(compare)兩個操作數(shù)的大小。該指令和 tgt 指令唯一的區(qū)別是:兩個操作數(shù)相等時,tgt 指令會激活帶 - 前綴的指令,而 tcp 指令會把帶 + - 前綴的指令都關(guān)閉。其余情況下,tcp 指令的表現(xiàn)和 tgt 指令一致。

  5. 帶 + - 前綴的指令會一直保持自己的激活或關(guān)閉狀態(tài),直到遇到下一條測試指令。測試指令前也是可以帶 + - 前綴的,這意味著測試指令不是一定會被執(zhí)行。這屬于高階技巧,以后我們再詳細講解。

舉例說明:

首先,我們測試 p0 端口的值是否為 100。如果是 100,那么后續(xù)?+ 前綴的指令(+ mov 100 p1)將會被執(zhí)行,而?- 前綴的指令(- mov 0 p1)將不會被執(zhí)行,那么 p1 口收到的值很明顯是 100。反之,p0 端口的值不是 100 時,+ 前綴的指令不執(zhí)行,- 前綴的指令正常執(zhí)行,p1 口收到的值就會是 0。

回到這一關(guān),我們需要在按鈕按下時(按鈕端口的值為 100)時生成脈沖方波(使用 gen 指令生成);而在按鈕抬起時(按鈕端口的值為 0)時安心休眠待命(使用 slp 指令)。經(jīng)過以上分析后,這一關(guān)的答案已經(jīng)呼之欲出:

按鈕端口只有 0 和 100 兩種值,我們首先對和按鈕端口相連接的 p0 口執(zhí)行測試指令 tcp p0 50。當(dāng) p0 小于 50 時,按鈕處于抬起狀態(tài),激活 - 前綴的指令,我們需要執(zhí)行休眠指令原地待命(- slp 1);當(dāng) p0 大于 50 時,按鈕處于按下狀態(tài),激活 + 前綴的指令,我們需要不斷執(zhí)行 gen 指令生成 100 和 0 各占一秒的方波(+ gen p1 1 1),直到某刻 tcp 測試指令變?yōu)?- 生效為止。

點擊左下角的【模擬】,稍等片刻,便會彈出結(jié)算界面:

優(yōu)化代碼行數(shù)

這里要提到一個隱藏特性:slp 里的休眠時間,和 gen 里的兩個休眠時間是可以指定為 0 的。

等價于

等價于

我們在同一個時鐘周期里可以反復(fù)給同一個 p 口賦不同的值,當(dāng)前的時鐘周期過去了之后,確認面板上會顯示出對應(yīng) p 口【最后一次】賦的值。所以,我們在同一時鐘周期里給 p0 依次賦值 100 和 0 后,p0 口這一個時鐘周期內(nèi)的實際值只會是 0。

現(xiàn)在,我們要再了解一個新的元件:DX-300。這個原件最多可以同時對 3 個簡單 I/O 口進行讀取或?qū)懭氩僮?,具體的做法和二進制的【位運算】有點相似。

我們先說 DX-300 怎么同時讀三個口的數(shù)據(jù)。我們將 DX-300 的 p0、p1、p2 分別和三個簡單 I/O 口相連,然后另一側(cè)的三個 X 口會實時傳送一個三位數(shù)表示三個簡單 I/O 口的狀態(tài):p0 為 0/100 時,個位數(shù)為 0/1;p1 口為 0/100 時,十位數(shù)為 0/1;p2 口為 0/100 時,百位數(shù)為 0/1。那么 DX-300 的 X 口所傳出的三位數(shù)就有以下 8 種可能:000、001、010、011、100、101、110、111,依次對應(yīng)三個簡單 I/O 的開/關(guān)狀態(tài)的 8 種排列組合。

同時寫三個簡單 I/O 的原理也很類似,我們往 DX-300 的任意一個 X 口寫入以上 8 種三位數(shù)中的一種,就達到了用一條指令同時控制三個簡單 I/O 的目的。比如你想讓 DX-300 的 p0 和 p2 口連接著的端口變?yōu)?100,p1 口連接著的端口變?yōu)?0,那么你就給 DX-300 傳 101 就可以了。

那么這道題,我們怎么優(yōu)化到 1 條指令呢?我們的第一種方案里,芯片里的代碼是這樣的:

然后,我們可以推斷出來,當(dāng)執(zhí)行到【- slp 1】時,p1 口的值一定是 0。由于 gen 指令一定以將對應(yīng) p 口賦 0 終結(jié),所以以上 slp 指令也可以替換成 gen 指令,我們的代碼可以改寫成下面的樣子:

這兩條 gen 指令只有一個操作數(shù)不一樣,那么它們能不能合并成一條呢?答案是可以的。我們不難發(fā)現(xiàn):當(dāng) p0 是 0 時,執(zhí)行的是 gen p1 0 1;當(dāng) p0 是 100 時,執(zhí)行的是 gen p1 1 1。如果我們有一種辦法能把 p0 的 100 轉(zhuǎn)換成 1,那么只要一條 gen p1 (?)?1 指令就夠了,問號處是經(jīng)過轉(zhuǎn)換后的數(shù)字。

這時候,我們的 DX-300 閃亮登場。我們將【按鈕】端口接到 DX-300 的 p0 口上,其余兩個口空著不接(視為對應(yīng)端口的值恒為 0)。這樣,當(dāng)【按鈕】端口的值為 0 時,經(jīng)過 DX-300 加工后為 000;反之,當(dāng)【按鈕】端口的值為 100 時,這個值經(jīng)過 DX-300 加工后會變成 001。這個加工后的值正好是我們需要在 gen 指令中用到的值!

于是,只用一行代碼的設(shè)計方案順利完成!

最終的三項指標為:成本 ¥4,電量 174,代碼行數(shù) 1(比歷史最佳減少了 2 行)


【深圳 IO 攻略】第 3 關(guān):脈沖發(fā)生器的評論 (共 條)

分享到微博請遵守國家法律
蕉岭县| 永年县| 鹤岗市| 灵武市| 吉木萨尔县| 汝州市| 鹤岗市| 天门市| 从化市| 洪泽县| 博湖县| 西充县| 宁远县| 类乌齐县| 和林格尔县| 文水县| 进贤县| 泊头市| 萨迦县| 抚宁县| 南木林县| 德令哈市| 丰宁| 兴业县| 延津县| 洪湖市| 铜陵市| 荆门市| 东丰县| 潜江市| 朝阳市| 贡嘎县| 大埔县| 天全县| 溧水县| 台江县| 青州市| 高尔夫| 呈贡县| 广宗县| 河东区|