SOPC之PWM控制

步骤一:自定义PWM IP核

所用软件Quartus13.0,由于在用Qsys中没有自带PWM相关控制IP核,所以,我们首先先自定义一个相关的PWM IP控制核。

步骤1.1新建一个IP核

首先先打开Qsys,点new comment(如下图所示):左上角蓝色标记的那个。(看不太清楚的可以放大看看)

图一.新建IP核的按键

步骤1.2定义相关的IP核内容

打开后可以看到如下图所示的界面:

图二.IP核相关定义

简单的英文介绍就不说了,应该都看的懂。这里介绍下比较重要的:
首先点File可以看到下面图:

图三.File界面 点击加号添加IP核的PWM 的Verilog文件,我先将代码放到下面等会仔细解释:

先列出相关的输入和输出引脚

输入部分 相关解释 输出部分 相关解释
clk 系统时钟 readdata 读相关数据
reset_n 复位信号 led_out led灯输出
chipselect 片选信号
address 地址线
write 写信号
writedata 写数据信号
read 读信号
module PWM(clk,reset_n,chipselect,address,write,writedata,read,byteenable,readdata,led_out);input  clk;input  reset_n;input  chipselect;input  [1:0]address;input  write;input  [31:0]  writedata;input  read;input  [3:0]  byteenable;output  [31:0]  readdata;output  led_out;reg    [31:0]  clock_divide_reg;reg    [31:0]  duty_cycle_reg;reg    control_reg;reg    duty_cycle_reg_selected;reg    clock_divide_reg_selected;reg    control_reg_selected;reg    [31:0]  led_counter;reg    [31:0]  readdata;reg    led_out;wire  led_enable;//地址译码always  @  (address)beginclock_divide_reg_selected<=0;duty_cycle_reg_selected<=0;control_reg_selected<=0;case(address)2'b00:clock_divide_reg_selected<=1;2'b01:duty_cycle_reg_selected<=1;2'b10:control_reg_selected<=1;default:beginclock_divide_reg_selected<=0;duty_cycle_reg_selected<=0;control_reg_selected<=0;endendcaseend//写led输出周期的时钟数寄存器always @ (posedge clk or negedge reset_n)beginif(reset_n==1'b0)clock_divide_reg=0;elsebeginif(write & chipselect & clock_divide_reg_selected)beginif(byteenable[0])clock_divide_reg[7:0]=writedata[7:0];if(byteenable[1])clock_divide_reg[15:8]=writedata[15:8];if(byteenable[2])clock_divide_reg[23:16]=writedata[23:16];if(byteenable[3])clock_divide_reg[31:24]=writedata[31:24];endendend
//写led周期占空比寄存器
always @ (posedge clk or negedge reset_n)
beginif(reset_n==1'b0)duty_cycle_reg=0;elsebeginif(write & chipselect & duty_cycle_reg_selected)beginif(byteenable[0])duty_cycle_reg[7:0]=writedata[7:0];if(byteenable[1])duty_cycle_reg[15:8]=writedata[15:8];if(byteenable[2])duty_cycle_reg[23:16]=writedata[23:16];if(byteenable[3])duty_cycle_reg[31:24]=writedata[31:24];endend
end
//写控制寄存器
always @ (posedge clk or negedge reset_n)
beginif(reset_n==1'b0)control_reg=0;elsebeginif(write & chipselect & control_reg_selected)beginif(byteenable[0])control_reg=writedata[0];endend
end
//读寄存器
always @ (address or read or clock_divide_reg or duty_cycle_reg or control_reg or chipselect)
beginif (read & chipselect)case(address)2'b00:readdata<=clock_divide_reg;2'b01:readdata<=duty_cycle_reg;2'b10:readdata<=control_reg;default:readdata=32'h8888;endcase
end
//控制寄存器
assign led_enable=control_reg;
//led功能部分
always @(posedge clk or negedge reset_n)
beginif(reset_n==1'b0)led_counter=0;elsebeginif(led_enable)beginif(led_counter>=clock_divide_reg)led_counter<=0;elseled_counter<=led_counter+1;endelseled_counter<=0;end
end
always @(posedge clk or negedge reset_n)
beginif(reset_n==1'b0)led_out<=1'b0;elsebeginif(led_enable)beginif(led_counter<=duty_cycle_reg)led_out<=1'b1;elseled_out<=1'b0;endelseled_out<=1'b0;end
endendmodule

注意:这个Verilog文件不要和项目工程重名,可以直接放到工程文件的目录里,但是不要直接加进工程。
文件加进去后,要先分析下看是否有相关错误,如果没有错误应该如下图所示:

图四.分析文件图

在看下Avalon总线的信号连接是否出现错误,一般应该是这样子的:

图五.Avalon总线信号接口图

注意led要输出还有,Interface的rest信号要自己加上,如下图所示:

图六.复位信号指示图

步骤1.3Qsys总图接口连接

接下来就是把该添加的添加,该连接的连接,如图照着连就行:

图七.Avalon总线连接图

OK,连接好后就是编写quartus代码了。

步骤二:编写PWMVerilog顶层文件代码

先放代码

module PWM_LED(input  wire        clk,                           //                        clk.clkinput  wire        reset_n,                     //                      reset.reset_noutput wire        sdram_clk,                     //                  sdram_clk.clkoutput wire [11:0] sdram_addr,                        //                      sdram.addroutput wire [1:0]  sdram_ba,                          //                           .baoutput wire        sdram_cas_n,                       //                           .cas_noutput wire        sdram_cke,                         //                           .ckeoutput wire        sdram_cs_n,                        //                           .cs_ninout  wire [15:0] sdram_dq,                          //                           .dqoutput wire [1:0]  sdram_dqm,                         //                           .dqmoutput wire        sdram_ras_n,                       //                           .ras_noutput wire        sdram_we_n,                         //                           .we_noutput wire        pwm_out);PWM_led u0 (.clk_clk                      (clk),                      //                   clk.clk.reset_reset_n                (reset_n),                //                 reset.reset_n.pwm_led_0_conduit_end_export (pwm_out), // pwm_led_0_conduit_end.export.sdram_clk_clk                (sdram_clk),                //             sdram_clk.clk.sdram_addr                   (sdram_addr),                   //                 sdram.addr.sdram_ba                     (sdram_ba),                     //                      .ba.sdram_cas_n                  (sdram_cas_n),                  //                      .cas_n.sdram_cke                    (sdram_cke),                    //                      .cke.sdram_cs_n                   (sdram_cs_n),                   //                      .cs_n.sdram_dq                     (sdram_dq),                     //                      .dq.sdram_dqm                    (sdram_dqm),                    //                      .dqm.sdram_ras_n                  (sdram_ras_n),                  //                      .ras_n.sdram_we_n                   (sdram_we_n)                    //                      .we_n);endmodule

记得在项目中要添加Qsys文件,有同学不知道添加哪个,直接添加后缀名为qsys就行。
添加完后,先编译,再引脚设置,这里放下引脚接口图(AC620):

看不清可以放大看,设置好后编译。

步骤三:NIOSII代码编写:


#include <io.h>
#include <string.h>
#include <sys/unistd.h>
#include <stdio.h>    //printf的头文件
#include "system.h"
#include "alt_types.h"
#include "sys/alt_irq.h"#define clk100m 100000000int main()
{int freq=1000;float duty=0.5;alt_u32 n_high;alt_u32 n_low;printf("Hellow PWM IP LED!");while(1){if(duty<1)duty =duty+0.06;if(duty>=1)duty=0.1;n_high=(alt_u32)((clk100m/freq)*duty);n_low=(alt_u32)((clk100m/freq)*(1-duty));IOWR_32DIRECT(PWM_LED_0_BASE , 0*4, n_high);IOWR_32DIRECT(PWM_LED_0_BASE , 1*4, n_low);IOWR_32DIRECT(PWM_LED_0_BASE , 2*4, 1);usleep(400000);}return 0;
}

最后编译下载就行。

SOPC之占空比控制LED(小梅哥AC620)相关推荐

  1. 基于小梅哥AC620开发板的NIOS II LWIP百兆以太网例程移植到自己做的板子上

    原程序是运行在小梅哥AC620开发板上的:基于小梅哥AC620开发板的NIOS II LWIP百兆以太网例程_ZLK1214的专栏-CSDN博客_小梅哥ac620[开发板]开发板型号:小梅哥AC620 ...

  2. 串行DAC——基于小梅哥AC620

    导读: DAC(Digital to Analog Conver ),是指将数字信号转变为模拟信号的电子元件. 分类: 电压型(TLV5618):常作为高速 DAC 使用. 电流型(AD7533): ...

  3. 小梅哥AC620学习记录—UART_EEPROM_part2

    串口传输数据到EEPROM 解决第二步中命令解析部分的仿真后,开始搭建系统整体并进行仿真,RTL电路结构如下 rtl结构,包含I2C模块,UART发送和接收模块,命令解析模块 仿真波形记录 model ...

  4. 【小梅哥SOPC学习笔记】系统时钟的使用

    给NIOS II CPU添加一颗澎湃的心--系统时钟的使用 本实验介绍如何在Qsys中添加一个定时器作为NIOS II的心跳定时器,并在NIOS II中软件编程使用该定时器. 将上一个实验watchd ...

  5. 【小梅哥SOPC学习笔记】Altera SOPC嵌入式系统设计教程

    Altera SOPC嵌入式系统设计教程 第1章 概述 SOPC(System On Programmable Chip,可编程的片上系统)是Altera公司提出来的一种灵活.高效的SOC解决方案.它 ...

  6. 简单SOPC实例开发任务——控制led灯闪烁

    任务1:基于nios ii处理器系统控制一个led灯闪烁 硬件系统: Nios ii处理器 4KB片内ROM存储器用于存储程序代码以及程序运行空间: 4KB片内RAM存储器用于变量存储(R/W数据): ...

  7. 基于小梅哥的Xlinx FPGA开发视频的布置作业--用串口控制一个24小时数字钟

    刚看完小梅哥的视频,花了几个钟头写成了作业,就两个功能,24小时计时和用串口设置时间.默认波特率为115200,上电开始从00:00:00计时,开发板是720,漏洞坑定有,还请各位指正.话不多说上代码 ...

  8. 小梅哥FPGA视频教程学习总结(持续学习中……)

    首先附上小梅哥FPGA视频教程链接:https://www.bilibili.com/video/BV1va411c7Dz?p=2&spm_id_from=pageDriver 小梅哥yyds ...

  9. 小梅哥FPGA:基于线性序列机的TLC5620型DAC驱动设计

    小梅哥FPGA:基于线性序列机的TLC5620型DAC驱动设计 目标:学会使用线性序列机的思想设计常见的有串行执行特征的时序逻辑 实验现象:在QuartusⅡ软件中,使用ISSP工具,输入希望输出的电 ...

  10. 小梅哥FPGA学习笔记

    小梅哥FPGA学习笔记 一.38译码器 功能: 译码器其任一时刻的稳态输出,仅仅与该时刻的输入变量的取值有关,它是一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象(如逻辑电平等).38 ...

最新文章

  1. 在注意力中重新思考Softmax:分解非线性,这个线性transformer变体实现多项SOTA
  2. Java的this和super关键字详解
  3. 一些关于流量和带宽的知识
  4. java 数据库工厂_月光软件站 - 编程文档 - Java - 简单的数据库连接工厂实现
  5. Ubuntu 下配置 NFS
  6. android studio 预览问题 :java.lang.NoClassDefFoundError: com/android/util/PropertiesMap
  7. mysql 主从复制 性能_MySQL 主从复制搭建
  8. 204. Count Primes 1
  9. 华为与Emulex、Oracle合作发布数据完整性解决方案
  10. JAVA中的ZoneId常用值备注
  11. 09.CSS3渐变、过渡、转换、动画
  12. 【数据库】Mysql索引究竟是什么?
  13. 如何能更更好的装逼 (Windows CMD命令大全)
  14. 一代传奇SIFT算法专利到期
  15. 基于android的记账APP大作业项目
  16. 润叶在他最低沉的时候是谁在他的身边
  17. 小谈应该如何对抗网络小说
  18. android绘制圆角矩形
  19. SQL server 语句运行很快,放到代码编译器中就很慢
  20. 黄山迎今冬“首场雾凇”,奇松怪柏摇身一变,成了玉树琼枝

热门文章

  1. Mac上配置svn diff为kdiff3
  2. 1005: 整数幂 Java
  3. HTTP和RPC的区别
  4. 移植 μC/OS-III 到 STM32
  5. 现有2个空水壶,容积分别为5升和6升,问题是如何只用这2个水壶从池塘里取得3升的水?水壶问题(裴蜀等式)
  6. 用户研究中的定性研究、定量研究
  7. 第十一章:项目风险管理 - (11.6 实施风险应对)
  8. hadoop 运行过程中出现Call to localhost/127.0.0.1:9000 failed on connection exception错误。
  9. 高级Java程序员必备:《IDEA问题库》常见问题及解决方案,提升开发效率2(JAVA 小虚竹)
  10. Ninth season fifth episode,everyone got late at Phoebe‘s birthday dinner??????