• 沒有找到結果。

2016泰山高中電子科陳致中二下數位邏輯實習上課講義

N/A
N/A
Protected

Academic year: 2021

Share "2016泰山高中電子科陳致中二下數位邏輯實習上課講義"

Copied!
20
0
0

加載中.... (立即查看全文)

全文

(1)

元件面

GND

+5V

GND

+3V

LED Bar 僅用右邊 8 顆,

採共陰 1 亮,將 LED Bar 換

鍵盤,需套上 3 個短路套

七段.點未接,用圓孔母座

471 排阻(提升電阻),共用點在外側

471 限流排阻

.沒用

10pin,左邊 2 隻沒用

焊接面

元件面

實體展示

SW7 並接按鈕開關

,以便練習防彈跳

+3.3V

朝 CPLD

J1 缺口朝內

缺口朝外,使用

USB 燒錄建議拔除

GND

焊接步驟如下:

1. 先將各腳座插上固定

2. 先焊鍵盤,對齊左上角 PCB

3. 決定子板位置,P21 對齊 LED

4. 指撥開關 SW1 對齊子板 P24

5. 七段和鍵盤平貼,高度隨意

6. 高度則隨便

七段 a~g 建議增加

220 歐姆限流電阻

(2)

註 1:子板接電之前務必先量測 Vcc 與 GND 不可短路,CPLD 是

使用 3.3V,若子板直接使用 5V 會燒毀。

註 2:R1-R4 為 100 歐姆、R5-R8 為 1K 歐姆、J1 缺口與 IC 座方向

要正確,焊錫量『越少越好』

註 3:七段顯示器要注意是共陰(1 亮)

或共陽(0 亮),正面腳位如右圖。

註 4:排阻共用腳均靠外側、大小、

位置都要小心,切勿弄錯,很重要。

註 5:指撥開關 ON 為 1,由於 CPLD 腳位數量不多,僅使用 7 個

開關,SW8 可自行運用,實際電路是並接 SW7 與按鈕開關。

註 6:本學期製作電路子板需使用到三年級(數位電子乙級術科),請小心保管使用,遺失不補發。

請自行將鍵盤背後

螺絲拆開重新排列

須配合短路套使用

P18~12 當做掃描信號, 分別依序送出 1000、 0100、0010、0001。 例如:掃描訊號 1000, 若 P21~19 讀取資料為 010 則表示 4 按下。 穩壓 IC 左邊 GND、中間 3.3V、右 邊 5V,穩壓 IC 壞掉可能造成短路。

(3)

1. A 組上課時間:

2/15(焊接)、3/21、4/11、4/25、5/9、5/23、6/6、6/20

(期末測驗,佔 40%)

2. B 組上課時間:

2/22(焊接)、3/14、3/28、4/18、5/2、5/16、5/30、6/13

(期末測驗,佔 40%)

3. 電路板預計一周內完成焊接,包含 26pin 功能測試都 OK,之後則以電腦操作為主,所以務必完成。

4.

開關

SW1(24) 、SW2(25) 、SW3(26) 、SW4(27) 、SW5(28) 、SW6(29) 、SW7(31)

、 GCLK 固定(43)

LED 接腳

L1(21)、L2(20)、L3(19)、L4(18)、L5(16)、L6(14)、L7(12)、L8(11)

七段顯示器接腳

a(8)、b(33)、c(39)、d(37)、e(34)、f(6)、g(40);

七段

共用腳

dig3(9)千、dig2(5)百、dig1(4)十、dig0(41)

5. 光碟內有 Quartus 軟體請自行在家安裝練習,基本操作

File→New project Wizard…新專案精靈→NEXT

→選擇專案資料夾位置(

建議先建立

)與輸入專案名稱→NEXT→選擇

MAX3000A

的晶片家族,CPLD 編

號: Altera EPM 3064

ALC

44-

10

→NEXT→NEXT→Fisish。 Quartus 專案檔為 XXX.qpf (Quartus Project File)。

6. 新增檔案

File/New/Design Files/Block Diagram(Schematic Files) 繪圖或 VHDL file,按

CTRL+S

儲存檔案;

VHDL 副檔名為

vhd,繪圖檔副檔名為

bdf,波形檔的副檔名為為

vwf;編譯後燒錄副檔名為為

pof。

7. 當繪圖/VHDL 撰寫後,按 CTRL+L 或按

編譯

,可以有警告但不可有錯誤,接著按

腳位定義

,需再

做一次

編譯,最後按

進行

燒錄

,選擇 USB-Blaster,第一個務必勾選→START,看到 100%表示 OK。

8.

一般工具列介紹

※ Quartus 軟體安裝後,USB Blaster 驅動放在

C:\altera\91sp2\quartus\drivers\usb-blaster

※ 無論子板或母板,在結合使用時要確認不可 短路,否則會燒毀。

※ 子板若直接插在母板上要燒錄,需開啟外部

(4)

9.

繪圖工具列介紹 (※使用 Block Diagram 繪圖模式編輯程式時,該工具列才會出現在左側)

10. 波形編輯器工具 (※File→New→Vector Waveform File 時,該工具列才會在左側)

(5)

練習 1:利用圖形燒錄 CPLD 板 26pin 功能測試,每撥一個開關,對應 LED 與七段都亮。

VHDL 架構補充說明 (※程式碼大小寫均可,實體名稱須和『檔案名稱』同,不可用中文)

library 零件庫;

use 零件庫.套件名稱.all;

entity 實體名稱 is

port

(

接腳名稱:輸出入模式 資料型態

--

定義輸入、輸出腳 (※前面加兩個減號表示註解)

);

end 實體名稱 ;

--

註:end 後面的實體名稱可以省略,直接輸入 end;

architecture 架構名稱 of 實體名稱 is

--

註:架構名稱可以任意值或用作者姓名

變數名

begin

撰寫主程式;

end 架構名稱;

--

註:end 後面的架構實體名稱可以省略,直接輸入 end;

1. 硬體描述言(HDL/Hardware Description Language)包含

-

VHDL

(美國軍方規定的 HDL)語法上較嚴謹,參考書本較多,16 進制 Hex 用

