本人刚开始学fpga,看到这个输出pwm的程序。但是有些地方有些不太理解 望高手帮忙
module pwm(clk,key,led);
input clk;
input [1:0]key;
output led;
reg [32:0] count;
reg [9:0] pwm_count;
reg flag;
reg pwm_flag;
always @(posedge clk)
begin
count=count+1'b1;
if (count[13:4] < pwm_count)
pwm_flag=1;
else
pwm_flag=0;
if (count[15] == 1'b1)
begin
if (flag == 1'b1)
begin
flag= 1'b0;
if (key[0] == 1'b0)
pwm_count=(pwm_count+10'b0000000001);
else if (key[1] == 1'b0)
pwm_count=(pwm_count-10'b0000000001);
else pwm_count=pwm_count;
end
end
else
flag= 1'b1;
end
assign led=pwm_flag;
endmodule
这句话
if (count[13:4] < pwm_count) //就是这里不太明白 是用pwm_count 和count[13:4]进行比较,但count是一个一直变化的数 对吗?为什么要和一个变化的数字比较呢?另外pwm_count没赋初值,那它初始是一个什么状态呢???问得比较凌乱
一个关于fpga输出pwm的问题
答案:2 悬赏:0
解决时间 2021-04-08 00:13
- 提问者网友:刀枪不入
- 2021-04-07 14:09
最佳答案
- 二级知识专家网友:萝莉姐姐鹿小北
- 2021-04-07 14:20
用pwm_count 和count[13:4]进行比较;就是要count变呀,不然你的PWM怎么输出呢;因为count在变所以才会出现周期性的大于pwm_count然后小于pwm_count,这样PWM不就出来了了么,PWM的周期就是count[13:0];和count[13:4]比较,省去了低第四位,是怕脉冲为零或者是脉冲过窄,这样IO根本输不出来信号;没有赋初值的很有可能出问题,但基本上都是0;你要加入一个复位信号来初始化那些寄存器,这样做更规范些;以后写程序必须加复位信号;现在你就知道为什么单片机要复位了吧,就是怕里面的寄存器和变量不听话,复位的时候全部从新赋值;单片机说白了就是一个专用IC,FPGA它也可以变成专用IC,所以在FPGA的场合升级很方便,不用把芯片换了,直接升级固件,它就有了新的功能,这一点比专用IC灵活。希望能帮到你。
全部回答
- 1楼网友:一个很哇塞的汉子
- 2021-04-07 15:35
tast ffn(fout,n,clk);
output fout;
input n;
input clk;
reg [29:0] j;
always @(posedge clk)
begin if (j==n) j<=0;
else j<=j+1;
if(j>=0) fout<=0;
else fout<=1;
end
endtask
这是一个占空比为n/n+1的任务,你可以根据实际情况来定义n的数值,然后根据楼上兄弟的思想,利用一个多路选择器,
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