input clk,clr,d //这些是作为输入
output q//这些是作为输出
reg q//q在作为寄存器类的输出,就是说可以用<= 箭头赋值(见下面)
always @(posedge clr) //posedge:上升沿。就是说在clr信号的上升沿的时候都会触发这个 *** 作
begin //可以忽略,就是多条语句在一块的时候要用
q<=0 //清0
end
always @(necedge clk) //negedge:下降沿,你肯定拼错了 ,在clk下降沿的时候触发
begin
#10 q<=d //延迟10个单位,这个在#timescale那里定义,这个只在仿真的时候有用,在器件上的时候不能这样做延迟
end
endmodule
很简单啊,你按不同的相位采集存到寄存器就可以了。比如你的pwm的精度是1024/周期,那么24个相位的间隔就是1024/24 = 42.666。那么你可以首先把整个周期都存下来,每隔43个左右输出一路。reg [1023:0] wave_reg
always@(posedge clk)
wave_reg <={ wave_reg[1022:0],pwm_wave}//把整个波形都存下来,但是可能比较耗寄存器。
assignwave_out[0] = wave_reg[0]
assignwave_out[1] = wave_reg[43]//有时候加43,有时候加42,保证到后面刚好。
……
assign wave_out[23] = wave_reg[981]
但是这种做法大概会消耗1024个寄存器,随着pwm精度的提高,这个消耗会提高。
如果你只存半个周期,而由于正弦波是基对称的,
assign wave_out[12] = ~wave_out[0]
……
assign wave_out[23] = ~wave_out[11]
这样会少一半的寄存器。
第1部分除了初始化外, 由div1对clk10m计数,计到78164置0,同时clk1hz翻转一次.后面依此类推, 利用div2对clk10m计到156,clk500hz翻转一次,div3对clk10m计到78,clk800hz翻转一次.
最后三个赋值就是端口输出了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)