一、實驗硬軟件環境:
- EDA軟件:Vivado2019
- 實驗開發板:Basys3 FPGA套件
二、實驗內容:
實現如下電路功能:當開關開啟,燈泡輪流閃爍,間隔1s,類似跑馬燈;開關關閉,則燈泡關閉。使用實驗板上的按鍵模擬開關,led模擬燈泡,時鍾使用實驗板提供的clk。草靠實驗板的管腳文件編寫約束文
注意,LED部分的電路圖如左圖所示,當FPGA輸出為高電平時,相應的LED點亮;否則,LED熄滅。撥碼開關的電路如右圖所示,當開關打到下檔時,表示FPGA的輸入為低電平。
三、具體實現
- 思路分析:開發板的晶振為100Mhz,則其周期為10ns,初值為0的計數器自加1到100,000,000時為1s,每隔1s時間,led燈轉換一次。
- 設計源碼:
1 `timescale 1ns / 1ps 2 ////////////////////////////////////////////////////////////////////////////////// 3 // Company: 4 // Engineer: 5 // 6 // Create Date: 2020/09/08 14:18:09 7 // Design Name: 8 // Module Name: Marquee 9 // Project Name: 10 // Target Devices: 11 // Tool Versions: 12 // Description: 13 // 14 // Dependencies: 15 // 16 // Revision: 17 // Revision 0.01 - File Created 18 // Additional Comments: 19 // 20 ////////////////////////////////////////////////////////////////////////////////// 21 22 module Marquee(switch, clk, led); 23 input switch, clk; 24 output reg [3:0] led; 25 26 reg [28:0] count; 27 28 always @(posedge clk) 29 begin 30 if(!switch) 31 begin 32 led <= 4'b0001; 33 count <= 29'b0; 34 end 35 else 36 begin 37 if(count == 29'd100_000_000) 38 begin 39 count <= 29'b0; 40 if(led == 4'b1000) 41 led <= 4'b0001; 42 else 43 led <= (led << 1); 44 end 45 else 46 begin 47 count <= count + 1; 48 led <= led; 49 end 50 end 51 end 52 endmodule
- 仿真代碼:(需要注意的是,為了便於仿真,設計源碼中的count設置為自加到100,而非100,000,000。)
1 `timescale 1ns / 1ps 2 ////////////////////////////////////////////////////////////////////////////////// 3 // Company: 4 // Engineer: 5 // 6 // Create Date: 2020/09/08 15:42:36 7 // Design Name: 8 // Module Name: Marquee_tb 9 // Project Name: 10 // Target Devices: 11 // Tool Versions: 12 // Description: 13 // 14 // Dependencies: 15 // 16 // Revision: 17 // Revision 0.01 - File Created 18 // Additional Comments: 19 // 20 ////////////////////////////////////////////////////////////////////////////////// 21 22 23 module Marquee_tb; 24 reg switch, clk; 25 wire [3:0] led; 26 27 Marquee U_Marquee(.switch(switch), .clk(clk), .led(led)); 28 29 initial 30 begin 31 clk = 0; switch = 0; 32 33 #100 switch = 1; 34 35 #100; 36 end 37 38 always #10 clk = ~clk; 39 40 endmodule
- 波形圖:
- 約束文件:
1 set_property PACKAGE_PIN V17 [get_ports switch] 2 set_property IOSTANDARD LVCMOS33 [get_ports switch] 3 set_property PACKAGE_PIN W5 [get_ports clk] 4 set_property IOSTANDARD LVCMOS33 [get_ports clk] 5 set_property PACKAGE_PIN U16 [get_ports led[0]] 6 set_property IOSTANDARD LVCMOS33 [get_ports led[0]] 7 set_property PACKAGE_PIN E19 [get_ports led[1]] 8 set_property IOSTANDARD LVCMOS33 [get_ports led[1]] 9 set_property PACKAGE_PIN U19 [get_ports led[2]] 10 set_property IOSTANDARD LVCMOS33 [get_ports led[2]] 11 set_property PACKAGE_PIN V19 [get_ports led[3]] 12 set_property IOSTANDARD LVCMOS33 [get_ports led[3]]