FPGA学习之四:让led灯根据指定的亮灭模式亮灭,亮灭模式未知,由用户随机指定。8个变化状态为一个循环,每个变化的时间值根据不同的应用场景选择

一、设计目标

  让led灯根据指定的亮灭模式亮灭,亮灭模式未知,由用户随机指定。8个变化状态为一个循环,每个变化的时间值根据不同的应用场景选择。这里要补充的是:led分成8个状态,但是,其每个状态的时间值是相等的。

二、设计思路

根据设计目标可知,八个状态为一个循环周期,而每个状态的时间是固定的,首先确定输入为clk、reset_n,输出为led,但是由于需要用户指定变化模式,故8个转态下加入8位的控制变量ctrl,此处Ctrl对应指定8个状态,故需为8位,同时每个状态的时间也由用户指定,加入时间变量Time(此处Time为计数器计数的值,需要由时间/20ns得到,对应位数需要根据所需定义的时间计算)。同时,加入了计数器2,即counter2,此处counter2是当counter满一次则进1,定义为3位,正好对应8个状态。


三、设计代码

module counter_led4(
    clk,
	reset_n,
	ctrl,
	Time,
	led
    );
    input clk;
	input reset_n ;
	input [30:0]Time;
	output reg led;
	input [7:0]ctrl;
	reg [26:0]counter ;
	reg [2:0]counter2;
	always@(posedge clk or negedge reset_n)begin
	  if(!reset_n)
	      counter <= 0;
	  else if(counter==Time-1)
	       counter <= 0;
	  else
	      counter <= counter+1'b1;
	  end
	  always@(posedge clk or negedge reset_n)begin
	  if(!reset_n)
	      counter2 <= 0;
	  else if(counter2==3'b111)
	       counter2 <= 0;
	  else if(counter==Time-1)
	      counter2 <= counter2+1'b1;
	  end
	  
    always@(posedge clk or negedge reset_n)begin
	  if(!reset_n)
	      led <= 0;
       else case(counter2)
         3'b000:led <=ctrl[1];
         3'b001:led <=ctrl[2];
         3'b010:led <=ctrl[3];
         3'b011:led <=ctrl[4];
         3'b100:led <=ctrl[5];
         3'b101:led <=ctrl[6];
         3'b110:led <=ctrl[7];
         3'b111:led <=ctrl[0];
           default:led<=led;
           endcase
 	  end
endmodule

四、测试文件代码

`timescale 1ns / 1ns
module counter_led4_tb;
   reg clk;
   reg reset_n;
   reg [7:0]ctrl;
   reg [30:0]Time;
   wire led;
 counter_led4 counter_led(
    .led(led),
	.clk(clk),
	.ctrl(ctrl),
	.reset_n(reset_n)
        );
    initial clk=1;
	always #10 clk=~clk;
	initial begin
	ctrl =0;
	reset_n=0;
	#201;
	Time=15_000_000;
	reset_n=~reset_n;
	ctrl=8'b1010_1101;
	#2000000000;
	$stop;
	end
endmodule

五、仿真波形

 由波形,可以看到,led根据ctrl的预设值在变化,即随用户定义的模式变化,设计实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值