搜索
bottom↓
回复: 9

大家来看下小弟编的verilog HDL 加减计数器怎么不能在 Quartus 8.1 仿真?

[复制链接]

出0入0汤圆

发表于 2011-7-26 18:48:19 | 显示全部楼层 |阅读模式
我的程序是这样的:
module AAAA (add, sub, rst, Fn);
        input add, sub, rst;
        output Fn;
        reg [7:0] Fn;

       
        initial
        begin
                Fn <= 0;
        end
       
        always @ (posedge rst or posedge add or posedge sub)
        begin
                if (rst)
                        Fn <= 0;
                else if (add)       
                        Fn <= Fn+8'd1;
                else
                        Fn <= Fn - 1;
        end
endmodule


仿真结果图片 (原文件名:FPGA.jpg)

输出Fn计数器值在加1后变乱了!!!为什么啊?如果仅做加计数或仅减计数的话仿真就正常的。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2011-7-27 08:23:51 | 显示全部楼层
大家都没遇到过这个问题吗?

出0入0汤圆

发表于 2011-7-27 15:18:31 | 显示全部楼层
回复【1楼】yuantielei  
-----------------------------------------------------------------------

else if (sub)

出0入0汤圆

发表于 2011-7-27 15:28:23 | 显示全部楼层
可用同步时钟驱动的方式试试

出0入0汤圆

 楼主| 发表于 2011-7-27 18:21:05 | 显示全部楼层
else if (sub)
是不行的,我试过了。。。

什么是“同步时钟驱动的方式"???

出0入0汤圆

发表于 2011-7-28 02:07:26 | 显示全部楼层
同步时钟驱动就是加上个时钟信号clk
我只会写成两个文件的方式,用testbench来生成激励,代码如下(具体没有仿真过,那个initial中的仿真时间可以自己调一下)
分两个模块写,自己试试看
模块一:
module AAAA (clk,add, sub, rst, Fn);
        input clk,add, sub, rst;
        output Fn;
        reg [7:0] Fn;

        always @ (posedge clk)
        begin
        if (rst)
                Fn <= 0;
        else if (add)       
                Fn <= Fn + 8'd1;
        else if (sub)
                Fn <= Fn - 8'd1;
        else
                Fn <= Fn;
        end
endmodule


模块二(即测试激励模块)
`timescale 1ns/100ps
module tb_AAA;
reg [7:0] Fn;
wire clk,add,sub,rst;

        AAAA inst_AAA(
                .clk(clk),
                .add(add),
                .sub(sub),
                .rst(rst),
                .Fn(Fn)
        );
       
initial   begin
        clk = 0;
        add = 0;
        sub = 0;
        rst = 0;
        #100 rst = 1;
        #150 rst = 0;
        #200 add = 1;
        #1000 add = 0;
        #100 sub = 1;
end

always #50 clk = ~clk;

endmodule

出0入0汤圆

发表于 2011-7-28 15:51:36 | 显示全部楼层
你这个计数器没有时钟信号。综合的结果不可能生成DFF,最后只能是组合逻辑。对于组合逻辑来说,不能保存中间状态。所以Fn <= Fn+8'd1;这样的语句对于组合逻辑将形成自激振荡。所以你波形乱了。
你应该用时钟去检测add或者sub的上升沿,监测到他们的上升沿后计数器改变。

module mycounter(
input                                clk,
input                                rst,
input                                add,
input                                sub,
output reg [7:0]        Fn
);

reg radd1, radd2, rsub1, rsub2;

always @(posedge clk or posedge rst)
begin
        if(rst)
        begin
                Fn                <=        8'd0;
                radd1        <=        1'b0;
                radd2        <=        1'b0;
                rsub1        <=        1'b0;
                rsub2        <=        1'b0;
        end
        else
        begin
                //detect posedge of add
                radd1        <=        add;
                radd2        <=        radd1;
               
                //detect posedge of sub
                rsub1        <=        sub;
                rsub2        <=        rsub1;
               
                if({radd1, radd2} == 2'b10)
                        Fn        <=        Fn + 8'd1;
                else if({rsub1, rsub2} == 2'b10)
                        Fn        <=        Fn - 8'd1;
                else
                        Fn        <=        Fn;
        end
end

endmodule

出0入0汤圆

发表于 2011-7-28 15:53:39 | 显示全部楼层
用一个同步时钟作为进程的激励,而不是用add或sub,否则就是异步电路了。在进程中检测add和sub信号的上跳沿,再根据不同情况作处理。
供参考。

出0入0汤圆

 楼主| 发表于 2011-7-28 21:49:02 | 显示全部楼层
谢谢大家的帮助,就是这个同步时钟的问题了!
现在好了。谢谢。。。。。。。。。

出0入0汤圆

发表于 2011-7-29 11:47:21 | 显示全部楼层
always里的信号就之要rst!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 13:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表