理工实验,Verilog HDL写一个程序让白色LED渐亮渐灭,需要用到PWM,最后通过FPGA演示

具体要求:用3个开关分别控制红绿蓝3种颜色的LED(白色LED由三种颜色的LED构成),要求按下开关之后(只按一下,不是一直按着),LED逐渐变亮,然后逐渐变暗,然后熄灭... 具体要求:用3个开关分别控制红绿蓝3种颜色的LED(白色LED由三种颜色的LED构成),要求按下开关之后(只按一下,不是一直按着),LED逐渐变亮,然后逐渐变暗,然后熄灭,只需要这一个周期,不要周期循环,并且3种LED以不同的周期发光,需要用到PWM,Clock波的频率是33mHz。
我们程序是用ISE写的,虽然努力过,但是今天实验还是失败了,下周要交实验报告,实验失败分数上限减20分,不想这样不明不白的交报告,请大家帮帮忙,问题解决的话总共酬谢800金币(我提简单问题你回答),越快越好,谢谢大家。
这里不方便的话可以发我邮箱,发邮件时请写上百度知道的账号名593756982@qq.com
【我们的实验思路是先做一个可逆计数器,然后做一个高频率的锯齿波和相对低频率的三角波来实现PWM控制,原理如下图,然后瞬间按一下开关,LED变亮,这个我们做不出来,我们做的必须一直按着才亮,这里请详细的用Verilog HDL写出来】
展开
 我来答
woaiyanya0828
推荐于2016-09-20 · TA获得超过178个赞
知道小有建树答主
回答量:74
采纳率:100%
帮助的人:85.9万
展开全部
我给你写了一个代码,没有仿真,里面有简单注释,要是调试出了什么问题或者看不懂可以继续追问,如果没问题请采纳!
module LED
(
input clk_33,
input reset_n,
input switch,
output led_red,
output led_yellow,
output led_bule
);
// 假设PWM的频率为1k:T = 1/1k = 1ms;
// 这个频率可以根据你自己的需要设定然后修改num和t的值即可,不过要注意将相关寄存器的位数做对应修改
// 将1ms再分为256个份,每一份:t = T/256 = 3.9us;
// 以33MHz时钟产生3.9us的定时:N = 3.9*10E(-6)/(1/33000000) = 128.7,取129;
// ==============================
parameter t = 8'd128;
parameter num = 8'd255;
// ==============================
reg [1:0] i;//0:等待用户按键;1:等待完成信号,切换至状态0;
reg iscount;//开始计数信号
reg isdone;//完成信号
// --- --- ---
always @ ( posedge clk_33 or negedge reset_n )
if( !reset_n )
begin
i <= 1'b0;
iscount <= 1'b0;
end
else
case( i )
2'd0:
if( switch )
begin
i <= i + 1'b1;
iscount <= 1'b1;
end
else
begin
i <= i;
iscount <= iscount;
end
2'd1:
if( isdone )
begin
i <= 2'd0;
iscount <= 1'b0;
end
else
begin
i <= i;
iscount <= iscount;
end
endcase
// ==============================
reg [7:0] count1;//产生3.9us
// --- --- ---
always @ ( posedge clk_33 or negedge reset_n )
if( !reset_n )
count1 <= 8'd0;
else if( iscount )
count1 <= count1 + 1'b1;
else if( count1 == t )
count1 <= 8'd0;
else
count1 <= 8'd0;
// ==============================
reg [7:0] count2;//产生1ms
reg [8:0] length;//控制PWM中高电平的时间
reg [1:0] step;//0:等待开始信号;1:渐亮;2:渐暗;3:切换至状态0等待开始信号
// --- --- ---
always @ ( posedge clk_33 or negedge reset_n )
if( !reset_n )
begin
count2 <= 8'd0;
length <= 9'd1;
step <= 2'd0;
isdone <= 1'b0;
end
else
case( step )
2'd0:
if( iscount )
step <= step + 1'b1;
else
step <= step;
2'd1:
if( count2 == 8'd255 )
begin
if( length == 8'd255 )
begin
length <= length - 1'b1;
count2 <= 8'd0;
step <= step + 1'b1;
end
else
begin
length <= length + 1'b1;
count2 <= 8'd0;
end
end
else if( count1 == t )
count2 <= count2 + 1'b1;
else ;
2'd2:
if( count2 == 8'd255 )
begin
if( length == 8'd0)
begin
step <= step + 1'b1;
count2 <= 8'd0;
isdone <= 1'b1;
end
else
begin
length <= length - 1'b1;
count2 <= 8'd0;
end
end
else if( count1 == t )
count2 <= count2 + 1'b1;
else ;
2'd3:
begin
isdone <= 1'b0;
step <= 2'd0;
end
endcase
// ==============================
assign led_red = ( length > count2 ) ? 1'b1 : 1'b0;
assign led_yellow = ( length > count2 ) ? 1'b1 : 1'b0;
assign led_bule = ( length > count2 ) ? 1'b1 : 1'b0;
// ==============================
endmodule
追问
非常感谢,帮了很大的忙,我是负责开关这一块的,我参考你的写了个一段程序,想用加计数器验证一下,但是,本来我写的应该是加计数器计数到10的时候复位,复位后done变成1,然后过程重新开始,但是模拟的结果全都是0,没有显示出波形(除了定义的时钟和开关有动作),能不能帮忙看下是哪里出问题了?谢谢
刷其他金币你可以私信我说个时间我给你弄
帐号已注销
2014-10-31
知道答主
回答量:1
采纳率:0%
帮助的人:1350
展开全部
正在学模电的觉得你的LED灯泡好简单
追问
那能不能帮忙写一个,非常感谢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式