调了半天的程序 仿真结果还是红的
用的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
使用 modelsim仿真時, 對初始值都必須先提供狀態. LS正解
程序必须带reset,提高信号的初始化 sky5566 发表于 2013-5-23 22:46 static/image/common/back.gif
使用 modelsim仿真時, 對初始值都必須先提供狀態.
那对源程序中的 reg变量 都要初始化么? 所有使用的reg都要初始化 wangjun403 发表于 2013-5-24 09:53 static/image/common/back.gif
所有使用的reg都要初始化
我有试过在测试文件中 initial 部分对 reg值全部赋0 但是出来的就只是红色的线变成绿色的线 没什么波形变化 我也被Test Bench烦死了,毕设还没搞完!你的模块分的好细啊! hughqfb 发表于 2013-5-24 11:02 static/image/common/back.gif
我也被Test Bench烦死了,毕设还没搞完!你的模块分的好细啊!
共勉 哈哈 但是pwm_out 的波形还是不正常 。。。 波形神马的不正常,就是程序的问题了
页:
[1]