module clk_div(rst_n,clk,clkout); parameter width = 3,max=5; input rst_n,clk; output reg clkout; reg [width-1:0]q; always@(posedge clk or negedge rst_n) begin if(rst_n ==0) q<= 0; //复位 else if(q<max-1) q <= q+1;else q<=0; end always@(posedge clk or negedge rst_n) begin if(rst_n ==0) clkout<= 0; //复位 else clkout<= 1; else clkout<= 0; end endmodule module frediv_n(rst_n,clk,Rota_spe,clkout); parameter width = 7; input rst_n,clk,Rota_spe; output reg clkout; reg [width-1:0]q; always@(posedge clk or negedge rst_n) begin if(rst_n ==0) q<= 0; else if(q<99) q <= q+1;else q<=0; end always@(posedge clk or negedge rst_n) begin if(rst_n ==0) clkout<= 1; else if(Rota_spe) if( q<50) clkout<= 0; else clkout<= 1; else if( q<75) clkout<= 0; else clkout<= 1; end endmodule module motor_drive(rst_n,Rota_dir,PWM,Postive,Negtive); input rst_n,Rota_dir,PWM; output reg Postive,Negtive; always@(rst_n,Rota_dir,PWM) begin if(!rst_n) begin Postive=1;Negtive=1; end else if(Rota_dir) begin Postive=PWM;Negtive=1; end else begin Postive=1;Negtive=PWM; end end endmodule module control_motor(rst_n,clk,Rota_dir, Rota_spe,Postive,Negtive); input rst_n,clk,Rota_dir, Rota_spe; output Postive,Negtive; wire clk_wire,PWM; clk_div #(6,50) u0(rst_n,clk,clk_wire); frediv_n #(7) u1(rst_n,clk_wire,Rota_spe, PWM1); motor_drive u2(rst_n,Rota_dir,PWM1,Postive,Negtive); endmodule
时间: 2024-01-08 21:03:03 浏览: 109
clk_div5.rar_clk_div5
这是一个 Verilog HDL 的代码,实现了一个电机控制模块。该模块包含三个子模块:
1. clk_div:时钟分频器模块,用于将输入时钟分频为需要的频率,并输出分频后的时钟信号。
2. frediv_n:自由分频器模块,用于进一步分频时钟信号,并输出 PWM 信号。
3. motor_drive:电机驱动模块,接收方向控制信号和 PWM 信号,输出正向和反向的电机驱动信号。
在 control_motor 模块中,时钟信号先通过 clk_div 模块进行分频,然后再通过 frediv_n 模块进行自由分频得到 PWM 信号,最后 PWM 信号和方向控制信号一起输入到 motor_drive 模块中,产生电机驱动信号。整个模块的功能是控制电机的转速和方向。
阅读全文