微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 多边沿问题

多边沿问题

时间:10-02 整理:3721RD 点击:
各位大侠谁帮我看看这段程序哪有问题啊?提示的错误是下面的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

能详细说下有什么问题吗?
编译下来语法没错啊。

将 if(SL==9)改为else if(ML==9)
将if(ML==9)改为else if(ML==9)就可以了,没错但是一大堆警告,
具体原因不懂,但是你以后可以注意一下毕竟verilog还是不像c那么"自由"

写得有问题,posedge应该是用在时序电路

always @(posedge clear or posedge count2) 这句话你是想用clear当时钟吗?还是用count2做时钟?
一个寄存器只能有一个时钟和一个复位。你之前的always块里不是描述过clk是时钟了吗?怎么到这里又换了。这样是不对的。



    恩,你说的很好,我是想做一个跑表的程序,分了几个块,利用count1的状态来确定百分秒向秒的进位,count2的状态来确定秒位向分的进位,我看到一些例程上好像是这么写的,郁闷!不知道这个要实现的话,该如何改写呢?谢谢您啦!



    恩,那我该怎么改写呢?我是想做一个跑表的程序,分了几个块,利用count1的状态来确定百分秒向秒的进位,count2的状态来确定秒位向分的进位,我看到一些例程上好像是这么写的,郁闷!不知道这个要实现的话,该如何改写呢?谢谢您啦!



    恩,编译到后来时,提示的就是always那块的上升沿有问题,好像是有点混乱吧,从程序中可以看出来应该是count1的两个沿和clk的一个沿,这样的规定好像Verilog 不允许吧!你可以编译一下试试,我看了英文的分析,知道原因但是具体怎么修改不知道,我是想设计一个简单的跑表,用count1来标示百分秒向秒的进位!



    哦,忘记说了,其实我是想用count2做时钟的,但是没有clk查看波形仿真,什么结果都没有,后来我就琢磨着加了一个clk,不知道该怎么用?



    不要试图用控制信号做寄存器的时钟,实际上counter1只是一个控制信号而已,clear还可以勉强认为是复位(实际上严格来说也不是复位)。所以,所有的寄存器用clk做时钟
always @(posedge clk) begin
   if(counter1) begin
     .....
   end
这才是正确的代码风格,写verilog代码不要像写C语言一样,串起来写,那是不对的。

说得好啊,新手真要注意



    恩,小编真是高手,太感谢你了,成功了!再次感谢!

小编,建议你用if else 太长的话,还是用一下其他的语句可不可以。或者用begin end,要不然太乱了。

上一篇:语音编码问题求助
下一篇:VHDL的问题

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top