//PWM波 – 產生8個脈衝,每個脈衝週期爲10ms對應的佔空比分別爲80%、70%、60%、50%、40%、30%、20%、10%
/計數器結構
//------------------------------------------------------------------------------------------------------------------------------------------------
//明德揚定義計數器
//計數器規則1:計數器逐一考慮3要素:初值、加一條件、結束值
//計數器規則2:計數器初值必須爲零
//計數器規則3:使用某一計數器值,必須同時滿足加一條件
//計數器規則4:結束條件必須同時滿足加一條件
//計數器規則5:當取某個數時,assign的形式必須爲:(加一條件)&&(cnt==計數值-1);
//計數器規則6:結束後必須回到0;
//計數器規則7:若要限定範圍,則推薦使用">=“和”<"兩種符號;
//計數器規則8:設計步驟是,先寫計數器的always段,條件用名字代替,然後用assign寫出加1條件;最後用assign寫出結束條件;
//計數器規則9:加1條件必須與計數器嚴格對齊,其他信號一律向計數器對齊;
//計數器規則10:命名規則必須符合規範,比如:add_cnt表示加1條件;end_cnt表示結束條件;
//計數器規則11:減1計數器暫時不用。
//計數器八步法
// 第一步:功能明確
// 第二步:功能波形
// 第三步:計數結構 ------根據波形找出實現時序需要的計數器數量和結構
// 第四步:加1和結束條件
// 第五步:定義特殊點
// 第六步:完整性檢查
// 第七步:計數器代碼
// 第八步:功能代碼
————————————————
parameter TIME_1MS = 100_000;
//1ms 定時器
always @(posedge clk or negedge rst_n)
begin
if(rst_n == 1'b0)
begin
cnt_1ms <= 0;
end
else if(add_cnt_1ms) //加一條件
begin
if(end_cnt_1ms) //結束條件
cnt_1ms <= 0;
else
cnt_1ms <= cnt_1ms + 1;
end
end
assign add_cnt_1ms = 1'b1;
assign end_cnt_1ms = add_cnt_1ms && cnt_1ms == TIME_1MS - 1;
//10ms 計數器
always @(posedge clk or negedge rst_n)
begin
if(rst_n == 1'b0)
begin
cnt_10ms <= 0;
end
else if(add_cnt_10ms)
begin
if(end_cnt_10ms)
cnt_1ms <= 0;
else
cnt_10ms <= cnt_10ms + 1;
end
end
assign add_cnt_10ms = end_cnt_1ms;
assign end_cnt_10ms = add_cnt_10ms && cnt_10ms = 10 - 1;
//功能代碼
always @(posedge clk or negedge rst_n)
begin
if(rst_n = 1'b0)
begin
led[0] <= 0;
end
else if (led_on)
begin
led[0] <= 0;
end
else if(led0_off)
begin
led[0] <= 1;
end
end
assign led0_off = add_cnt_10ms && cnt_10ms == 1 - 1;
assign led_on = add_cnt_10ms && cnt_10ms == 10 - 1;
always @(posedge clk or negedge rst_n)
begin
if(rst_n = 1'b0)
begin
led[1] <= 0;
end
else if (led_on)
begin
led[1] <= 0;
end
else if(led1_off)
begin
led[1] <= 1;
end
end
assign led1_off = add_cnt_10ms && cnt_10ms == 2 - 1;
always @(posedge clk or negedge rst_n)
begin
if(rst_n = 1'b0)
begin
led[2] <= 0;
end
else if (led_on)
begin
led[2] <= 0;
end
else if(led2_off)
begin
led[2] <= 1;
end
end
assign led2_off = add_cnt_10ms && cnt_10ms == 2 - 1;
always @(posedge clk or negedge rst_n)
begin
if(rst_n = 1'b0)
begin
led[3] <= 0;
end
else if (led_on)
begin
led[3] <= 0;
end
else if(led3_off)
begin
led[3] <= 1;
end
end
assign led3_off = add_cnt_10ms && cnt_10ms == 3 - 1;
//4 - 7 led燈代碼參考 0 - 3
- 找出時序中的計數器
- 設計計數器
- 輸出信號與計數器對齊