X

"1234"表示。

-

Verilog HDL

語法上較容易,比較好入門,副檔名為

.v

-

AHDL

(Altela 發展的 HDL),僅能用在 Altera 的 IC,且 Altera 市佔率不到 30%,16 進制用

H

"1234"表示。

 資料型態包含『

邏輯信號

數值信號

 邏 輯 信 號 包 含 布 林 代 數 (boolean) 、 位 元

(bit) 、標準邏輯(std_logic) 、基本邏輯序列

(bit_vector) 、標準邏輯序列(std_logic_vector)

例如 A:in std_logic_vector(0 to 7)

或 B:in std_logic_vector(7 downto 0);

 數值信號包含整數(integer)(32bit) 、無號數

(unsigned) 、實數(real)

 註解(--)

 指令與變數中間

至少一個空格

以區別

 空白 處 Dbclick, name 欄位直接輸入 input、 output、AND2、NOT→ OK,Dbclick 重新命名。  若 七 段 顯 示 器 要 改 用 『共陰』,應如何修改?

(6)

2. 撰寫程式時,應善用 Tab 鍵,以便上下對齊,凹凸有緻,加註詳細註解,方便日後閱讀程式與複製。

3. Quartus 錯誤會告知第幾行,點擊兩下游標即會跳到錯誤行,但要留意

有時並非該行發生錯誤,而

是前一行尾沒有分號所造成,編譯後若欲返回程式碼,按左側專案區的檔案名稱或上方檔案均可

4. 可利用空白處按右鍵→VHDL Template 樣板→Full Design:XXX→直接修改程式,節省撰寫時間。

練習 2:同練習 1 功能要求,但將繪圖方法改為 VHDL 程式撰寫,可善用 VHDL 內建樣板。

library ieee;

--

library 資料庫,使用的套件寧可多不可少,因為不占空間,並避免編譯時找不到而錯誤

use ieee.std_logic_1164.all ;

--

使用資料型態為 std_logic 或 std_logic_vector 之定義,std= standard 標準

use ieee.std_logic_arith.all ;

--

使用轉換函數套件

use ieee.std_logic_unsigned.all ;

--

使用資料型態為 std_logic_vector 套件的無號數資料,vector 向量

entity in8out8 is

--

電路名稱須和檔案名稱一致,請自行修改

port (

dipsw : in std_logic_vector (6 downto 0);

--

設定輸入腳位名稱(匯流排)

led : out std_logic_vector (6 downto 0);

--

設定輸出腳位名稱

S7 : out std_logic_vector (6 downto 0);

--

使用 bit_vector 亦可,僅 0/1 信號

S7COM : out std_logic_vector (3 downto 0);

--

此範例為共陽,自行修改為共陰

LED8 : out std_logic

--

小心,最後一個不可加分號,單一腳不需 vector

);

end in8out8 ;

--

可省略電路名稱亦可,直接輸入 end;

architecture v1 of in8out8 is

begin

led <= dipsw;

--

兩邊大小要相同,因為開關只有 7 個,所以 LED8 要分開,且開關 ON=1

S7 <= not dipsw;

--

在 VHDL 兩個減號表示註解,NOT 亦可用驚嘆號!表示

S7COM <=

"1111"

;

--

單一信號用單引號表示,匯流排一定要用”雙引號”表示,且長度相符

LED8 <=

'1'

;

--

此 LED 可當電源指示燈,恆亮表示 ON (0 亮、1 不亮)

end v1 ;

--

可省略架構名稱亦可,直接輸入 end;

 所撰寫好程式碼,要如

何查看對應電路圖?

編譯之後,用

Tool→

Netlist view→RTL view

 欲直接複製/貼上下述

範例程式,

實體名稱需

修 改 和 檔 案 名 稱 相

,否則編譯會錯誤。

(7)

練習 3:同時使用繪圖與 VHDL 完成全加、減器電路,含時序圖與燒錄測試都完成再評分。

註 1:全加器 SW1=a、SW2=b、SW3=c;全減器 SW4=e、SW5=f、SW6=g (※全減器可改用 x、y、z 表示)

註 2:

Quartus II 9.1sp2 Web Edition 欲產生模擬波形操作流程如下:

1、 在模擬波形之前都要先按執行編譯

2、

File→New→Vector Waveform File,File→Save 先存檔避免忘記。

3、

Edit

編輯→Insert

插入→Insert Node or Bus…→”Node Finder…”節點發現→Filter

篩選欄位選擇

Pins:all→List

列出清單→>>加入→OK→OK。(※若程式碼輸入/輸出有變更,需重作此步驟)

4、

Edit→End Time

設為 16ms,且

Edit→Grid Size

每小格設為 1ms (※所以現有 16 個 clock 變化)。

5、

View→Fit in Window 或 CTRL+W

填滿整個視窗,當步驟 4 重設,步驟 5 就要重做。

6、 分別點選輸入訊號源,按

→Timing→Multiplied by

設定時脈倍

數變化→確定,例如:a 的 Multiplied 設為

1

、b 設為

2

、c 設為

4

7、 滑鼠點選輸入/出訊號源不放,上下移動至正確觀察位置,直接按

Ctrl+I

開始波形模擬。

8、 若要同步顯示模擬的波形結果,

Processing→Simulator Tool

模擬工

具,選取

9、 同時選取 A(3)、A(2)、A(1)、A(0),按右鍵

Grouping→Group 群組,

變成匯流排訊號,可按 + 展開方便觀察。

註 3:

是指 Counter 計數器,要設定倍數,即每隔

幾次變化一次,亦可使用

colck 時脈,直接輸入設

定週期、工作週期,自行參閱課本 P3-26。

註 4 : Quartus II 編 譯 完 成 後 , 接 著

腳 位 配 置

CTRL+SHIFT+N

,自行參閱課本 P3-30。

註 5:再做一次 CTRL+L 或

編譯,最後按

進行

,先按

選擇加入 USB-Blaster,接

著若直接開啟才需另外按新增檔案

選擇開啟

pof

燒錄檔,僅將第一個務必勾選→START,

