hyp0707 发表于 2013-5-23 20:12:03

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

用的modelsim6.5仿真的不知道是怎么回事 感觉像是没有运行一样 但是测试文件写的感觉也没问题。。。求大神毕业设计中,做的是一个步进电机的细分驱动 主程序功能有正反转 和 细分
测试文件:module test;
        reg clock;
        reg key;
        wire led;
        wire 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 key,
    output led,
    output pwm_out
    );
reg pwm_out_r;       
reg p_out_r;       
reg count;                                        //时钟分频计数器                       
reg pwm_count;                                //PWM内部计数器
regcnt4;                                        //电机步进时序计数器
regduty_cycle;                                        //PWM占空比控制
reg dir;                                                //电机旋转方向控制
reg mode;                                        //电机控制模式
regdout1,dout2,dout3,buff;                                  //消抖寄存器                                                                                                                                      
wirekey_edge;                                        //按键消抖输出
wire pwm_clk;                                        //PWM计数时钟
wire speed_clk;                                        //电机转动速度控制
wire div_clk;                                        //消抖动时钟

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

assign pwm_clk = (count == 7'h7f);                    //PWM进行7分频(2.5us)
assign div_clk = (count == 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)
                dir <= ~dir;                     
end

always @(posedge clock)                                     //按键2,控制电机正常运转/细分运行
begin
        if(key_edge)
                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)                                      //PWMA通道
begin
        if (pwm_count < duty_cycle) //PWM内部计数器小于占空比的高4位的值
                pwm_out_r <= 1'b1;
        else
                pwm_out_r <= 1'b0;
end

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

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

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

always @(posedge clock)                                //步进电机控制时序
begin
        if(speed_clk)
        begin
                case(cnt4)
                        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


sky5566 发表于 2013-5-23 22:46:17

使用 modelsim仿真時, 對初始值都必須先提供狀態.

wangjun403 发表于 2013-5-23 23:32:21

LS正解
程序必须带reset,提高信号的初始化

hyp0707 发表于 2013-5-24 09:52:02

sky5566 发表于 2013-5-23 22:46 static/image/common/back.gif
使用 modelsim仿真時, 對初始值都必須先提供狀態.

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

wangjun403 发表于 2013-5-24 09:53:34

所有使用的reg都要初始化

hyp0707 发表于 2013-5-24 09:56:48

wangjun403 发表于 2013-5-24 09:53 static/image/common/back.gif
所有使用的reg都要初始化

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

hughqfb 发表于 2013-5-24 11:02:52

我也被Test Bench烦死了,毕设还没搞完!你的模块分的好细啊!

hyp0707 发表于 2013-5-24 11:03:44

hughqfb 发表于 2013-5-24 11:02 static/image/common/back.gif
我也被Test Bench烦死了,毕设还没搞完!你的模块分的好细啊!

共勉 哈哈

hyp0707 发表于 2013-5-24 11:53:23

但是pwm_out 的波形还是不正常 。。。

wangjun403 发表于 2013-5-24 14:40:35

波形神马的不正常,就是程序的问题了
页: [1]
查看完整版本: 调了半天的程序 仿真结果还是红的