Download as pdf or txt
Download as pdf or txt
You are on page 1of 13

Edited by Chu Yu

Altera FPGA 燒錄實驗

「設計程序」
1. 編輯電路設計檔案:使用 MAX+plus II 內建圖形編輯器編輯邏輯電路檔案, 並
使用 File→Save As 存至適當的硬碟目錄,注意目錄不可用中文或為根目錄。請
注意取檔名必須與 Verilog HDL 中的 Top Cell 同名,且附檔名取 *.v。
2. 設定目前編輯的電路檔為專案:File→Project→Set Project to Current File。
3. 指定設計元件:選取 Assign→Device,出現對話框時,選定欲使用的 IC 編號為
FLEX8000 系列之 EPF8282ALC84-2。

4. 存檔並檢查:選取 File→Project→Save&Check。
5. 除錯:觀察「MAX+plus II - Complier」視窗有無錯誤訊息出現。
6. 存 檔 並 編 譯 : 選 取 File → Project → Save&Compile , 此 步 驟 將 產 生 燒 錄 檔
filename.pof。
7. 指定腳位對應:Assign→Pin/Location/Chip

修改腳位編號

腳位名稱如無打錯將出
現正確輸入或輸出屬性
按 Add 會出現 刪除

1
Edited by Chu Yu
8. 再做一次存檔及編譯:選取 File→Project→Save&Compile。
9. 電路驗證:根據電路特性使用波形模擬檢視其電路正確性。
10. IC 燒錄:選取 Programmer,出現對話框再選 Configure 即可。如第一次使用
需進行燒錄 FPGA 的驅動程式設定程序。

燒錄正確將出現此視窗

z 燒錄 FPGA 的驅動程式設定程序(此步驟只需做一次即可)
¾ Windows XP 系統設定
控制台→新增硬體(;是) →新增硬體裝置→;安裝我從清單中…
→音效,視訊及遊戲控制器→從磁片安裝
→瀏覽(c:/maxplus2/drivers/win2000)→確定→繼續安裝→Altera ByteBlaster
→下一步→繼續安裝→下一步→完成→重新開機

¾ Maxplus2 的硬體設定
選取 Programmer→Hardware Setup

2
Edited by Chu Yu

「波型模擬」
1. 進入波形編輯視窗:選取 MAX+plus II→Waveform Editor。

2. 選擇輸出入腳位:選取 Node→Enter Nodes From SNF 後,在出現對話框中選


List 按鈕,選擇「Available Nodes」中的輸入與輸出,按 ⇒ 鍵選定欲觀察的輸
入與輸出信號。最後按 OK 進行波形編輯。

3. 設定時脈之週期:選取 Option→Grid Size…,出現對話框時設定「grid size」


為 50ns,按 OK 鈕。

4. 編輯輸入信號的邏輯值:先選定欲編輯的輸入腳位信號線,在欲編輯的區間用
滑鼠 mark 使其區間成為黑色,再用按滑鼠右鍵選定 Insert→High 或 Low,或
者使用主視窗的最左邊中選用 直接做 0→1 或 1→0 編輯。

5. 存檔:選取 File→Save,產生 filename.scf。

6. 模擬:選取 MAX+plus II→Simulatior 進行最後的模擬,以驗證 Verilog file 是


否有誤。

3
Edited by Chu Yu

實驗板接腳對應圖
S1 S2 DIP1 DIP2
1 LED1 13 LED1 23 DIP1 35 DIP1
2 LED2 15 LED2 24 DIP2 36 DIP2
3 LED3 16 LED3 25 DIP3 37 DIP3
4 LED4 18 LED4 27 DIP4 39 DIP4
6 LED5 19 LED5 28 DIP5 40 DIP5
7 LED6 20 LED6 29 DIP6 41 DIP6
8 LED7 21 LED7 30 DIP7 42 DIP7
9 LED8 22 LED8 34 DIP8 43 DIP8

SW EXT
46 SW1 72 EXT 1
48 SW2 76 EXT 2
49 SW3 77 EXT 3
50 SW4 78 EXT 4
51 SW5 79 EXT 5
55 SW6 81 EXT 6
56 SW7 82 EXT 7
57 SW8 83 EXT 8
84 EXT 9
31 EXT 10

4
Edited by Chu Yu

實驗一:四對一多工器電路

腳位指定: a→pin46, b→pin48, c→pin49, d→pin50, s1→pin30, s0→pin34,


F→pin1

實驗二:複合邏輯電路(二位元比較器)

腳位指定: a0→pin34, a1→pin30, b0→pin43, b1→pin42, F→pin1

