input sys_clk // 系统时钟
outputled // 输出 PWM信号
outputreg led1 // 输出寄存器位 led1
regPWM// 定义寄存器位 PWM
reg[25:0]count // 定义26位计数器 count
//LED亮度分为254个级别
reg[7:0]light // 定义8位寄存器 它的值 0000_0000 到 1111_1111共255个
// 估计 0000_0000 代表无亮度,所以亮度分254个级别
//计数器
always@(posedge sys_clk)
count<=count+1 // 每经过一个系统时钟上升沿,26位计数器count加一
//级别跳变,跳变速度可由count[n]调节
always@(posedge count[16])begin// 计数器count的第16位 作为时钟上升沿,即count[15:0]
// 从16'h0000计数到 16'hffff共 65536个系统时钟脉冲
light<=light-1// 每经过一个上升沿(65536个系统时钟脉冲),// 8位亮度寄存器减一,即亮度降一个级别
led1<=~led1 // 同时,led1寄存器位的值翻转一次
end
//PWM频率:clk从0计到17'h1FFFF为一个周期
always@(sys_clk)
if(count[16:0] <{light,9'b0})// 如果计数器count[16:9] 小于 light亮度值,PWM 为0
PWM<=0
else // 计数器count[16:9] 大于 light亮度值,PWM 为1
PWM<=1
assign led=PWM// 将PWM值输出给 led 端口
endmodule
// led1是每次发生亮度级别跳变时,改变一次状态,点亮或者熄灭
// led是 PWM输出,亮度渐变的过程,由亮变暗,由暗变亮
// 级别跳变可以通过 count[n]中n的数值来改变,n 越大,渐变越慢
修改了一下,加了输入输出端口,以及触发条件module test(red,amber,green ,able)
input able
output red,amber,green
reg clock,red,amber,green
parameter on=1,off=0,red_tics=350,green_tics=200,amber_tics=30
//交通灯初始化
initial red=off
initial amber=off
initial green=off
//交通灯控制时序
always
wait(able)
begin
red=on//开红灯
light(red,red_tics)//调用等待任务
green=on//开绿灯
light(green,green_tics)//等待
amber=on//开黄灯
light(amber,amber_tics)//等待
end
//定义交通灯开启时间的任务
task light
output color
input [31:0]tics
begin
repeat(tics)
@(posedge clock)
color=off
end
endtask
always
begin
#100 clock=0
#100 clock=1
end
endmodule
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)