當看到 100%表示 OK,自行參閱課本 P3-34。

註 6:未使用腳位若有連接電路,建議看 P3-32 設定。

0 1 0 1 0 1 0 1

0 0 1 1 0 0 1 1

0 0 0 0 1 1 1 1

0 1 0 1 0 1 0 1

0 0 1 1 0 0 1 1

0 0 0 0 1 1 1 1

0 1 1 0 1 0 0 1

0 0 0 1 0 1 1 1

0 1 1 0 1 0 0 1

0 0 1 0 1 0 1 1

全加器 FA

全減器 FS

借位 Borrow=

=

差 Difference=

(8)

練習 4:完成 3 位元加、減法器,不考慮前一級進位,MSB 應在上方(含波形繪製)

 AS=0 作加法 : 101+110=1011、011+110=1001、111+111=1110

AS=1 作減法 : 110-001=0101、001-110=1011 (須按 xxx.vmf 切換,並選擇 AS 為 1 高電位)

(9)

新文京數位邏輯實習程式碼 (※大安高工張義和編著) 課本 P5-14 半加器 HA 電路 (※程式碼不分大小寫) library IEEE; use IEEE.std_logic_1164.all; ---entity HA is

port( A,B:in std_logic;

sum,carry:out std_logic ); end HA; ---architecture X of HA is begin sum <= A xor B; --將信號『指定』到輸出腳用<= carry <= A and B; end X; 課本 P5-15 全加器電路 (※配合 HA 完成,需相同位置) library IEEE; use IEEE.std_logic_1164.all; --- entity CH5_1_4 is port( A,B,Ci:in std_logic;

Sum,Co:out std_logic); end CH5_1_4;

---

architecture Jack of CH5_1_4 is

signal sum1,co1,co2:std_logic; -- signal 為內部”信號”

component HA is --component 為”元件”

port( A,B:in std_logic;

sum,carry:out std_logic );

end component; begin

U1:HA port map(A=>A,B=>B,sum=>sum1,carry=>co1); U2:HA port map(A=>sum1,B=>Ci,sum=>Sum,carry=>co2); Co<=co1 or co2;

end Jack;

--可省略>=直接對應 U2:HA port map(sum1,Ci,Sum,co2);

課本 P5-26 全減器 FS 電路

library IEEE;

use IEEE.std_logic_1164.all; entity CH5_2_4 is

port( A,B,Bi:in std_logic; D,Bo:out std_logic);

end CH5_2_4;

architecture Andy of CH5_2_4 is begin

D <=A xor B xor Bi;

Bo <=(not A and B) or (not A and Bi) or (B and Bi); end Andy; 課本 P5-36 四位元加/減法器電路 (※觀察匯流排波形) library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; --- entity CH5_3_3 is

port( A,B:in std_logic_vector(3 downto 0); Ci,AS:in std_logic;

D:out std_logic_vector(3 downto 0); Co:out std_logic);

end CH5_3_3;

--- architecture Andy of CH5_3_3 is

signal TMP:std_logic_vector(4 downto 0); begin

TMP<='0'&A+B+Ci when AS='0' else

'0'&A-B-Ci; --最左加 0 變 5 位元空間 D<=TMP(3 downto 0); Co<=TMP(4); end Andy; --練習:請設計三位元加減法(不含進位),含波形繪製 課本 P6-9 優先權編碼器 library IEEE; use IEEE.std_logic_1164.all; ---entity CH6_1_3 is

port( I:in std_logic_vector(7 downto 0);

Y:out std_logic_vector(2 downto 0)); end CH6_1_3;

---

architecture Jersey of CH6_1_3 is begin

Y<= "111" when I(7)='1' else --所以 I7優先權最高 "110" when I(6)='1' else --1 個字以上才用雙引號

"101" when I(5)='1' else "100" when I(4)='1' else "011" when I(3)='1' else "010" when I(2)='1' else "001" when I(1)='1' else "000"; end Jersey; 課本 P6-20 3 對 8 解碼器 (即 74138,不含控制腳) library IEEE; use IEEE.std_logic_1164.all; --- entity CH6_2_3_1 is

(10)

port( I:in std_logic_vector(2 downto 0);

Y:out std_logic_vector(7 downto 0)); end CH6_2_3_1; --- architecture Lisa of CH6_2_3_1 is begin with I select Y<= "11111110" when "000", --1 個字以上字串用雙引號 "11111101" when "001", "11111011" when "010", "11110111" when "011", "11101111" when "100", "11011111" when "101", "10111111" when "110", "01111111" when others; end Lisa; --74139 兩組 2 對 4 DECODERS/DEMULTIPLEXERS 課本 P6-22 七段顯示器解碼器 (※利用 SW 做學號顯示) library IEEE; use IEEE.std_logic_1164.all; --- entity CH6_2_3_2 is

port( COM0:out std_logic;

BCD:in std_logic_vector(3 downto 0); SEG:out std_logic_vector(6 downto 0)); end CH6_2_3_2; --- architecture Lisa of CH6_2_3_2 is begin COM0<='0'; with BCD select SEG<= "0000001" when "0000", "1001111" when "0001", "0010010" when "0010", "0000110" when "0011", "1001100" when "0100", "0100100" when "0101", "1100000" when "0110", "0001111" when "0111", "0000000" when "1000", "0001100" when "1001", "1110010" when "1010", "1100110" when "1011", "1011100" when "1100", "0110100" when "1101", "1110000" when "1110", "1111111" when others; end Lisa; --7447/7448 為共陽/共陰七段顯示器解碼器 練習:SW 均 OFF 不顯示,每撥一個 SW 顯示一位學號 課本 P6-24 2 對 1 多工器 (即 74157,不含控制腳) library IEEE; use IEEE.std_logic_1164.all; ---entity CH6_3_1 is

port( I0,I1,S:in std_logic; Y:out std_logic); end CH6_3_1;

---architecture John of CH6_3_1 is begin

Y<= (I1 and S) or (I0 and not S); end John;

--74157 四組 2 對 1 Data Selectors/Multiplexers 課本 P6-26 4 對 1 多工器 (即 74153) library IEEE; use IEEE.std_logic_1164.all; entity CH6_3_2 is

