有一段程序不懂,求详解啊!verilog的

有一段程序不懂,求详解啊!verilog的,第1张

module pwm(sys_clk, led,led1)

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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11541443.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存