目錄
- 第一章 在DE2-115上用狀態機思想實現LED流水燈
- 1.1 狀態機設計思路
- 1.2 Verilog代碼實現
- 1.3. 仿真測試代碼
- 1.4 編譯代碼與仿真
- 第二章 CPLD和FPGA芯片的主要技術區別是什么?它們各適用于什么場合?
- 2.1 主要技術區別
- 2.2 適用場合
- 第三章 HDLBits學習
- 3.1四位右移寄存器
- 3.2 半加器
- 3.3 全加器
- 3.4 線材
- 3.5 與門
- 參考資料
第一章 在DE2-115上用狀態機思想實現LED流水燈
1.1 狀態機設計思路
- 狀態定義:定義多個狀態,每個狀態對應一個LED亮起。
- 狀態轉移:按順序從一個狀態轉移到下一個狀態。
- 計數器:用于控制每個狀態的持續時間。
1.2 Verilog代碼實現
- 環境配置
- 代碼
module led_fsm(input wire clk, // 時鐘信號input wire reset, // 復位信號output reg [7:0] leds // 8個LED輸出
);// 定義狀態
parameter STATE0 = 3'b000;
parameter STATE1 = 3'b001;
parameter STATE2 = 3'b010;
parameter STATE3 = 3'b011;
parameter STATE4 = 3'b100;
parameter STATE5 = 3'b101;
parameter STATE6 = 3'b110;
parameter STATE7 = 3'b111;reg [2:0] current_state, next_state;// 計數器,用于控制每個狀態的持續時間
reg [25:0] cnt;always @(posedge clk or posedge reset) beginif (reset) begincurrent_state <= STATE0;cnt <= 0;end else beginif (cnt == 25'd10000000) begin // 每個狀態持續約1秒(假設時鐘為50MHz)cnt <= 0;current_state <= next_state;end else begincnt <= cnt + 1;endend
endalways @(*) begincase (current_state)STATE0: beginleds = 8'b00000001;next_state = STATE1;endSTATE1: beginleds = 8'b00000010;next_state = STATE2;endSTATE2: beginleds = 8'b00000100;next_state = STATE3;endSTATE3: beginleds = 8'b00001000;next_state = STATE4;endSTATE4: beginleds = 8'b00010000;next_state = STATE5;endSTATE5: beginleds = 8'b00100000;next_state = STATE6;endSTATE6: beginleds = 8'b01000000;next_state = STATE7;endSTATE7: beginleds = 8'b10000000;next_state = STATE0;enddefault: beginleds = 8'b00000001;next_state = STATE1;endendcase
endendmodule
1.3. 仿真測試代碼
module tb_led_fsm;// 時鐘和復位信號
reg clk;
reg reset;
wire [7:0] leds;// 實例化被測試模塊
led_fsm uut (.clk(clk),.reset(reset),.leds(leds)
);// 時鐘生成
initial beginclk = 0;forever #10 clk = ~clk;
end// 測試過程
initial beginreset = 1;#20 reset = 0;#10000 $stop;
endendmodule
1.4 編譯代碼與仿真
-
編譯
led_fsm.v
-
點擊
Processing
–>Start
–>Start test bench template writer
,并在flie中添加生成的led_fsm.vt文件
-
修改led_fsm.vt文件內容
把仿真代碼copy到該文件內,并在第一行聲明時間掃描間隔
-
配置仿真環境
點擊Tools
–>Options
–>EDA ToolsOptions
選項,配置ModelSim環境,如果Modelsim版本為INTEL FPGA Edition,那么文件地址應為安裝文件內........\modelsim_ase\win32aloem
,如圖所示。
-
配置仿真文件,點擊
Assignments
–>Settings
-
選擇上面的
Compile test bench
點擊后面Test Bench
進入選擇,點擊New
新建
-
按照順序先編輯名字,然后瀏覽剛才的.vt文件,最后點擊Add添加達到如下圖效果,再點擊OK
-
點擊
Tools
–>Run Simulation Tool
–>RTL Simulation
開始進行仿真
仿真結果
第二章 CPLD和FPGA芯片的主要技術區別是什么?它們各適用于什么場合?
2.1 主要技術區別
- 結構:
CPLD
:基于查找表(LUT)和可編程連線的簡單結構,邏輯資源較少。
FPGA
:基于查找表(LUT)和可編程連線的復雜結構,邏輯資源豐富,支持大規模設計。 - 編程方式:
CPLD
:通常使用一次性可編程(OTP)技術,編程后不可擦除。
FPGA
:使用SRAM配置,可多次擦寫和重新編程。 - 速度和性能:
CPLD
:延遲較低,適合高速簡單邏輯。
FPGA
:延遲較高,但支持復雜的邏輯設計。 - 成本和功耗:
CPLD
:成本較低,功耗較低。
FPGA
:成本較高,功耗較高。
2.2 適用場合
CPLD:
- 適合簡單的邏輯設計和組合邏輯。
- 適合需要低延遲和低功耗的場合。
- 適合需要一次性編程的場合。
FPGA:
- 適合復雜的邏輯設計和大規模數字系統。
- 適合需要頻繁更新和調試的場合。
- 適合需要高性能計算的場合。
第三章 HDLBits學習
通過訪問HDLBits以及HDLBits中文導學網站,完成組合邏輯(combinational logic
)中的各題目
3.1四位右移寄存器
-
題目
-
代碼實現
module top_module(input clk,input areset, // async active-high reset to zeroinput load,input ena,input [3:0] data,output reg [3:0] q);
// 異步復位,同步加載和移位
always @(posedge clk or posedge areset) beginif (areset) beginq <= 4'b0000; // 異步復位為0end else beginif (load) beginq <= data; // 同步加載end else if (ena) beginq <= {1'b0, q[3:1]}; // 右移一位,最高位清零end// 如果load和ena都無效,保持當前狀態end
endendmodule
- 提交結果
3.2 半加器
- 題目
- 代碼實現
module top_module(input a, b,output cout, sum
);assign sum = a ^ b;assign cout = a & b;
endmodule
- 提交結果
3.3 全加器
- 題目
- 代碼實現
module top_module(input a, b, cin,output cout, sum
);assign sum = a ^ b ^ cin;assign cout = (a & b) | (a & cin) | (b & cin);
endmodule
- 提交結果
3.4 線材
- 題目
- 代碼
module top_module(input in,output out
);assign out = in;
endmodule
- 提交結果
3.5 與門
- 題目
- 代碼實現
module top_module(input a,input b,output out
);assign out = a & b;
endmodule
- 提交結果
參考資料
Quartus使用步驟及聯合Modelsim仿真教程
FPGA基礎入門【2】ModelSim官方免費版安裝
quartus和modelsim聯合仿真詳細教程