Lab6:7 段顯示器控制電路 [ 實驗說明 ] : 使用 ISE12.4 使用 VHDL 來設計 7 段顯示器控制電路 在這一個範例中, 你將利用 Seven_Segmenet.VHD 設計一個 HEX-to-seven-segment decoder 並且將資料透過 decoder 顯示到七節燈管上 開啟此專案所需 Test Bench(.tbw) 檔案, 並且利用 ISE12.4 的軟體完成整個設計流程, 同時利用 ISE12.4 的模擬功能來驗證結果的正確性! 此設計同時利用 Seven_Segment.ucf 來設定 I/O 腳的位置, 利用 Digilent Adept 軟體來燒錄 Seven_Segmene.bit 檔案到 FPGA 模擬板中, 驗證其設計結果是否正確 [ 實驗目地 ] : 當你完成整個專案之後, 你將學會以下的功能 (1). 利用 ISE12.4 的軟體開啟一個 Spartan3E FPGA 的專案. (2). 撰寫一個簡單的 VHDL 程式, 用 Syntax Check 來修正語法錯誤 (3). 使用 VHDL 來設計 7 段顯示器控制模組電路 (4). 產生測試型樣 Test Bench(.tbw) 來模擬你的設計. (5). 完成整個設計流程. 並產生 Seven_Segmene.bit 檔案 (6). 利用 FPGA Editor 來察看 FPGA 內部的結果, (7). 利用 Digilent Adept 來燒錄 Seven_Segmene.bit 檔案到 FPGA [ 系統設計說明 ] --HEX-to-seven-segment decoder -- Input: 4 bit Binary(B3 B2 B1 B) -- Segment_out: out (CA CB CG); -- -- a -- --- -- f b -- --- <- g -- e c -- --- -- d Binary(B3B2B1B) 7Seg Display(Seg1) 共陽極 Seg1 need CA CB CC CD CE CF CG
B3B2B1B CA CB CC CD CE CF CG 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 CA=IN1+IN4+IN11+IN13 CB=IN5+IN6+IN11+IN12+IN14+IN15 CC=IN2+IN12+IN14+IN15 CD= IN1+IN4+IN7+IN1+IN15 CE= IN1+IN3+IN4+IN5+IN7+IN9 CF= IN1+IN2+IN3+IN7+IN13 CG= IN+IN1+IN7+IN12 IN1=1, IN2=1 以上使用 Schematic 非常複雜 S1 S AN AN1 AN2 AN3 7Seg 1 1 1 1 1 1 1 1 2 1 1 1 1 3 1 1 1 1 1 4 AN=S1+S=(S1 S ), AN1=S1+S, AN2=S1 +S, AN3=S1 +S =>Lab1:decoder2to4 (enable: E=)
使用 VHDL 設計可減少設計複雜度 [ 操作步驟 ]: (1) 開啟 ISE12.4 軟體, 開啟一個新的專案 : [File] [New Project]->Lab6 (C:\Xilinx\project\Lab6) [Project Name] : Lab6 [Project Location]: c: \Xilinix\project\Lab6 ( 依使用者設定的目錄 ). [Top-Level Module Type] : HDL ( 代表最上層設計模組是以 HDL 輸入方式的模組 ) (1) -2. 設定硬體元件的參數 [ 元件系列 (Device Family)]:Spartan3E ( 請參考 Basys2_rm.pdf) [ 元件名稱 (Device)] : XC3S1E ( 請參考 Basys2_rm.pdf) [ 元件包裝 (Package)]:CP 132( 請參考 Basys2_rm.pdf) [ 元件速度等級 (Speed)]: -5 ( FPGA 速度等級 ) [ 合成器工具 (Synthesis Tool)]:XST VHDL(VHDL 合成器的種類 ) [ 模擬器 (Simulator)] : ISim(ISE12.4 內建的模擬器 ) [ 產生模擬器的語言 (Preferred Language)] : VHDL
(2)Design Entry: 加入新設計檔案 : [Project] [New Source]-> VHDL Module ->File name: Seven_Segment [Save] Seven_Segment.vhd Clockn : input ( 時脈振盪晶體的輸入信號 ). Reset : input ( 當 Reset = 時, 清除內部計數器 ) Segment_out : Output ( 七節燈管輸出腳 ) Sweep: Output( 七節燈管掃描腳位 )
Add Two Library: use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; Add VHDL Code: architecture Behavioral of Seven_Ssegment is signal count:std_logic_vector(25 downto ); signal HEX:std_logic_vector(3 downto ); begin process(clockn,reset) begin if Reset='1' then count<=(others => '');HEX<=(others => ''); elsif Clockn'event and Clockn='1' then if count < 5 then count<=count+'1'; else count<= (others => '');HEX<=HEX+'1'; end if; end if; end process; Sweep<=""; ---- 七節燈管掃描電路, 此時設定全部輸出 with HEX SELect Segment_out<= "11111" when "1", --1 "11" when "1", --2 "11" when "11", --3 "111" when "1", --4 "11" when "11", --5 "1" when "11", --6 "1111" when "111", --7 "" when "1", --8 "1" when "11", --9 "1" when "11", --A "11" when "111", --b "111" when "11", --C
end Behavioral; "11" when "111", --d "11" when "111", --E "111" when "1111", --F "1" when others; -- (3)Synthesis & Implement Design: [Process]->(double click) Generate Programming File <Three green Check: It s O.K.> Seven_Segment.bit (Download File)
(4)Simulation( 模擬 ) with Testbench Testbench :[Project] [New Source] [VHDL Testbench] Filename= Seven_Segment_tb [Select Source] Seven_Segment clockn :5Mhz ( 週期 2ns:1ns+1ns) -- Stimulus process Reset_proc: process begin Reset<='1'; wait for Clock_period*2; Reset<=''; wait for Clock_period*48; -- insert stimulus here end process;
(4)-2. Simulation: [Design]->view: Simulation [ISim Simulator] (double click) [Behavioral Check Syntax]-> (double click) [Simulate Behavioral Model]->Zoom to Full View ->Check Function is O.K.????
F=5Mhz, too high->modify: if count < 3 then 記得改回去 ;(redo simulation) modify: if count < 3 1 2 3 b (5) 設定 I/O 腳位置, 利用 LED.UCF 來設定 I/O 腳的位置, 以得到正確輸出檔案. [Project] [New Source]-> [Implementation Constraints File] ->File Name: Seven_Segment (.ucf)-> [Save] -> Generate Programming File
NET "Clockn" LOC = "B8"; # Bank =, Signal name = MCLK NET "Reset" LOC = "G12"; # Bank =, Signal name = BTN NET "segment_out<>" LOC = "L14"; # Bank = 1, Signal name = CA NET "segment_out<1>" LOC = "H12"; # Bank = 1, Signal name = CB NET "segment_out<2>" LOC = "N14"; # Bank = 1, Signal name = CC NET "segment_out<3>" LOC = "N11"; # Bank = 2, Signal name = CD NET "segment_out<4>" LOC = "P12"; # Bank = 2, Signal name = CE NET "segment_out<5>" LOC = "L13"; # Bank = 1, Signal name = CF NET "segment_out<6>" LOC = "M12"; # Bank = 1, Signal name = CG NET "sweep<3>" LOC = "K14"; # Bank = 1, Signal name = AN3 NET "sweep<2>" LOC = "M13"; # Bank = 1, Signal name = AN2 NET "sweep<1>" LOC = "J12"; # Bank = 1, Signal name = AN1 NET "sweep<>" LOC = "F12"; # Bank = 1, Signal name = AN
(6) 下載與驗證 : 連接實驗板 (Digilent USB Cable)-> 連接到 USB -> 發展板 switch on-> PC:[Start]->digilent->Adept->Program-> 實驗板操作驗證 設計參考資料 : 多工掃描顯示使用多工掃描顯示時, 我們一次只讓一個七段顯示器的共同點得到驅動電壓而點亮, 也就是說同時間內只有一個七段顯示器可以顯示 ; 但當掃描速度夠快時, 由於人類視覺暫留的原理, 我們肉眼所看到的現象卻是所有的七段顯示器都穩定而且非閃爍的顯示 ( 每一個位數的七段顯示器之輸入掃描頻率至少要大於人眼的視覺暫留頻率 24Hz)