實驗三:偶同位元產生器

腳位指定: a0→pin34, a1→pin30, a3→pin29, a4→pin28, F→pin1

5
Edited by Chu Yu

實驗四:四位元加法器

a[3..0] s[3..0]
四位元
b[3..0] 加法器 c

腳位指定: a0→pin34, a1→pin30, a2→pin29, a3→pin28


b0→pin43, b1→pin42, b2→pin41, b3→pin40
s0→pin1, s1→pin2, s2→pin3, s3→pin4, c→pin9

實驗五:多項式計算電路
設計一個可實現 x2 + 3x + 1 的電路,其中 x 為兩位元輸入。

腳位指定:x0→pin34, x1→pin30
p0→pin1, p1→pin2, p2→pin3, p3→pin4, p4→pin6

實驗六:D 型與 T 型正反器

腳位指定:a→pin34, b→pin23, clr→pin57, clk→pin50, TF→pin1, DF→pin9

6
Edited by Chu Yu

實驗七:具載入四位元計數器
Page 6-23

腳位指定:Load→pin23, D0→pin34, D1→pin30, D2→pin29, D3→pin28,


Clrn→pin57, clk→pin50
Q0→pin1, Q1→pin2, Q2→pin3, Q3→pin4, Co→pin9

實驗八:四位元移位暫存器

腳位指定:clr→pin57, clk→pin50
q0→pin1, q1→pin2, q2→pin3, q3→pin4

實驗九:特定位元字串辨識電路
設計一個可從序列輸入位元串中找到 001 並輸出 1 的電路。

腳位指定:clr→pin57, ck→pin50, x→pin34, Z→pin1

7
Edited by Chu Yu

實驗十:紅綠燈時控電路

腳位指定:red→pin6, yellow→pin7, green→pin8

實驗十一:掃描式七段 LED 計數電路

腳位指定:rst→pin50, enable→pin35, blank→pin36


col0→pin58, col1→pin60, col2→pin61, col3→pin62
num6→pin63, num5→pin64, num4→pin65, num3→pin66
num2→pin67, num1→pin69, num0→pin70, num7→pin71

實驗十二: 廣告燈電路

腳位指定:rst→pin50
q0→pin1, q1→pin2, q2→pin3, q3→pin4
q4→pin6, q5→pin7, q6→pin8, q7→pin9

8
Edited by Chu Yu
// Traffic.V, Traffic Light Controller (Main)
`include "Cnt16.V" //引用 Cnt16.V, 4 位元計數器 (Traffic Light Controller, Counter)
`include "Tra_Cntl.V" //引用 Tra_Cntl.V, 紅綠燈控制器的狀態控制電路

module Traffic(Clock, Reset, RED, GREEN, YELLOW);


input Clock, Reset;
output RED, GREEN, YELLOW;
// 下列的這些變數名稱 是用於內部的接線
wire RED, GREEN, YELLOW, R, G, Y;
wire Recount_Counter16;
wire [23:0] Count_Number;

assign RED=~R; assign YELLOW=~Y; assign GREEN=~G;


Traffic_Control_FSM U0(Clock, Reset, Count_Number, Recount_Counter16, R, G, Y);
Counter_16 U1(Clock, Reset, Recount_Counter16, Count_Number);
endmodule

// Tra_Cntl.V, 紅綠燈控制器的狀態控制電路 (Traffic Light Controller, FSM)


module Traffic_Control_FSM(Clock, Reset, Count_In, Recount_Counter16, RED, GREEN, YELLOW);
input Clock, Reset;
input [23:0] Count_In;
output Recount_Counter16, RED, GREEN, YELLOW;
reg Recount_Counter16, RED, GREEN, YELLOW;
reg [2:0] state,GreenCount;

