32MHZ的时钟,在FPGA中用Verilog语言编写一个5us的死区程序,请教各位大神有相似的例子能发我一份吗

32MHZ的时钟,在FPGA中用Verilog语言编写一个5us的死区程序,请教各位大神有相似的例子能发我一份吗,第1张

module d_asyn(clk,clr,d,q)//模块输入输出口,共四个信号,每个都是1bit的

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翻转一次.

最后三个赋值就是端口输出了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8039122.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存