集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 5625|回复: 14

仿真无输出 到底程序哪有问题?????求解答

[复制链接]
fight 发表于 2011-11-2 19:16:31 | 显示全部楼层 |阅读模式
module pulse_counter_task_logic(
        divide_clk,
        reset_n,        
        pulse_pos_input,
        pulse_neg_input,       
        pulse_result,
        pre_pulse_pos_1,
        pre_pulse_neg_1,

        );

        //Inputs
        input divide_clk;                                //Input Clock to be divided
        input reset_n;                                //Reset
        input pulse_pos_input;      //input pulse positive
        input pulse_neg_input;      //input pulse negative
               
        output [7:0] pulse_result;    // output pulse counter
        //output irq;
        output [7:0]pre_pulse_neg_1;
        output [7:0]pre_pulse_pos_1;
    //output [7:0]a;

//Signal Declarations       
//reg [6:0]        counter_ten;
//reg [24:0] counter;                              //Internal Counter
reg [7:0] pulse_result_r;           //output pulse counter register
reg [7:0] pre_pulse_pos;           //pulse counter temporary register
reg [7:0] pre_pulse_neg;



//计算两输入脉冲pulse_pos_input与pulse_neg_input的和值
always @( posedge  divide_clk or  negedge reset_n)      
begin
        if (~reset_n)
                pulse_result_r <= 8'h0;
        else if(divide_clk)
        begin
                //b<= pre_pulse_pos ;
                pulse_result_r <= pre_pulse_pos + pre_pulse_neg;
        end
        else
        pulse_result_r <=pulse_result_r ;
       
end

// pulse measure process

//计算每次在divide_clk=0时的pulse_pos_input 的输入脉冲数
always @(negedge pulse_pos_input or posedge divide_clk or negedge reset_n)
begin
        if((~reset_n) | divide_clk )
        begin //复位 清零
        #8        pre_pulse_pos <= 8'h0;    //clear the pre_pulse
        end
        else
        begin
                pre_pulse_pos <= pre_pulse_pos + 8'h1;
        end
end

//计算每次在divide_clk=0时的pulse_neg_input 的输入脉冲数
always @(negedge pulse_neg_input or posedge divide_clk or negedge reset_n)
begin
        if((~reset_n) | divide_clk )  //复位 清零
        begin
                pre_pulse_neg <= 8'h0;    //clear the pre_pulse
        end
        else
        begin
                pre_pulse_neg <= pre_pulse_neg - 8'h1; //此处加减不重要
        end
end

assign pulse_result = pulse_result_r;
//assign irq = divide_clk;
assign pre_pulse_pos_1 = pre_pulse_pos;
assign pre_pulse_neg_1 = pre_pulse_neg;
endmodule

程序好像没有什么问题  用quartusII自带的仿真器  仿真出来的 pulse_result  为什么无输出  请教高手?
注:后两个模块调试过 没有问题,

本帖子中包含更多资源

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

x
 楼主| fight 发表于 2011-11-2 19:20:43 | 显示全部楼层
图中:neg_input和pos_input 表示程序中的两输入  pulse_neg_input 和 pulse_pos_input
result  即为pulse_result 始终输出????
风中的承诺 发表于 2011-11-4 17:14:48 | 显示全部楼层
程序写得。。。。有问题
风中的承诺 发表于 2011-11-4 17:21:22 | 显示全部楼层
程序不用加 divide_clk的上升沿,输出没有结果,是上升沿计数和下降沿计数相等吧
always @(negedge pulse_pos_input or  negedge reset_n)
begin
        if((~reset_n) | divide_clk )
        begin //复位 清零
        #8        pre_pulse_pos <= 8'h0;    //clear the pre_pulse
        end
        else
        begin
                pre_pulse_pos <= pre_pulse_pos + 8'h1;
        end
end

//计算每次在divide_clk=0时的pulse_neg_input 的输入脉冲数
always @(negedge pulse_neg_input or negedge reset_n)
begin
        if((~reset_n) | divide_clk )  //复位 清零
        begin
                pre_pulse_neg <= 8'h0;    //clear the pre_pulse
        end
        else
        begin
                pre_pulse_neg <= pre_pulse_neg - 8'h1; //此处加减不重要
        end
end
 楼主| fight 发表于 2011-11-4 21:43:08 | 显示全部楼层
回复 4# 风中的承诺

if((~reset_n) | divide_clk )  //复位 清零
        begin
                pre_pulse_neg <= 8'h0;  

divide有控制作用,必须列为敏感信号的
风中的承诺 发表于 2011-11-4 23:23:01 | 显示全部楼层
那是组合电路,时序电路不用
jahero 发表于 2011-11-4 23:48:34 | 显示全部楼层
你程序表达的意思是在 divide—clk为上跳沿时neg和pos清零 并且把neg和pos相加赋给result。


由于你在neg和pos赋值的always块中第4行写到将neg和pos置零,而result赋值的always块内在第5句将result赋值 所以result被赋值要慢于neg和pos被清零 所以result一直为零。

还有一个要注意 你的仿真#8没起作用,我希望你能告诉我为什么
 楼主| fight 发表于 2011-11-5 00:10:01 | 显示全部楼层
回复 7# jahero


    恩  以为#8能起作用  可还是不行  要不要无所谓。  当posedge divide_clk 到来时,几个快同时执行,无阻塞赋值语句产生寄存器,为什么会出现
‘’由于你在neg和pos赋值的always块中第4行写到将neg和pos置零,而result赋值的always块内在第5句将result赋值 所以result被赋值要慢于neg和pos被清零 所以result一直为零。‘’ 这种情况呢?

如果是这样,该如何改动呢?
请回复
jahero 发表于 2011-11-5 20:23:29 | 显示全部楼层
你这个产生的是d触发器 如果你非要devide——clk既控制清零又控制相加的话 你只能改用状态机了 第一状态两数相加 第二状态清零   最好清零和赋值的时钟分开 实用时一般不会被逼到非这么写不可
 楼主| fight 发表于 2011-11-8 16:12:13 | 显示全部楼层
回复 9# jahero


    能不能在以上程序中有小的改动  就能实现的?
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

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

QQ|小黑屋|手机版|Archiver|集成电路技术分享 ( 京ICP备20003123号-1 )

GMT+8, 2024-5-18 18:10 , Processed in 0.079565 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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