完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
ms,s,min均两位,一键实现reset,start,stop 3个功能,20Mhz时钟信号20万分频成100hz的时钟信号,我的程序如下,在器材上运行的时候stop功能不能实现,请大神帮忙找出错误和修改方法,谢谢了。
module timer(clk,button,cnt1,cnt2,cnt3,cnt4,cnt5,cnt6); input clk,button; reg[3:0]cnt1,cnt2,cnt3,cnt4,cnt5,cnt6; output[3:0]cnt1,cnt2,cnt3,cnt4,cnt5,cnt6; reg [17:0]cnt; reg[1:0]z; reg x,y,full,full1,full2,full3,full4,full5; reg[2:0]cs,ns; parameter[2:0] idle=000, reset=001, start=010, stop=100; always@(posedge clk) begin if(cnt==199999) //分频 begin cnt=0; full=1; end else begin cnt=cnt+1; full=0; end end always@(posedge full) begin cs=ns; end always@(button or cs) //状态机 begin case(cs) idle: begin if(button) ns=reset; else ns=idle; end reset: begin if(button) ns=start; else ns=reset; end start: begin if(button) ns=stop; else ns=start; end stop: begin if(button) ns=reset; else ns=stop; end default:ns=idle; endcase end always@(ns) begin case(ns) idle:z=2'b00; reset:z=2'b00; start:z=2'b10; stop:z=2'b11; default:z=2'b00; endcase end always@(posedge full) //异步计数及工作状态 begin if(z==2'b11) //ms的个位之stop功能 begin x=0; y=1; cnt1=cnt1; end else if(z==2'b00) //reset功能 begin cnt1=4'b0000; x=1; y=0; end else if(cnt1==4'b1001) //start功能 begin x=0; cnt1=4'b0000; full1=1; y=0; end else begin x=0; cnt1=cnt1+4'b0001; full1=0; y=0; end end always@(posedge full1) //个位的进位信号驱动十位 begin if((y==1)&&(x==0)) //ms的十位 stop cnt2=cnt2; else if((x==1)&&(y==0)) //reset cnt2=4'b0000; else if(cnt2==4'b1001) //start begin cnt2=4'b0000; full2=1; end else begin cnt2=cnt2+4'b0001; full2=0; end end always@(posedge full2) begin if((y==1)&&(x==0)) cnt3=cnt3; else if((x==1)&&(y==0)) cnt3=4'b0000; else if(cnt3==4'b1001) begin cnt3=4'b0000; full3=1; end else begin cnt3=cnt3+4'b0001; full3=0; end end always@(posedge full3) begin if((y==1)&&(x==0)) cnt4=cnt4; else if((x==1)&&(y==0)) cnt4=4'b0000; else if(cnt4==4'b0101) begin cnt4=4'b0000; full4=1; end else begin cnt4=cnt4+4'b0001; full4=0; end end always@(posedge full4) begin if((y==1)&&(x==0)) cnt5=cnt5; else if((x==1)&&(y==0)) cnt5=4'b0000; else if(cnt5==4'b1001) begin cnt5=4'b0000; full5=1; end else begin cnt5=cnt5+4'b0001; full5=0; end end always@(posedge full5) begin if((y==1)&&(x==0)) cnt6=cnt6; else if((x==1)&&(y==0)) cnt6=4'b0000; else if(cnt6==4'b0101) cnt6=4'b0000; else cnt6=cnt6+4'b0001; end endmodule |
|
相关推荐
3个回答
|
|
always@(ns)
begin case(ns) idle:z=2'b00; reset:z=2'b00; start:z=2'b10; stop:z=2'b11; default:z=2'b00; endcase end 这段程序是用来做啥的? |
|
|
|
谢谢你,这是用2位2进制数表示四个状态,实际的接线操作无误的情况下只能实现一种功能,开始暂停,或开始清零,没法开始暂停清零三种状态的切换 |
|
|
|
我觉得程序的流程要在好好分析下,硬件描述语言是并行执行的,所有的always是一起运行的,所以可能是那块的逻辑没有控制好
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1559 浏览 1 评论
1335 浏览 0 评论
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
1544 浏览 0 评论
927 浏览 0 评论
2341 浏览 0 评论
1464 浏览 35 评论
5676 浏览 113 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 04:18 , Processed in 0.456608 second(s), Total 46, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号