搜索
bottom↓
回复: 9

调了半天的程序 仿真结果还是红的

[复制链接]

出0入0汤圆

发表于 2013-5-23 20:12:03 | 显示全部楼层 |阅读模式
用的modelsim6.5仿真的  不知道是怎么回事 感觉像是没有运行一样 但是测试文件写的感觉也没问题。。。求大神  毕业设计中,做的是一个步进电机的细分驱动 主程序功能有正反转 和 细分
测试文件:module test;
        reg clock;
        reg [1:0] key;
        wire [1:0] led;
        wire [3:0] pwm_out;
        step_moto uut (
                .clock(clock),
                .key(key),
                .led(led),
                .pwm_out(pwm_out)
        );

        initial
            begin
                clock = 0;
                key = 0;
                #100;
                key = 2;
            end
                always
                begin
                        #10 clock = ~clock;
                end     
endmodule

源文件:
`timescale 1ns/1ps
module step_moto(
    input clock,
    input [1:0] key,
    output [1:0] led,
    output [3:0] pwm_out
    );
reg[3:0] pwm_out_r;       
reg[3:0] p_out_r;       
reg[23:0] count;                                        //时钟分频计数器                       
reg[3:0] pwm_count;                                //PWM内部计数器
reg[3:0]cnt4;                                        //电机步进时序计数器
reg[15:0]duty_cycle;                                        //PWM占空比控制
reg dir;                                                //电机旋转方向控制
reg mode;                                        //电机控制模式
reg[1:0]dout1,dout2,dout3,buff;                                  //消抖寄存器                                                                                                                                        
wire[1:0]key_edge;                                        //按键消抖输出
wire pwm_clk;                                        //PWM计数时钟
wire speed_clk;                                        //电机转动速度控制
wire div_clk;                                        //消抖动时钟

//时钟分频部分
always @(posedge clock)                                               
begin
        count <= count + 1'b1;                                           //时钟分频计数器加一
end

assign pwm_clk = (count[6:0] == 7'h7f);                    //PWM进行7分频(2.5us)
assign div_clk = (count[15:0] == 16'hffff);                 //消抖动时钟16分频(1.3ms)
assign speed_clk = (count == 24'hffffff);                    //转速控制24分频(335ms)

//按键消抖部分
always @(posedge clock)
begin
        if(div_clk)
        begin
                dout1 <= key;                               //非阻塞,并行执行
                dout2 <= dout1;
                dout3 <= dout2;
        end       
end

//按键边沿检测部分
always @(posedge clock)
begin
        buff <= dout1 | dout2 | dout3;
end

assign key_edge = ~(dout1 | dout2 | dout3) & buff;
//按键操作部分
always @(posedge clock)                                     //按键1,控制电机正反转
begin
        if(key_edge[0])
                dir <= ~dir;                     
end

always @(posedge clock)                                     //按键2,控制电机正常运转/细分运行
begin
        if(key_edge[1])
                mode <= ~mode;
end

assign led = ~{mode,dir};                                  //输出LED指示
assign pwm_out = mode ? ~pwm_out_r : p_out_r;                //输出模块选择(细分/正常)

always @(posedge clock)                                     //电机正/反转控制
begin  
        if(speed_clk)
        begin
                if(dir == 1'b1)                                  //按键1未按下,计数器加1,电机正转
                        cnt4 <= cnt4 + 1'b1;
                else                                             //按键1按下,计数器减1,电机反转
         cnt4 <= cnt4 - 1'b1;
        end
end

always @(posedge clock)                                        //PWM波计数器
begin
        if(pwm_clk)
                pwm_count <= pwm_count + 1'b1;        //PWM内部计数器加1
end

always @(posedge clock)                                      //PWM  A通道
begin
        if (pwm_count[3:0] < duty_cycle[15:12]) //PWM内部计数器小于占空比的高4位的值
                pwm_out_r[3] <= 1'b1;
        else
                pwm_out_r[3] <= 1'b0;
end

always @(posedge clock)                                      //PWM B通道
begin
        if (pwm_count[3:0] < duty_cycle[11:8]) //PWM内部计数器小于占空比的8~11位的值       
                pwm_out_r[2] <= 1'b1;
        else
                pwm_out_r[2] <= 1'b0;
end

always @(posedge clock)                                      //PWM C通道
begin
        if (pwm_count[3:0] < duty_cycle[7:4]) //PWM内部计数器小于占空比的4~7位的值
                pwm_out_r[1] <= 1'b1;
        else
                pwm_out_r[1] <= 1'b0;
end

always @(posedge clock)                                      //PWM D通道
begin
        if (pwm_count[3:0] < duty_cycle[3:0]) //PWM内部计数器小于占空比的低4位的值
                pwm_out_r[0] <= 1'b1;
        else
                pwm_out_r[0] <= 1'b0;
end

always @(posedge clock)                                //步进电机控制时序
begin
        if(speed_clk)
        begin
                case(cnt4[1:0])
                        2'b00:p_out_r = 4'b1100;
                        2'b01:p_out_r = 4'b0110;
                        2'b10:p_out_r = 4'b0011;
                        2'b11:p_out_r = 4'b1001;
                endcase
        end
end

always @(cnt4)                                        //步进电机4细分控制PWM波参数表                               
begin
        case(cnt4)                                               
                4'h0:duty_cycle = 16'hf000;       
                4'h1:duty_cycle = 16'he600;       
                4'h2:duty_cycle = 16'hbb00;       
                4'h3:duty_cycle = 16'h6e00;       
                4'h4:duty_cycle = 16'h0f00;       
                4'h5:duty_cycle = 16'h0e60;       
                4'h6:duty_cycle = 16'h0bb0;       
                4'h7:duty_cycle = 16'h06e0;       
                4'h8:duty_cycle = 16'h00f0;       
                4'h9:duty_cycle = 16'h00e6;       
                4'ha:duty_cycle = 16'h00bb;       
                4'hb:duty_cycle = 16'h006e;       
                4'hc:duty_cycle = 16'h000f;       
                4'hd:duty_cycle = 16'h600e;       
                4'he:duty_cycle = 16'hb00b;       
                4'hf:duty_cycle = 16'he006;       
        endcase
end
endmodule


本帖子中包含更多资源

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

x

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

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

出0入0汤圆

发表于 2013-5-23 22:46:17 | 显示全部楼层
使用 modelsim仿真時, 對初始值都必須先提供狀態.

出0入0汤圆

发表于 2013-5-23 23:32:21 | 显示全部楼层
LS正解
程序必须带reset,提高信号的初始化

出0入0汤圆

 楼主| 发表于 2013-5-24 09:52:02 | 显示全部楼层
sky5566 发表于 2013-5-23 22:46
使用 modelsim仿真時, 對初始值都必須先提供狀態.

那对源程序中的 reg变量 都要初始化么?

出0入0汤圆

发表于 2013-5-24 09:53:34 | 显示全部楼层
所有使用的reg都要初始化

出0入0汤圆

 楼主| 发表于 2013-5-24 09:56:48 | 显示全部楼层
wangjun403 发表于 2013-5-24 09:53
所有使用的reg都要初始化

我有试过在测试文件中 initial 部分对 reg值全部赋0 但是出来的就只是红色的线变成绿色的线 没什么波形变化

出0入0汤圆

发表于 2013-5-24 11:02:52 | 显示全部楼层
我也被Test Bench烦死了,毕设还没搞完!你的模块分的好细啊!

出0入0汤圆

 楼主| 发表于 2013-5-24 11:03:44 | 显示全部楼层
hughqfb 发表于 2013-5-24 11:02
我也被Test Bench烦死了,毕设还没搞完!你的模块分的好细啊!

共勉 哈哈

出0入0汤圆

 楼主| 发表于 2013-5-24 11:53:23 | 显示全部楼层
但是pwm_out 的波形还是不正常 。。。

本帖子中包含更多资源

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

x

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-24 07:22

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

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