`define Rate 1000000 // 時間倍數


`define RED_Light_Time 4*`Rate // 紅燈亮的時間
`define GREEN_Light_Time 4*`Rate // 綠燈亮的時間
`define YELLOW_Light_Time 1*`Rate // 黃燈亮的時間
`define GREEN_Off_Time 1*`Rate // 綠燈滅的時間(閃爍)
`define GREEN_On_Time 1*`Rate // 綠燈亮的時間(閃爍)

parameter RED_Light = 3'b000, GREEN_Light = 3'b001, GREEN_On = 3'b010,GREEN_Off = 3'b011,


YELLOW_Light = 3'b100;

always @(posedge Clock)


begin
if (Reset) // 電路重置
begin // 初始狀態設為: RED_Light (紅燈)
state = RED_Light;
RED = 1'b1; // 紅燈亮
GREEN = 1'b0;
YELLOW = 1'b0; // 重新計數 Counter_16 設為: 1 (重新計數)
Recount_Counter16 = 1;
end
else
begin
case (state)
RED_Light: // 目前狀態為: RED_Light (紅燈)
begin // 紅燈: 維持 RED_Light_Time 個時間單位
if (Count_In == `RED_Light_Time)
begin // 重新計數 Counter_16 設為: 1 (重新計數)
Recount_Counter16 = 1;
// 下個狀態為: GREEN_Light (綠燈)
state = GREEN_Light;
end
else
begin // 重新計數 Counter_16 設為: 0 (不重新計數)
Recount_Counter16 = 0;
RED = 1'b1; // 紅燈亮
9
Edited by Chu Yu
GREEN = 1'b0;
YELLOW = 1'b0;
end
end
GREEN_Light: // 目前狀態為: GREEN_Light (綠燈)
begin // 綠燈: 維持 GREEN_Light_Time 個時間單位
if (Count_In == `GREEN_Light_Time)
begin // 重新計數 Counter_16 設為: 1 (重新計數)
Recount_Counter16 = 1;
GreenCount=0;
state = GREEN_On; // 下個狀態為: GREEN_On(綠燈閃爍)
end
else
begin // 重新計數 Counter_16 設為: 0 (不重新計數)
Recount_Counter16 = 0;
RED = 1'b0;
GREEN = 1'b1; // 綠燈亮
YELLOW = 1'b0;
end
end
GREEN_On: // 目前狀態為: GREEN_Light (綠燈)
begin // 綠燈: 維持 GREEN_Light_Time 個時間單位
if (Count_In == `GREEN_On_Time)
begin // 重新計數 Counter_16 設為: 1 (重新計數)
Recount_Counter16 = 1;
if(GreenCount==3) state = YELLOW_Light;// 下個狀態為: YELLOW (黃燈)
else state = GREEN_Off;
end
else
begin // 重新計數 Counter_16 設為: 0 (不重新計數)
Recount_Counter16 = 0;
RED = 1'b0;
GREEN = 1'b1; // 綠燈亮
YELLOW = 1'b0;
end
end
GREEN_Off:// 目前狀態為: GREEN_Light (綠燈)
begin // 綠燈: 維持 GREEN_Light_Time 個時間單位
if (Count_In == `GREEN_Off_Time)
begin // 重新計數 Counter_16 設為: 1 (重新計數)
Recount_Counter16 = 1;
GreenCount=GreenCount+1;
// 下個狀態為: GREEN_Light (綠燈)
state = GREEN_On;
end
else
begin // 重新計數 Counter_16 設為: 0 (不重新計數)
Recount_Counter16 = 0;
RED = 1'b0;
GREEN = 1'b0; // 綠燈滅
YELLOW = 1'b0;
end
end
YELLOW_Light: // 目前狀態為: YELLOW_Light (黃燈)
begin // 黃燈: 維持 YELLOW_Light_Time 個時間單位
if (Count_In == `YELLOW_Light_Time)
begin // 重新計數 Counter_16 設為: 1 (重新計數)
Recount_Counter16 = 1;
// 下個狀態為: RED_Light (紅燈)
state = RED_Light;
10
Edited by Chu Yu
end
else
begin // 重新計數 Counter_16 設為: 0 (不重新計數)
Recount_Counter16 = 0;
RED = 1'b0;
GREEN = 1'b0;
YELLOW = 1'b1; // 黃燈亮
end
end

default: // 目前狀態為: 無效的的電路狀態 (X 或 = 2'b11)


begin
state = 2'bXX; // 無效的的電路狀態 (2'bXX)
// 重新計數 Counter_16 設為: 0 (不重新計數)
Recount_Counter16 = 0;
RED = 1'bX;
GREEN = 1'bX;
YELLOW = 1'bX;
end
endcase
end
end

endmodule

// Cnt16.V: 4 位元計數器 (Traffic Light Controller, Counter)


// 具有「重置」及「重新計數」訊號控制的
// 4 位元 (0~15) 正緣觸發計數器

module Counter_16 (Clock, Reset, Recount_Counter16, Count_Out);


input Clock, Reset, Recount_Counter16;
output [23:0] Count_Out;
reg [23:0] Count_Out;

always @ (posedge Clock)


begin
if (Reset) // 重置
Count_Out = 0; // 清除為 0
else
if (Recount_Counter16) // 重新計數
Count_Out = 0; // 清除為 0
else
Count_Out = Count_Out + 1; // 計數值 +1
end
endmodule

