这是我控制RC伺服电机的代码。该代码基本上将50MHz频率转换为1KHz。
我正在使用FPGA上的一个开关来控制电机。在开关打开之前,程序都不应该运行。 但这似乎并没有发生。我不知道我做错了什么。这可能是一个非常愚蠢的错误。
module servo(clk,rst,clk_out,switch);
input clk,rst,switch;
output reg clk_out;
reg [15:0] counter;
always @(posedge clk or posedge rst or posedge switch)
if (switch) begin
if(rst) begin
counter <=16'd0;
clk_out <= 1'b0;
end
else if(counter==16'd25000) begin
counter <=16'd0;
clk_out <= ~clk_out;
end
else begin
counter<=counter+1;
end
end
endmodule
此外,我尝试更改占空比,以便电机旋转得更快,但这似乎不起作用。
module servo (clk,rst,clk_out,switch);
input clk,rst,switch;
output reg clk_out;
reg [15:0] counter;
always @(posedge clk or posedge rst)
if(rst)
begin
counter<=16'd0;
clk_out <= 1'b0;
end
else if (switch)
begin
if(counter==16'd12500)
begin
clk_out <= 1'b1;
counter<=counter+1;
end
else
if(counter==16'd50000)
begin
counter <= 16'd0;
clk_out <= 1'b0;
end
else
begin
counter<=counter+1;
end
end
endmodule
答案 0 :(得分:1)
这是我的剪辑 - 我没有模拟它,所以要小心!
module servo(clk,rst,clk_out,switch);
input clk,rst,switch;
output reg clk_out;
reg [15:0] counter;
// clocked blocks should only have the clock and maybe a reset
// in the sensitivity list
always @(posedge clk or posedge rst) begin
if(rst) begin
counter <=16'd0;
clk_out <= 1'b0;
end
else if (switch) begin // 'switch' used as an enable
if(counter==16'd25000) begin
counter <=16'd0;
clk_out <= ~clk_out;
end
else begin
counter<=counter+1;
end
end
else begin
counter <= 16'd0;
end
end
endmodule
我做的第一件事是删除敏感列表中switch
的条目 - 对于同步逻辑,应该只有一个时钟,可能在这里重置。
逻辑的reset子句应该是第一个,所以我将switch
的测试移动到always块的主体中作为使能信号。只有switch
为高时,计数器才会运行。