FPGA學習筆記-------計數器結構02

//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

  1. 找出時序中的計數器
  2. 設計計數器
  3. 輸出信號與計數器對齊
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章