----------------------------------------------------------------------------------------------------------
module disp(dig, num, col, enable, blank, clk, rst);
output [7:0] num;
output [3:0] col;
output [1:0] dig;
input blank, enable, clk, rst;

reg [18:0] cnt; //counter


reg [15:0] cnt1;
reg [1:0] dig; //display digital
11
Edited by Chu Yu
wire [3:0] in0, in1, in2, in3;
wire [7:0] tmp;
wire [3:0] in;
wire clkn, bk, clk1;

assign clk1=cnt[18];

always@(posedge clk1 or negedge rst)


if (rst==0) cnt1=0;
else if (enable==1) cnt1=cnt1+1;

assign in0=cnt1[3:0];
assign in1=cnt1[7:4];
assign in2=cnt1[11:8];
assign in3=cnt1[15:12];

assign in=(dig==0)?in0:
(dig==1)?in1:
(dig==2)?in2:
in3;

assign num=~tmp; //driven by low active


assign tmp=(in==4'b0000)?8'b0_1111110: //'0'
(in==4'b0001)?8'b0_0110000: //'1'
(in==4'b0010)?8'b0_1101101: //'2'
(in==4'b0011)?8'b0_1111001: //'3'
(in==4'b0100)?8'b0_0110011: //'4'
(in==4'b0101)?8'b0_1011011: //'5'
(in==4'b0110)?8'b0_1011111: //'6'
(in==4'b0111)?8'b0_1110000: //'7'
(in==4'b1000)?8'b0_1111111: //'8'
(in==4'b1001)?8'b0_1111011: //'9'
(in==4'b1010)?8'b0_1110111: //'a'
(in==4'b1011)?8'b0_0011111: //'b'
(in==4'b1100)?8'b0_1001110: //'c'
(in==4'b1101)?8'b0_0111101: //'d'
(in==4'b1110)?8'b0_1001111: //'e'
8'b0_1000111; //'f'

assign col=({bk,dig}==3'b000)?4'b1110:
({bk,dig}==3'b001)?4'b1101:
({bk,dig}==3'b010)?4'b1011:
({bk,dig}==3'b011)?4'b0111:
4'b1111;
assign bk=blank|(cnt[0]&~cnt[1]); //(cnt[0]&~cnt[1]) cancels some ghost images

assign clkn=cnt[1];
always @(posedge clkn or negedge rst)
begin
if (rst==0) dig=2'b11;
else dig=dig+1;
end

always @(posedge clk or negedge rst)


begin
if (rst==0) cnt=0;
else cnt=cnt+1;
end
endmodule

12
Edited by Chu Yu
----------------------------------------------------------------------------------------------------------
module led(q, clk, rst);
output [7:0] q;
input clk, rst;
reg [7:0] q;
reg [3:0] state;
reg [18:0] cnt;
wire clk1;

parameter s0=4'b0000, s1=4'b0001, s2=4'b0010, s3=4'b0011,


s4=4'b0100, s5=4'b0101, s6=4'b0110, s7=4'b0111,
s8=4'b1000, s9=4'b1001, sa=4'b1010, sb=4'b1011,
sc=4'b1100, sd=4'b1101, se=4'b1110, sf=4'b1111;

assign clk1=cnt[17];
always @(posedge clk1 or negedge rst)
begin
if (rst==0) begin state<=s0; q<=0; end
else case (state)
s0:begin q<=8'b1111_1110; state<=s1; end
s1:begin q<=8'b1111_1101; state<=s2; end
s2:begin q<=8'b1111_1011; state<=s3; end
s3:begin q<=8'b1111_0111; state<=s4; end
s4:begin q<=8'b1110_1111; state<=s5; end
s5:begin q<=8'b1101_1111; state<=s6; end
s6:begin q<=8'b1011_1111; state<=s7; end
s7:begin q<=8'b0111_1111; state<=s8; end
s8:begin q<=8'b1011_1111; state<=s9; end
s9:begin q<=8'b1101_1111; state<=sa; end
sa:begin q<=8'b1110_1111; state<=sb; end
sb:begin q<=8'b1111_0111; state<=sc; end
sc:begin q<=8'b1111_1011; state<=sd; end
sd:begin q<=8'b1111_1101; state<=s0; end

se:begin q<=8'b1111_1110; state<=s1; end


sf:begin q<=8'b1111_1110; state<=s1; end
endcase
end

always @(posedge clk or negedge rst)


begin
if (rst==0) cnt=0;
else cnt=cnt+1;
end
endmodule

13

You might also like