1943|1

144

帖子

0

TA的资源

版主

楼主
 

【Perf-V评测】基于Perf-V开发板的呼吸灯的行为仿真 [复制链接]

PWM全程为Pulse width Modulation(脉冲宽度调制)。本文将利用FPGA产生PWM,用来驱动LED电路。
1.    设计需求
定义一个定义脉冲宽度计数器cnt1/cnt2,分别用于产生三角波及调制波; 
定义一个标志位flag_pwm,用于pwm增减方向,0加1减;
2.    PWM代码编程
module LEDPWM(clk, rst_n, LED_PWM);
    input clk;             //clock
    input rst_n;           // rest
    output LED_PWM;   //led output
    
    reg [2:0] cnt1;      //triangle conter
    reg [2:0] cnt2;     //
    reg flag_pwm;    
    parameter T = 4;
    
    always@(posedge clk or negedge rst_n) 
        begin 
            if(!rst_n) 
                begin
                    cnt1<=3'd0;
                end 
            else 
                begin
                     if(cnt1== T-1) 
                         cnt1<=1'b0;
                     else 
                         cnt1<=cnt1+1'b1; 
                end
         end
         
    always@(posedge clk or negedge rst_n) 
        begin 
            if(!rst_n) 
                begin
                    cnt2<=3'd0;
                    flag_pwm<=1'b0;
                end 
            else 
                begin
                    if(cnt1==T-1) 
                        begin              
                            if(!flag_pwm) 
                                begin                    
                                    if(cnt2==T-1)         
                                        flag_pwm<=1'b1;
                                    else
                                        cnt2<=cnt2+1'b1;
                                end 
                            else 
                                begin                    
                                    if(cnt2==0)               
                                        flag_pwm<=1'b0;
                                    else 
                                        cnt2<=cnt2-1'b1;
                                end
                        end
                                     
                    else 
                        cnt2<=cnt2;              
                end
        end  
    assign    LED_PWM = (cnt1<cnt2)?1'b0:1'b1;  

endmodule
3.    仿真例程
准备好一份正确的PWM代码后,我们开始testbench文件编写。
新建激励文件,点击"Sources"窗口顶部的"+"按钮, 打开添加源文件对话框. 选中"Add or create simulation sources", 点击"Next"继续。
点击"Create File"按钮, 在创建源文件对话框中, 输入文件名. 点击"OK", 点击"Finish"。
双击打开" LEDPWM.v "文件, 复制" LEDPWM.v "文件中的如下内容到"sim_LEDPWM.v"的模块中。
修改sim_ LEDPWM.v"文件中,输入信号修改为"reg"类型, 编写"initial"块对输入信号进行初始化, 为时钟信号编写激励, 将"timescale" 设置为"1ns / 1ps". 最终生成的代码如下所示:
`timescale 1ns / 1ps
 module SIM_LEDPWM(

    );
     reg clk;
          reg rst_n;
          wire LED_PWM;
          
      LEDPWM SIMTEST_LEDPWM(
              .clk(clk),
              .rst_n(rst_n),
              .LED_PWM(LED_PWM)
              );
       initial begin
           clk = 0;
           rst_n = 0;
           #100;
           @(posedge clk);
           rst_n = 1;
           repeat(10) #1_000_000_000;
           $finish;
           
       end
       always #10 clk = ~clk;
endmodule
从"Source"窗口中,选中激励文件"sim_LEDPWM.v", 右键选择菜单"Set as Top", 将激励文件设置为顶层。
点击左侧"Flow Navigator"工具窗口中的"Simulation" | "Run Simulation", 点击"Run Behavioral Simulation", 运行行为仿真。

最新回复

仿真图形结果效果还行 就是用FPGA产生PWM也要码这么多代码     详情 回复 发表于 2021-3-12 16:54
点赞 关注
 

回复
举报

6802

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

仿真图形结果效果还行

就是用FPGA产生PWM也要码这么多代码

 

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表