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. 输出信号与计数器对齐
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值