port( I3,I2,I1,I0,S1,S0:in std_logic; Y:out std_logic); end CH6_3_2;

--- architecture John of CH6_3_2 is begin

Y<= (not S0 and not S1 and I0) or (S0 and not S1 and I1) or (not S0 and S1 and I2) or (S0 and S1 and I3); end John; 課本 P6-27 4 對 1 多工器另解 (使用 when else) library IEEE; use IEEE.std_logic_1164.all; --- entity MUX4_2_1 is

port( I:in std_logic_vector(3 downto 0); S:in std_logic_vector(1 downto 0); Y:out std_logic);

end MUX4_2_1;

---

architecture Joy of MUX4_2_1 is begin

Y<= I(0) when "00" else

I(1) when "01" else I(2) when "10" else I(3);

end Joy;

--74153 兩組 4-Line to 1-Line Data Selectors/Multiplexers

2:4 DECODER A1 A2 B1 B2 G1N G2N Y10N Y20N Y13N Y12N Y11N Y21N Y22N Y23N 74139 0 3:8 DECODER A B G1 C G2AN G2BN Y0N Y1N Y2N Y3N Y4N Y5N Y6N Y7N 74138 inst1 MULTIPLEXER 1C1 1GN 1C0 2C0 2GN 2C2 1C2 1C3 B A 2C1 2C3 1Y 2Y 74153 inst9 MULTIPLEXER A1 B1 SEL B2 A3 B3 A2 B4 GN A4 Y2 Y1 Y4 Y3 74157 0

(11)

課本 P6-27 4 對 1 多工器另解 (使用 with select)

library IEEE;

use IEEE.std_logic_1164.all;

--- entity MUX4_2_2 is

port( I:in std_logic_vector(3 downto 0); S:in std_logic_vector(1 downto 0); Y:out std_logic);

end MUX4_2_2;

---

architecture Joy of MUX4_2_2 is begin

with S select

Y<= I(0) when "00", I(1) when "01", I(2) when "10", I(3) when others; end Joy; 課本 P6-29 8 對 1 多工器 library IEEE; use IEEE.std_logic_1164.all; --- entity CH6_3_3 is

port( I:in std_logic_vector(7 downto 0); S:in std_logic_vector(2 downto 0); Y:out std_logic);

end CH6_3_3;

--- architecture John of CH6_3_3 is begin

Y<= I(0) when S="000" else I(1) when S="001" else I(2) when S="010" else I(3) when S="011" else I(4) when S="100" else I(5) when S="101" else I(6) when S="110" else I(7); end John; 課本 P6-31 1 對 2 解多工器 library IEEE; use IEEE.std_logic_1164.all; --- entity CH6_4_1 is

port( I,S:in std_logic;

Y:out std_logic_vector(1 downto 0)); end CH6_4_1;

--- architecture Tony of CH6_4_1 is begin

Y(0)<= not S and I; Y(1)<= S and I; end Tony;

課本 P6-32 1 對 4 解多工器 library IEEE; use IEEE.std_logic_1164.all; ---entity CH6_4_2 is port( I:in std_logic;

S:in std_logic_vector(1 downto 0); Y:out std_logic_vector(3 downto 0)); end CH6_4_2;

---architecture Bob of CH6_4_2 is begin

Y(0)<= I when S="00" else '0'; Y(1)<= I when S="01" else '0'; Y(2)<= I when S="10" else '0'; Y(3)<= I when S="11" else '0'; end Bob; 課本 P6-34 1 對 8 解多工器 library IEEE; use IEEE.std_logic_1164.all; ---entity CH6_4_3 is port( I:in std_logic;

S:in std_logic_vector(2 downto 0); Y:out std_logic_vector(7 downto 0)); end CH6_4_3;

---architecture TOM of CH6_4_3 is begin

Y(0)<= I when S="000" else '0'; Y(1)<= I when S="001" else '0'; Y(2)<= I when S="010" else '0'; Y(3)<= I when S="011" else '0'; Y(4)<= I when S="100" else '0'; Y(5)<= I when S="101" else '0'; Y(6)<= I when S="110" else '0'; Y(7)<= I when S="111" else '0'; end TOM; 課本 P6-37 16 位元比較器 library IEEE; use IEEE.std_logic_1164.all; ---entity CH6_5_2 is

port( A,B:in std_logic_vector(15 downto 0); L,E,G:out std_logic);

end CH6_5_2;

---architecture Sam of CH6_5_2 is begin

G<= '1' when A>B else 'Z'; --Z 代表高阻抗

E<= '1' when A=B else 'Z'; L<= '1' when A<B else 'Z'; end Sam;

(12)

課本 P6-41 八位數多工顯示器 (如何修改為 4 位數?)

library IEEE;

use IEEE.std_logic_1164.all;

--- entity CH6_6 is

port( SCAN:in std_logic_vector(2 downto 0);

SEG,D:out std_logic_vector(7 downto 0)); end CH6_6;

--- architecture Jack of CH6_6 is

constant N7:integer range 0 to 9:=1; --constant 常數

constant N6:integer range 0 to 9:=2; --range 範圍

constant N5:integer range 0 to 9:=3; constant N4:integer range 0 to 9:=4;

constant N3:integer range 0 to 9:=5; --千位數欲顯示的值

constant N2:integer range 0 to 9:=6; --百位數欲顯示的值

constant N1:integer range 0 to 9:=7; --拾位數欲顯示的值

constant N0:integer range 0 to 9:=8; --個位數欲顯示的值

signal bcd:integer range 0 to 9; begin

-- 8 對 1 多工器,若 4 對 1 多工器如何修改?

bcd <= N0 when SCAN="000" else N1 when SCAN="001" else N2 when SCAN="010" else N3 when SCAN="011" else N4 when SCAN="100" else N5 when SCAN="101" else N6 when SCAN="110" else N7;

