【Perf-V评测】基于Perf-V开发板的呼吸灯的行为仿真
<p>PWM全程为Pulse width Modulation(脉冲宽度调制)。本文将利用FPGA产生PWM,用来驱动LED电路。<br />1. 设计需求<br />
定义一个定义脉冲宽度计数器cnt1/cnt2,分别用于产生三角波及调制波; <br />
定义一个标志位flag_pwm,用于pwm增减方向,0加1减;<br />
2. PWM代码编程<br />
module LEDPWM(clk, rst_n, LED_PWM);<br />
input clk; //clock<br />
input rst_n; // rest<br />
output LED_PWM; //led output<br />
<br />
reg cnt1; //triangle conter<br />
reg cnt2; //<br />
reg flag_pwm; <br />
parameter T = 4;<br />
<br />
always@(posedge clk or negedge rst_n) <br />
begin <br />
if(!rst_n) <br />
begin<br />
cnt1<=3'd0;<br />
end <br />
else <br />
begin<br />
if(cnt1== T-1) <br />
cnt1<=1'b0;<br />
else <br />
cnt1<=cnt1+1'b1; <br />
end<br />
end<br />
<br />
always@(posedge clk or negedge rst_n) <br />
begin <br />
if(!rst_n) <br />
begin<br />
cnt2<=3'd0;<br />
flag_pwm<=1'b0;<br />
end <br />
else <br />
begin<br />
if(cnt1==T-1) <br />
begin <br />
if(!flag_pwm) <br />
begin <br />
if(cnt2==T-1) <br />
flag_pwm<=1'b1;<br />
else<br />
cnt2<=cnt2+1'b1;<br />
end <br />
else <br />
begin <br />
if(cnt2==0) <br />
flag_pwm<=1'b0;<br />
else <br />
cnt2<=cnt2-1'b1;<br />
end<br />
end<br />
<br />
else <br />
cnt2<=cnt2; <br />
end<br />
end <br />
assign LED_PWM = (cnt1<cnt2)?1'b0:1'b1; </p>
<p>endmodule<br />
3. 仿真例程<br />
准备好一份正确的PWM代码后,我们开始testbench文件编写。<br />
新建激励文件,点击"Sources"窗口顶部的"+"按钮, 打开添加源文件对话框. 选中"Add or create simulation sources", 点击"Next"继续。<br />
点击"Create File"按钮, 在创建源文件对话框中, 输入文件名. 点击"OK", 点击"Finish"。<br />
双击打开" LEDPWM.v "文件, 复制" LEDPWM.v "文件中的如下内容到"sim_LEDPWM.v"的模块中。<br />
修改sim_ LEDPWM.v"文件中,输入信号修改为"reg"类型, 编写"initial"块对输入信号进行初始化, 为时钟信号编写激励, 将"timescale" 设置为"1ns / 1ps". 最终生成的代码如下所示:<br />
`timescale 1ns / 1ps<br />
module SIM_LEDPWM(</p>
<p> );<br />
reg clk;<br />
reg rst_n;<br />
wire LED_PWM;<br />
<br />
LEDPWM SIMTEST_LEDPWM(<br />
.clk(clk),<br />
.rst_n(rst_n),<br />
.LED_PWM(LED_PWM)<br />
);<br />
initial begin<br />
clk = 0;<br />
rst_n = 0;<br />
#100;<br />
@(posedge clk);<br />
rst_n = 1;<br />
repeat(10) #1_000_000_000;<br />
$finish;<br />
<br />
end<br />
always #10 clk = ~clk;<br />
endmodule<br />
从"Source"窗口中,选中激励文件"sim_LEDPWM.v", 右键选择菜单"Set as Top", 将激励文件设置为顶层。<br />
点击左侧"Flow Navigator"工具窗口中的"Simulation" | "Run Simulation", 点击"Run Behavioral Simulation", 运行行为仿真。</p>
<p></p>
<p>仿真图形结果效果还行</p>
<p>就是用FPGA产生PWM也要码这么多代码</p>
<p> </p>
页:
[1]