一、题目1
1让LED灯按照亮0.25秒,灭0.75秒的状态循环亮灭
2.让LED灯按照亮0.25秒,灭0.5秒,亮0.75秒,灭1秒的状态循环亮灭
3.让LED灯按照指定的亮灭模式亮灭,亮灭模式未知,由用户随机指定。以0.25秒为一个变化周期,8个变化状态为一个循环。
4. 让LED灯按照指定的亮灭模式亮灭,亮灭模式未知,由用户随机指定。8个变化状态为 一个循环,每个变化状态的时间值可以根据不同的应用场景选择。
5. 让多个LED灯按照设置的模式各自在一个变化循环内独立亮灭变化
6.每隔10ms,让LED灯的一个8状态循环执行一次(每个状态的变化时间值小一点,方便测试,比如设置为10us)
二、思路1
亮0.25秒,灭0.75秒,总共1s 。所以定义的counter计数:1s=1000000000ns 1000000000ns/20ns =50000000 49999999二进制: 10111110101111000001111111 26位
三、设计文件1
`timescale 1ns / 1ns
// 让LED灯按照亮0.25秒,灭0.75秒的状态循环亮灭
module counter_led1(clk,reset_n,led
);
input clk;
input reset_n;
output reg led;
reg [25:0]counter;//d50_000_000=b10_1111_1010_1111_0000_1000_0000
parameter MCNT=26'd50_000_000;//以1s为一个周期,1s后计数清零;1s=1000_000_000ns,1000_000_000ns/20ns=50_000_000次
//计数进程
always@(posedge clk or negedge reset_n)
if(!reset_n)
counter <=0;
else if(counter == MCNT -1)//此处的是常数,可以直接相减
counter <=0;
else
counter <= counter + 1'b1;
//led进程
always@(posedge clk or negedge reset_n)
if(!reset_n)
led <=0;
else if(counter == (MCNT/2+MCNT/4) -1)
led <=1;
else if(counter == MCNT -1)
led <=0;
endmodule
四、激励文件1
`timescale 1ns / 1ns
module counter_led_tb(
);
reg clk;
reg reset_n;
wire led;
counter_led1 counter_led1_inst(
.clk(clk),
.reset_n(reset_n),
.led(led)
);
initial clk = 1'b1;
always #10 clk=~clk; //延时半个周期10ns,翻转clk值,模拟实现时钟信号
initial begin
reset_n = 1'b0;
#201;//延迟时间不应为周期的整数倍
reset_n = 1'b1;
// #2000000000;//等待两秒,看实际状态
// $stop;
end
endmodule
五、总结
1、if....else if.....else if语句 和if.....else if.....else的区别:else是无条件的通过 else if后面跟了条件
always@(posedge clk or negedge reset_n)
if(!reset_n)
led <=0;
else if(counter == (MCNT/2+MCNT/4) -1)
led <=1;
else if(counter == MCNT -1)
led <=0;
一、题目2
让LED灯按照亮0.25秒,灭0.5秒,亮0.75秒,灭1秒的状态循环亮灭
二、思路2
0.25+0.5+0.75+1=2.5 也就是counter至少要27位
三、设计文件2
`timescale 1ns / 1ns
// 让LED灯按照亮0.25秒,灭0.5秒,亮0.75秒,灭1秒的状态循环亮灭
module counter_led2(clk,reset_n,led
);
input clk;
input reset_n;
output reg led;
reg [26:0]counter;//d125_000_000=b111_0111_0011_0101_1001_0100_0000,二进制共需要27位表示
parameter MCNT=27'd125_000_000;//以2.5s为一个周期,2.5s后计数清零;2.5s=2500_000_000ns,2500_000_000ns/20ns=125_000_000次
// parameter MCNT=27'd125;//缩小仿真时间,观察仿真图的波形
//计数进程
always@(posedge clk or negedge reset_n)
if(!reset_n)
counter <=0;
else if(counter == MCNT -1)//此处的是常数,可以直接相减
counter <=0;
else
counter <= counter + 1'b1;
//led进程
always@(posedge clk or negedge reset_n)
if(!reset_n)
led <=1;
else if(counter == MCNT/10 -1)//0.25s是一个周期2.5s的1/10;
led <=0;
else if(counter == (MCNT/10+MCNT/5) -1)//0.5s是一个周期2.5s的1/5;
led <=1;
// else if(counter == (MCNT/10+MCNT/5)*2 -1)
else if(counter == (MCNT/10+MCNT/5+MCNT*3/10) -1)//0.75s是一个周期2.5s的3/10;
led <=0;
else if(counter == MCNT -1)
led <=1;
endmodule
四、激励文件2
`timescale 1ns / 1ns
module counter_led_tb(
);
reg clk;
reg reset_n;
wire led;
counter_led2 counter_led2_inst(
.clk(clk),
.reset_n(reset_n),
.led(led)
);
initial clk = 1'b1;
always #10 clk=~clk; //延时半个周期10ns,翻转clk值,模拟实现时钟信号
initial begin
reset_n = 1'b0;
#201;//延迟时间不应为周期的整数倍
reset_n = 1'b1;
// #2000000000;//等待两秒,看实际状态
// $stop;
end
endmodule
五、总结补充2
always@(posedge clk or negedge reset_n)
if(!reset_n)
led <=1;
else if(counter == MCNT/10 -1)//0.25s是一个周期2.5s的1/10;
led <=0;
else if(counter == (MCNT/10+MCNT/5) -1)//0.5s是一个周期2.5s的1/5;
led <=1;
// else if(counter == (MCNT/10+MCNT/5)*2 -1)
else if(counter == (MCNT/10+MCNT/5+MCNT*3/10) -1)//0.75s是一个周期2.5s的3/10;
led <=0;
else if(counter == MCNT -1)
led <=1;
采用的是前一段时间加上后一段时间的方式来控制亮灭时间
一、题目3
让LED灯按照指定的亮灭模式亮灭,亮灭模式未知,由用户随机指定。以0.25秒为一个变化周期,8个变化状态为一个循环
二、思路3
LED灯按照指定的亮灭模式亮灭,指的是某一段0.25s可亮可灭,完全由用户指定,所以需要引入一个指定亮灭的端口ctrl ,八段所以ctrl需要八位,通过激励文件对ctrl进行赋值,从而实现用户指定亮灭。
一个周期八段,每段0.25s 8x0.25s = 2s counter 为101_1111_0101_1110_0001_0000_0000 至少27位
三、设计文件3
本来counter是100_000_000次 设计文件中为了减小仿真时间 counter为100
`timescale 1ns / 1ns
// 让LED灯按照指定