-- BCD 對七節顯示碼解碼器,即 7447/48 with bcd select --注意上課電路和作者電路不同! SEG <= "00000011" when 0,--0;共陽,所以 0 亮 "10011111" when 1,--1 "00100101" when 2,--2 "00001101" when 3,--3 "10011001" when 4,--4 "01001001" when 5,--5 "01000001" when 6,--6 "00011111" when 7,--7 "00000001" when 8,--8 "00001001" when 9,--9 "11111111" when others; -- 3 對 8 解碼器,若 2 對 4 解碼器如何修改?

with SCAN select --因為使用 PNP,0 電晶體 ON

D <= "11111110" when "000",--D0;亦可改為 when 0, "11111101" when "001",--D1;亦可改為 when 1, "11111011" when "010",--D2;亦可改為 when 2, "11110111" when "011",--D3;亦可改為 when 3, "11101111" when "100",--D4 "11011111" when "101",--D5 "10111111" when "110",--D6 "01111111" when "111",--D7 "11111111" when others; end Jack; 課本 P7-10 R/S 正反器 library IEEE; use IEEE.std_logic_1164.all; ---entity CH7_1_2 is

port( PR,CLR,CLK,S,R:in std_logic; Q:out std_logic); end CH7_1_2; ---architecture Paul of CH7_1_2 is signal TMP:std_logic; begin process(PR,CLR,CLK) --順序性敘述(順序/序向邏輯) begin if PR='0' then TMP <='1'; elsif CLR='0' then TMP<='0';

elsif rising_edge(CLK) then -- rising_edge 正緣

if S='1' and R='0' then TMP<='1'; --Set 設置

elsif S='0' and R='1' then TMP<='0'; --重置

elsif S='1' and R='1' then TMP<=not TMP; else null; end if; end if; Q<=TMP; end process; end Paul; 課本 P7-14 J/K 正反器(即 7473) library IEEE; use IEEE.std_logic_1164.all; --- entity CH7_2_2 is

port( PR,CLR,CK,J,K:in std_logic; Q:out std_logic); end CH7_2_2;

--- architecture Jeff of CH7_2_2 is

signal TMP:std_logic; JK FLIP-FLOPS

1J 1CLRN 1K 1CLK 2J 2CLK 2CLRN 2K 1QN 2Q 2QN 1Q 7473 0

(13)

begin

process(PR,CLR,CK) begin

if PR='0' then TMP<='1'; --PRreset 預置 Q=1

elsif CLR='0' then TMP<='0'; --Clear 清除 Q=0

elsif rising_edge(CK) then

if J='1' and K='0' then TMP<='1'; elsif J='0' and K='1' then TMP<='0'; elsif J='1' and K='1' then TMP<=not TMP;

else null; --null 表示空的,甚麼都不做

end if; end if; Q<=TMP; end process; end Jeff; 課本 P7-18 D 型正反器 library IEEE; use IEEE.std_logic_1164.all; ---entity CH7_3_2 is

port( PR,CLR,CK,D:in std_logic; Q:out std_logic); end CH7_3_2; ---architecture Andy of CH7_3_2 is begin process(PR,CLR,CK) begin if PR='0' then Q<='1'; elsif CLR='0' then Q<='0';

elsif falling_edge(CK) then Q<=D; end if; end process; end Andy; 課本 P7-21 T 型正反器 library IEEE; use IEEE.std_logic_1164.all; ---entity CH7_4_2 is

port( PR,CLR,CK,T:in std_logic; Q:buffer std_logic); end CH7_4_2; ---architecture Jack of CH7_4_2 is begin process(PR,CLR,CK) begin if PR='0' then Q<='1'; elsif CLR='0' then Q<='0';

elsif falling_edge(CK) then -- falling_edge 負緣

if T='1' then Q<=not Q; else null; end if; end if; end process; end Jack; 課本 P7-24 除頻電路 (※多個 F/F 不適於用繪圖方式) library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; ---entity CH7_5 is

port( GCKP18,RSTP61:in std_logic; f1,f2:out std_logic); end CH7_5;

---architecture Nina of CH7_5 is

signal FD:std_logic_vector(25 downto 0);

constant Fs1:integer range 0 to 32:=6; -- f1<=FD(6) 亦可

