在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4548|回复: 12

[原创] 多边沿问题

[复制链接]
发表于 2011-4-16 19:52:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
各位大侠谁帮我看看这段程序哪有问题啊?提示的错误是下面的always块那的上升沿有问题,但是我看好多参考书上也是这么写的啊!谢谢啦!
module menu(clk,clear,stop,MSH,MSL,SH,SL,MH,ML);
input clk,clear,stop;
output[3:0] MSH,MSL,SH,SL,MH,ML;
reg[3:0] MSH,MSL,SH,SL,MH,ML;
reg count1,count2;
always @(posedge clk)
begin
        if(clear)
        begin
                MSL<=0;
                MSH<=0;
                count1<=0;
        end
        else if(!stop)
                begin
                        if(MSL==9)
                                begin
                                        MSL<=0;
                                        if(MSH==9)
                                                begin
                                                        MSH<=0;
                                                        count1<=0;
                                                end
                                        else
                                                begin
                                                        MSH<=MSH+1;
                                                        count1<=0;
                                                end
                                end
                        else
                                begin
                                        MSL<=MSL+1;
                                        count1<=0;
                                end
                end
end
always @(posedge clear or posedge count1)
begin
        if(clear)
        begin
                SL<=0;
                SH<=0;
                count2<=0;
        end
        if(SL==9)
                begin
                        SL<=0;
                        if(SH==5)
                                begin
                                        SH<=0;
                                        count2<=1;
                                end
                        else
                                begin
                                        SH<=SH+1;
                                        count2<=0;
                                end
                end
        else
                begin
                        SL<=SL+1;
                        count2<=0;
                end
end
always @(posedge clear or posedge count2)
begin
        if(clear)
        begin
                ML<=0;
                MH<=0;
        end
        if(ML==9)
                begin
                        ML<=0;
                        if(MH==5)
                                MH<=0;
                        else
                                MH<=MH+1;
                end
        else
                ML<=ML+1;
end
endmodule
发表于 2011-4-16 20:15:29 | 显示全部楼层
能详细说下有什么问题吗?
编译下来语法没错啊。
发表于 2011-4-16 20:53:39 | 显示全部楼层
将 if(SL==9)改为else if(ML==9)
将if(ML==9)改为else if(ML==9)就可以了,没错但是一大堆警告,
具体原因不懂,但是你以后可以注意一下毕竟verilog还是不像c那么"自由"
发表于 2011-4-16 20:57:57 | 显示全部楼层
写得有问题,posedge应该是用在时序电路
发表于 2011-4-16 21:18:49 | 显示全部楼层
always @(posedge clear or posedge count2) 这句话你是想用clear当时钟吗?还是用count2做时钟?

一个寄存器只能有一个时钟和一个复位。你之前的always块里不是描述过clk是时钟了吗?怎么到这里又换了。这样是不对的。
 楼主| 发表于 2011-4-16 21:40:41 | 显示全部楼层
回复 5# acgoal


    恩,你说的很好,我是想做一个跑表的程序,分了几个块,利用count1的状态来确定百分秒向秒的进位,count2的状态来确定秒位向分的进位,我看到一些例程上好像是这么写的,郁闷!不知道这个要实现的话,该如何改写呢?谢谢您啦!
 楼主| 发表于 2011-4-16 21:43:00 | 显示全部楼层
回复 4# beginner001


    恩,那我该怎么改写呢?我是想做一个跑表的程序,分了几个块,利用count1的状态来确定百分秒向秒的进位,count2的状态来确定秒位向分的进位,我看到一些例程上好像是这么写的,郁闷!不知道这个要实现的话,该如何改写呢?谢谢您啦!
 楼主| 发表于 2011-4-16 21:50:05 | 显示全部楼层
回复 2# orlye


    恩,编译到后来时,提示的就是always那块的上升沿有问题,好像是有点混乱吧,从程序中可以看出来应该是count1的两个沿和clk的一个沿,这样的规定好像Verilog 不允许吧!你可以编译一下试试,我看了英文的分析,知道原因但是具体怎么修改不知道,我是想设计一个简单的跑表,用count1来标示百分秒向秒的进位!
 楼主| 发表于 2011-4-16 21:56:03 | 显示全部楼层
回复 5# acgoal


    哦,忘记说了,其实我是想用count2做时钟的,但是没有clk查看波形仿真,什么结果都没有,后来我就琢磨着加了一个clk,不知道该怎么用?
发表于 2011-4-17 21:33:00 | 显示全部楼层
回复 9# yongmaster


    不要试图用控制信号做寄存器的时钟,实际上counter1只是一个控制信号而已,clear还可以勉强认为是复位(实际上严格来说也不是复位)。所以,所有的寄存器用clk做时钟
always @(posedge clk) begin
   if(counter1) begin
     .....
   end

这才是正确的代码风格,写verilog代码不要像写C语言一样,串起来写,那是不对的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-13 11:09 , Processed in 0.029210 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表