input clk , //时钟输入,可在外部设置不同时钟
input rst_n , //低电平复位
input [7:0] f , //频率控制,最大255
input [7:0] d , //占空比控制字,上限100
output pwm_out //PWM输出
)
reg [17:0] count //计数
always @(posedge clk or negedge rst_n) begin
if(~rst_n) begin
count <= 0
end
else if(count >= 17'd100_000) //计数到100K清零
count <= 0
else
count <= count + f //每次累加频率值
end
assign pwm_out = (count <d*1000)? 1:0 //PWM输出
endmodule
思路就是倍频累加,剩下的拨码开关程序自己想一下吧。
例如输入时钟100M,频率设为20的时候,计数100K,每次加20,输出频率就是100M/(100K/20)=20K,占空比你一看就明白
至于输入时钟,用Tools->Megawizard Plug-In Manager->I/O->ALTPLL模块设置PLL分频,倍频即可
学always循环体怎么用, 掌握时序电路的写法. 你上面的都是组合电路.
也可用dff或dffe直接例化d触发器, 格式大致是d1 dff (.clk(??), .d(??), .q(??), .clr(??), .set(??) ).
得引入时钟信号,触发d>q的传递.
初学verilog, 综合(编译)过程中所有的warning都要视为error一一消除. 除非你非常熟练知道每个warning确实不会影响结果.
初学verilog, 综合完,在菜单内找RTL viewer看看电路框图,是不是你设想的形式.语法精通后不必看.
RTL无误后进行仿真. 先功能,后时序,都没问题即可写入FPGA了.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)