constant Fs2:integer range 0 to 32:=22; begin f1<=FD(Fs1); --輸出頻率=石英晶體整盪頻率/27 f2<=FD(Fs2); --輸出頻率=石英晶體整盪頻率/223 process(GCKP18,RSTP61) --腳位不同,稱為 GCLK begin if RSTP61='0' then --即 RESET 重置或 CLR 清除 FD<=(FD'range=>'0'); elsif rising_edge(GCKP18) then

FD<=FD+1; end if; end process; end Nina;

-- FD<=(FD'range=>'0')即 FD<=”00..00”,雙引號表示字串 -- 註:GCKP18 在上課晶片是 Pin43,而RSTP61 是 Pin1 補充:用指撥開關控制除頻電路,並轉成元件重複使用 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity freq is

port( GCLK,SW7:in std_logic;

SW:in std_logic_vector(1 to 6); f18,f1823:out std_logic); end freq; CLRN D PRN Q DFF 0

(14)

architecture xx of freq is --任找兩顆 LED 進行測試

signal FD:std_logic_vector(23 downto 1); --注意從 1 開始

begin f18<=FD(18); --輸出固定頻率=4MHz/218 with SW select --輸出可調頻率=4MHz/218~23 f1823<= FD(18) when "100000", --撥越多越慢 FD(19) when "110000", --若撥越多越快 FD(20) when "111000", --應如何修改? FD(21) when "111100", FD(22) when "111110", FD(23) when "111111", '0' when others; process(GCLK,SW7) begin if SW7='1' then --即 RESET 重置或 CLR 清除 FD<=(FD'range=>'0'); elsif rising_edge(GCLK) then

FD<=FD+1; --上數(遞增) end if; end process; end xx; --上述為腳位定義,若要重 複使用並運用於繪圖模式, 則 先 建 立 符 號 檔 File→Create /Update → Create Symbol Files(XXX.bsf

檔),但建議全部複製到另一 資料夾,不要直接再進行另 一電路繪圖,編譯會出錯, 利用繪圖方式練習二上幸 運燈電路(555 用除頻代替)。 兩線若有連接會出現黑點, 表示有連接到,建議都移動 一下確認,匯流排名稱命名 如S[1..6],而且要用匯流排 連線,然後要先編譯第一次 才有腳位選擇。 --若要修改除頻電路程式碼 ,直接點擊兩下元件即可修 改程式。 課本 P7-26 除頻+七段掃描電路(※自行修改為 4 位數) library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; --- entity CH7_6 is

port( GCKP18,RSTP61:in std_logic;

SEG,D:out std_logic_vector(7 downto 0)); end CH7_6; --- architecture Jack of CH7_6 is constant N7:integer:=2; --七段固定顯示 20140628 值 constant N6:integer:=0; --修改固定顯示學號末四碼 constant N5:integer:=1; constant N4:integer:=4; constant N3:integer:=0; constant N2:integer:=6; constant N1:integer:=2; constant N0:integer:=8; signal bcd:integer range 0 to 9; signal SCAN:integer range 0 to 7:=0; signal Scan_f:std_logic;

signal FD:std_logic_vector(25 downto 0); begin -- 除頻器 Scan_f<=FD(6); --掃描頻率=石英晶體整盪頻率/27 process(GCKP18,RSTP61) begin if RSTP61='0' then FD<=(FD'range=>'0'); elsif rising_edge(GCKP18) then

FD<=FD+1; end if; end process; -- 掃瞄電路 process(Scan_f) begin if rising_edge(Scan_f) then SCAN<=SCAN+1; end if; end process; -- 8 對 1 多工器

bcd <= N0 when SCAN=0 else N1 when SCAN=1 else N2 when SCAN=2 else N3 when SCAN=3 else N4 when SCAN=4 else N5 when SCAN=5 else N6 when SCAN=6 else N7 ; -- BCD 對七節顯示碼解碼器,留意小數點沒用如何修改 with bcd select SEG <= "00000011" when 0,--0 "10011111" when 1,--1 "00100101" when 2,--2 "00001101" when 3,--3

(15)

"10011001" when 4,--4 "01001001" when 5,--5 "01000001" when 6,--6 "00011111" when 7,--7 "00000001" when 8,--8 "00001001" when 9,--9 "11111111" when others; -- 3 對 8 解碼器

with SCAN select --注意共陽或共陰,且只有 4 顆七段

D <= "11111110" when 0,--D0 "11111101" when 1,--D1 "11111011" when 2,--D2 "11110111" when 3,--D3 "11101111" when 4,--D4 "11011111" when 5,--D5 "10111111" when 6,--D6 "01111111" when 7,--D7 "11111111" when others; end Jack; 補充:用 VHDL 完成四位數七段 0000~9999 計數器 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; --- entity Seg7_FixedDisplay is

port( GCLK43,SW7:in std_logic; SW:in std_logic_vector(1 to 6); SEG:out std_logic_vector(0 to 6); D:out std_logic_vector(3 downto 0)); end Seg7_FixedDisplay;

---

architecture xx of Seg7_FixedDisplay is signal bcd:std_logic_vector(3 downto 0);

--bcd 不可以是整數,因為無法對應送出 4bits 資料

signal SCAN:integer range 0 to 3; signal Scan_f,SW_f:std_logic;

signal FD1:std_logic_vector(14 downto 0);

--正反器若再大一點,會超過晶片容量大小,編譯會出 錯,所以只設兩個開關練習,FD1 是用來除頻,FD2 是 用 16 個正反器儲存 0000~9999(BCD)值,所以一定為 16bits signal FD2:std_logic_vector(15 downto 0);

begin -- 除頻器 Scan_f<=FD1(12); --掃描頻率=4MHz/213 process(GCLK43) begin if rising_edge(GCLK43) then FD1<=FD1+1; SW_f<= '0'; --先停止計數,再判斷開關

if SW="100000" then SW_f<=FD1(13); end if; if SW="110000" then SW_f<=FD1(14); end if;

end if; end process; -- 七段掃瞄電路,相當於繪圖的 7473 除 4 功能 process(Scan_f) begin if rising_edge(Scan_f) then SCAN<=SCAN+1; end if; end process; -- 0000~9999 電路,相當於繪圖的 74390*2 功能 process(SW_f,SW7) begin if SW7='1' then --即 RESET 重置或 CLR 清除 FD2<=(FD2'range=>'0'); elsif rising_edge(SW_f) then

IF FD2 = X"9999" THEN FD2 <= X"0000";

ELSIF FD2(11 downto 0) = X"999" THEN FD2 <= FD2+X"0667"; ELSIF FD2(7 downto 0) = X"99" THEN FD2 <= FD2 + X"0067"; ELSIF FD2(3 downto 0) = X"9" THEN FD2 <= FD2 + X"0007"; ELSE FD2 <= FD2 + 1; --BCD 加法若超過 9 需再+6 修正,因為遞增+1,所以+7 end if; end if; end process; -- 4 對 1 多工器,相當於繪圖的 74153*2 功能

bcd <= FD2(3 downto 0) when SCAN=0 else FD2(7 downto 4) when SCAN=1 else FD2(11 downto 8) when SCAN=2 else FD2(15 downto 12) ; -- BCD 對七節顯示碼解碼器,相當於繪圖的 7447 功能 with bcd select SEG <= "0000001" when "0000",--0 "1001111" when "0001",--1 "0010010" when "0010",--2 "0000110" when "0011",--3 "1001100" when "0100",--4 "0100100" when "0101",--5 "0100000" when "0110",--6 "0001111" when "0111",--7 "0000000" when "1000",--8 "0000100" when "1001",--9 "1111111" when others; -- 2 對 4 解碼器,相當於繪圖的 74139 功能

with SCAN select --注意共陽或共陰

D <="0001" when 0,--D0 "0010" when 1,--D1 "0100" when 2,--D2 "1000" when 3,--D3 "0000" when others; end xx; 註 1:並行工作敘述:如 When-else、With-select。 註 2:循序工作敘述(必須工作在 process 內):如 If-then-else、Case-is-when、While-loop、For-loop。

若編譯出現 Error:Can’t place node…..type

max_mecll,請調整頻率輸出位置幾次。

(16)

補充:改用繪圖方式完成四位數 0000~9999 計數器 (除頻符號+七段顯示器練習,此即為數位電子乙級第一題)

註 1:7473

為 JK 正反器,做 MOD-4,當作七段的位置掃描信號,74390

內建兩組 MOD-10 電路,74153

內建兩組 4 對 1 多工器。

註 2:數位電子乙級第一題類似上述電路,但除頻電路、74139 七段顯示掃描電路、7447 共陽七段解碼

器均不用,因為都已經內建於測試機台內,是不是很簡單呢?

註 3:另外上課的七段 dig0~3 順序和考試時相反、74139 輸入端為 BA,即 1Q=B=S1、2Q=A=S0。

註 4:CLK 多利用兩個 D F/F 用內建的 4MHz 同步,以解決數字偶爾會亂跳現象。

(17)

課本 P8-8 四位元下數計數器電路(先建立除 2 元件)

library IEEE;

use IEEE.std_logic_1164.all;

---entity DIV2 is

port( CLR, CK :in std_logic; Q :out std_logic); end DIV2;

---architecture Charles of DIV2 is signal TMP:std_logic; begin

process(CLR,CK) begin

if CLR='0' then TMP <= '0'; elsif rising_edge(CK) then

TMP <= not TMP; --只要觸發就改變狀態 end if; end process; Q <= TMP; end Charles; library IEEE; use IEEE.std_logic_1164.all; --- entity MOD16 is

port( CLR, CK :in std_logic;

Q :out std_logic_vector(3 downto 0)); end MOD16;

--- architecture Charles of MOD16 is

signal TMP:std_logic_vector(3 downto 0); component DIV2

port( CLR, CK :in std_logic; Q :out std_logic); end component;

begin

U1: DIV2 port map(CLR, CK, TMP(0));

U2: for i in 1 to 3 generate--generate 產生 3 個元件

lp: DIV2 port map(CLR, TMP(i-1), TMP(i)); end generate U2;

Q <= TMP; --即 Q <= TMP(3); end Charles; --異步計數器若欲改變狀態(J,K 接 Hi 或 T 接 Hi 或 D 接𝑄) --上數---負緣觸發且 Q 接 CK 或 正緣觸發且𝑸接 CK --下數---負緣觸發---且𝑄接 CK 或 正緣觸發且 Q 接 CK 課本 P8-16 四位元上/下數計數器電路 library IEEE; use IEEE.std_logic_1164.all; --- entity MOD16 is

port( CLR, CK, UDC:in std_logic;

Q:out std_logic_vector(3 downto 0)); end MOD16;

--- architecture Charles of MOD16 is

signal TMP:std_logic_vector(3 downto 0); signal XOR_TMP:std_logic_vector(2 downto 0); component DIV2

port( CLR, CK :in std_logic; Q :out std_logic); end component;

begin

U1: DIV2 port map(CLR, CK, TMP(0)); U2: for i in 1 to 3 generate

XOR_TMP(i-1) <= TMP(i-1) xor UDC;

lp:DIV2 port map(CLR, XOR_TMP(i-1), TMP(i)); end generate U2;

Q <= TMP; end Charles;

--74191 同步 Synchronous 4-Bit Up/Down Counter

COUNTER LDN D C B A CLK DNUP GN RCON MXMN QA QB QD QC 74191 0

(18)

課本 P8-18 多位元上/下數計數器電路

library IEEE;

use IEEE.std_logic_1164.all;

--- entity MOD16 is

generic(N : integer := 2); -- generic 通稱

port( CLR,CK,UDC:in std_logic;

Q:out std_logic_vector(N downto 0)); end MOD16;

--- architecture Amy of MOD16 is

signal TMP:std_logic_vector(N downto 0); signal XOR_TMP:std_logic_vector(N-1 downto 0); component DIV2

port( CLR, CK :in std_logic; Q :out std_logic); end component;

begin

U1: DIV2 port map(CLR,CK, TMP(0)); U2: for i in 1 to N generate

XOR_TMP(i-1) <= TMP(i-1) xor UDC; lp: DIV2 port map(CLR,XOR_TMP(i-1), TMP(i));

end generate U2; Q <= TMP; end Amy; --constant 常數,宣告於 architecture 區塊中 --generic 通稱,宣告於 entity 區塊中,範圍較廣,方便 將來程式彈性修改,若改變寬度僅需修改一行即可。 課本 P8-20 除 12 電路(即 7492) library IEEE; use IEEE.std_logic_1164.all; --- entity MOD12 is

port( CLR, CK:in std_logic;

Q:out std_logic_vector(3 downto 0)); end MOD12;

--- architecture Amy of MOD12 is

signal TMP:std_logic_vector(3 downto 0); signal CLR_TMP:std_logic;

component DIV2

port( CLR, CK :in std_logic; Q :out std_logic); end component;

begin

CLR_TMP <='0' when ( CLR='0' or TMP>="1100" ) else '1'; U1: DIV2 port map(CLR_TMP, CK, TMP(0));

U2: for i in 1 to 3 generate

lp: DIV2 port map(CLR_TMP,TMP(i-1), TMP(i)); end generate U2;

Q <= TMP; end Amy;

--74390 兩組 4-BIT DECADE AND BINARY COUNTERS 除 10

--建立符號檔File→Create /Update→Create Symbol Files(XXX.bsf檔),放相同資料夾可重複混合引用(優點) 補充:鍵盤掃描(含防彈跳技巧)+七段顯示器練習 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; --- entity Seg7_FixedDisplay is

port( GCLK43:in std_logic;

key1_3:in std_logic_vector(0 to 2); SEG:out std_logic_vector(0 to 6);

D,key4_7:out std_logic_vector(3 downto 0)); end Seg7_FixedDisplay;

---

architecture xx of Seg7_FixedDisplay is signal bcd:std_logic_vector(3 downto 0); signal kscan:std_logic_vector(1 downto 0); signal scan:integer range 0 to 3;

signal scan_f,kscan_f:std_logic;

signal FD1:std_logic_vector(17 downto 0); signal FD2:std_logic_vector(15 downto 0); signal keyin:std_logic; --當作鍵盤輸入偵測 signal sq,sqd,pulse:std_logic; --當作鍵盤防彈跳技巧 begin -- 除頻器 scan_f<=FD1(12); --7SEG 掃描頻率=4MHz/2^13 kscan_f<=FD1(17); --鍵盤掃描頻率=4MHz /2^16

keyin <= key1_3(2) or key1_3(1) or key1_3(0); process(GCLK43) DUAL COUNTER 2CLKA 2CLR 2CLKB 1CLR 1CLKA 1CLKB 1QA 1QB 1QC 1QD 2QA 2QB 2QC 2QD 74390 0 CLR CK Q[3..0] MOD12 8 CLR CK Q DIV2 0

(19)

begin if rising_edge(GCLK43) then FD1<=FD1+1; end if; end process; -- 7SEG 掃瞄電路 process(scan_f) begin if rising_edge(scan_f) then scan <= scan +1; end if; end process; --鍵盤掃描+鍵盤防彈跳技巧 process(kscan_f) begin if rising_edge(kscan_f) then kscan<=kscan+1; --鍵盤掃描 sq<=keyin; --鍵盤防彈跳技巧 sqd<=sq; --鍵盤防彈跳技巧 end if; end process;

pulse<=sq and (not sqd); --鍵盤防彈跳技巧 -- 鍵盤按鍵判斷處理電路 process(pulse) begin if rising_edge(pulse) then FD2(15 downto 12) <= FD2(11 downto 8) ; --左移 FD2(11 downto 8) <= FD2(7 downto 4) ; --左移 FD2(7 downto 4) <= FD2(3 downto 0) ; --左移

FD2(3 downto 0) <= key1_3(0) & key1_3(1) & kscan; end if;

end process;

-- 4 對 1 多工器

bcd <= FD2(3 downto 0) when scan =0 else FD2(7 downto 4) when scan =1 else FD2(11 downto 8) when scan =2 else FD2(15 downto 12) ; -- BCD 對七節顯示碼解碼器,留意小數點沒用 with bcd select SEG <= "0000001" when "0000",--0 "1001111" when "0001",--1 "0010010" when "0010",--2 "0000110" when "0011",--3 "1001100" when "0100",--4 "0100100" when "0101",--5 "0100000" when "0110",--6 "0001111" when "0111",--7 "0000000" when "1000",--8 "0000100" when "1001",--9 "1111110" when "1010",--* "0011100" when "1011",--# "1111111" when others;

with scan select --七段由右往左掃描

D <="0001" when 0,--D0 "0010" when 1,--D1 "0100" when 2,--D2 "1000" when 3,--D3 "0000" when others;

with kscan select --鍵盤由上往下掃描

key4_7 <= "1000" when "00",--D0 "0100" when "01",--D1 "0010" when "10",--D2 "0001" when "11",--D3 "0000" when others; end xx; EXAM(20 分):修改上述程式,按 *清除,按 # 開始十 進制計數倒數,直到 0000 自動停止。

(20)

補充:修改下列程式用指撥開關控制七段顯示器做動態 展頻率,內容用”口”順時針跑 3 圈、閃爍、貪食蛇….. library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; --- entity LEDx24 is

port( clk555,clr:in std_logic;

LED:out std_logic_vector(23 downto 0)); end LEDx24;

--- architecture xx of LEDx24 is signal cnt:integer range 0 to 34; begin

process(clk555,clr) --腳位不同,555 無穩態外接

begin

if clr='0' then --即 RESET 重置或 CLR 清除

cnt<=0;

elsif rising_edge(clk555) then cnt<=cnt+1; end if; end process; with cnt select LED<=x"000001" when 0, --x 表示 16 進制,二進制? x"000002" when 1, x"000004" when 2, x"000008" when 3, x"000010" when 4, x"000020" when 5, x"000040" when 6, x"000080" when 7, x"000100" when 8, x"000200" when 9, x"000400" when 10, x"000800" when 11, x"001000" when 12, x"002000" when 13, x"004000" when 14, x"008000" when 15, x"010000" when 16, x"020000" when 17, x"040000" when 18, x"080000" when 19, x"100000" when 20, x"200000" when 21, x"400000" when 22, x"800000" when 23, x"000000" when 24, x"ffffff" when 25, x"000000" when 26, x"ffffff" when 27, x"000000" when 28, x"ffffff" when 29, x"000000" when 30, x"ffffff" when 31, x"000000" when 32, x"ffffff" when 33, x"000000" when 34, x"ffffff" when others; end xx;

註:上述程式亦可用於 P14 顯示四位數學號,只是掃描與資料同時輸出,且 11 位元用 2 進制表示較佳。

 假設七段是『共陰』→abcdefg3210

 若僅左上”口”亮 → 11000110111

 若下排”口”均亮 → 00111010000

參考文獻

相關文件

(2).報名路徑:點選右下角"〝

能熟悉電腦概念,包括作業 系統、應用軟體和檔案輸出 入硬體設備的安裝、操作和 維護。2.

(五)上列 10 類檢定材料中,每類各有 3 個至 4 個檢定位置,總計有 35 個檢定

利用 Microsoft Access 資料庫管理軟體,在 PC Windows 作業系 統環境下,將給與的紙本或電子檔(如 excel

利用 Microsoft Access 資料庫管理軟體,在 PC Windows 作業系統環境 下,將給與的紙本或電子檔(如 excel

在數位系統中,若有一個以上通道的數位信號需要輸往單一的接收端,數位系統通常會使用到一種可提供選擇資料的裝置,透過選擇線上的編碼可以決定輸入端

選取本地根資料夾Æ右 1Æ開新檔案Æ輸入檔案名稱( index.html),Enter 鍵Æ右 1Æ設成 首頁 Æ重複〝右 1〝 本地根資料夾〞 Æ開新檔案Æ輸入檔案名稱,Enter

利用 Microsoft Access 資料庫管理軟體,在 PC Windows 作業系 統環境下,將給與的紙本或電子檔(如 excel