完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
FPGA 时钟频率50MHz
要实现的功能描述如下: 写一路脉冲,以clk_50M下降沿触发,从零计数到280为低电平,然后从281-285(5个时钟脉冲)为高电平,然后从286-330(45个时钟脉冲)为低电平,接着计数5个时钟脉冲为高电平,接着45个时钟脉冲为低电平,也就是说,这路脉冲在计数281次后,为一个占空比为1:10的(周期为1000ns)的脉冲: 所写程序如下:
问题如下:为什么最后一个else if 语句没有执行,也就是当count1计数到 331时,count1没有变成281,而是count1一直加一,直到计满为止 |
|
相关推荐
7个回答
|
|
假如count1=330,肯定执行这段程序else if(count1>9'd285)
begin SP <= 1'b0; count1 <= count1 + 1'b1; end 那么这时count1=331,在下降沿来的时候它会满足这个这个条件执行else if(count1>9'd285) begin SP <= 1'b0; count1 <= count1 + 1'b1; end 但是她有满足这个条件,会不会执行这个程序呢? else if(count1 > 9'd330) count1 <= 9'd281; 答案是不会的,因为在 if....else....程序中当满足多个条件的时候,由于程序是顺序执行的,所以下面的那段程序不会被执行,直接跳过了。
最佳答案
|
|
|
|
非常感谢,虽然很了解if.....else语句,结果用起来还是出错了~
|
|
|
|
可不可以再帮我解决一个问题: 程序如下: module chuangxinjijin( clk_50M,rst_n, count1,count2, SP ); input clk_50M,rst_n; output reg [16:0] count1; output reg [14:0] count2; output reg SP; //-----------------------------SP------------------------------------- reg clear; always @(negedge clk_50M or negedge rst_n) if(!rst_n) count1 <= 1'b0; else if(count1==59996 ) begin clear <= 1; count1 <= 1'b0; end else begin count1 <= count1 + 1'b1; clear <= 0; end //-------------------------------------------------------------- always @(negedge clk_50M or negedge rst_n) if(!rst_n) count2 <= 1'b0; else if(coun2>=0 && count2<281) begin SP <= 1'b0; count2 <= count2 + 1'b1; end else if(count2>=281 && count2<286 ) begin SP <= 1'b1; count2 <= count2 + 1'b1; end else if(count2>=286 && count2<330) begin SP <= 1'b0; count2 <= count2 + 1'b1; end else if (count2 == 330) count2 <= 281; else if (clear == 1) count2 <= 0; else count2 <= count2 + 1'b1; endmodule 问题如下,为什么在clear为1,也就是count1计数到59996时,count2不为0哇 |
|
|
|
这个问题跟上面那个问题差不多。这条语句的存在else if (count2 == 330)
count2 <= 281; 就保证了count2不可能计数超过330.当count2==330时,就会被赋值281.在下个时钟沿来的时候,count2==281,就会满足else if(count2>=281 && count2<286 )这个条件,执行相应的语句,当count2再计数到330时,又被赋值为281,这样就出现了一个循环,即使这时的clear==1,满足 else if (clear == 1)这个条件,但是由于if...else...是顺序执行,它被跳过了。。。。。。 |
|
|
|
要是我想让这个else if (clear == 1) count2 <= 0; 这条语句生效,可以怎么改一下,调了好久了,呼呼 |
|
|
|
尝试在第二个always块中,在每个elseif()语句的条件中加一个条件(....&&clear==0),如: else if(coun2>=0 && count2<281 && clear==0),当然它就不用加了,else if (clear == 1)
count2 <= 0; 当然程序的相应的地方需要修改一下,例如最后一个else程序else count2 <= count2 + 1'b1; 这条语句好像就不可能再被执行了。具体怎么修改你试试看,我也没有具体的做,只是建议。 |
|
|
|
把else if(count1>9'd285)改为else if(ount1>9'd285 &&ount1<=9'd330)
if else else语句能不能执行多个分支,条件满足只执行一个 建议设置标志位,即计数到280,设置标志位=1,不过要加一个计数寄存器count2判断标志位成立来完成占空比,这样两个always就可以模块化 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1673 浏览 1 评论
1428 浏览 0 评论
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
1644 浏览 0 评论
941 浏览 0 评论
2433 浏览 0 评论
1504 浏览 38 评论
5703 浏览 113 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-29 11:07 , Processed in 0.761044 second(s), Total 84, Slave 68 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号