SOPC之占空比控制LED(小梅哥AC620)
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)相关推荐
- 基于小梅哥AC620开发板的NIOS II LWIP百兆以太网例程移植到自己做的板子上
原程序是运行在小梅哥AC620开发板上的:基于小梅哥AC620开发板的NIOS II LWIP百兆以太网例程_ZLK1214的专栏-CSDN博客_小梅哥ac620[开发板]开发板型号:小梅哥AC620 ...
- 串行DAC——基于小梅哥AC620
导读: DAC(Digital to Analog Conver ),是指将数字信号转变为模拟信号的电子元件. 分类: 电压型(TLV5618):常作为高速 DAC 使用. 电流型(AD7533): ...
- 小梅哥AC620学习记录—UART_EEPROM_part2
串口传输数据到EEPROM 解决第二步中命令解析部分的仿真后,开始搭建系统整体并进行仿真,RTL电路结构如下 rtl结构,包含I2C模块,UART发送和接收模块,命令解析模块 仿真波形记录 model ...
- 【小梅哥SOPC学习笔记】系统时钟的使用
给NIOS II CPU添加一颗澎湃的心--系统时钟的使用 本实验介绍如何在Qsys中添加一个定时器作为NIOS II的心跳定时器,并在NIOS II中软件编程使用该定时器. 将上一个实验watchd ...
- 【小梅哥SOPC学习笔记】Altera SOPC嵌入式系统设计教程
Altera SOPC嵌入式系统设计教程 第1章 概述 SOPC(System On Programmable Chip,可编程的片上系统)是Altera公司提出来的一种灵活.高效的SOC解决方案.它 ...
- 简单SOPC实例开发任务——控制led灯闪烁
任务1:基于nios ii处理器系统控制一个led灯闪烁 硬件系统: Nios ii处理器 4KB片内ROM存储器用于存储程序代码以及程序运行空间: 4KB片内RAM存储器用于变量存储(R/W数据): ...
- 基于小梅哥的Xlinx FPGA开发视频的布置作业--用串口控制一个24小时数字钟
刚看完小梅哥的视频,花了几个钟头写成了作业,就两个功能,24小时计时和用串口设置时间.默认波特率为115200,上电开始从00:00:00计时,开发板是720,漏洞坑定有,还请各位指正.话不多说上代码 ...
- 小梅哥FPGA视频教程学习总结(持续学习中……)
首先附上小梅哥FPGA视频教程链接:https://www.bilibili.com/video/BV1va411c7Dz?p=2&spm_id_from=pageDriver 小梅哥yyds ...
- 小梅哥FPGA:基于线性序列机的TLC5620型DAC驱动设计
小梅哥FPGA:基于线性序列机的TLC5620型DAC驱动设计 目标:学会使用线性序列机的思想设计常见的有串行执行特征的时序逻辑 实验现象:在QuartusⅡ软件中,使用ISSP工具,输入希望输出的电 ...
- 小梅哥FPGA学习笔记
小梅哥FPGA学习笔记 一.38译码器 功能: 译码器其任一时刻的稳态输出,仅仅与该时刻的输入变量的取值有关,它是一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象(如逻辑电平等).38 ...
最新文章
- 在注意力中重新思考Softmax:分解非线性,这个线性transformer变体实现多项SOTA
- Java的this和super关键字详解
- 一些关于流量和带宽的知识
- java 数据库工厂_月光软件站 - 编程文档 - Java - 简单的数据库连接工厂实现
- Ubuntu 下配置 NFS
- android studio 预览问题 :java.lang.NoClassDefFoundError: com/android/util/PropertiesMap
- mysql 主从复制 性能_MySQL 主从复制搭建
- 204. Count Primes 1
- 华为与Emulex、Oracle合作发布数据完整性解决方案
- JAVA中的ZoneId常用值备注
- 09.CSS3渐变、过渡、转换、动画
- 【数据库】Mysql索引究竟是什么?
- 如何能更更好的装逼 (Windows CMD命令大全)
- 一代传奇SIFT算法专利到期
- 基于android的记账APP大作业项目
- 润叶在他最低沉的时候是谁在他的身边
- 小谈应该如何对抗网络小说
- android绘制圆角矩形
- SQL server 语句运行很快,放到代码编译器中就很慢
- 黄山迎今冬“首场雾凇”,奇松怪柏摇身一变,成了玉树琼枝
热门文章
- Mac上配置svn diff为kdiff3
- 1005: 整数幂 Java
- HTTP和RPC的区别
- 移植 μC/OS-III 到 STM32
- 现有2个空水壶,容积分别为5升和6升,问题是如何只用这2个水壶从池塘里取得3升的水?水壶问题(裴蜀等式)
- 用户研究中的定性研究、定量研究
- 第十一章:项目风险管理 - (11.6 实施风险应对)
- hadoop 运行过程中出现Call to localhost/127.0.0.1:9000 failed on connection exception错误。
- 高级Java程序员必备:《IDEA问题库》常见问题及解决方案,提升开发效率2(JAVA 小虚竹)
- Ninth season fifth episode,everyone got late at Phoebe‘s birthday dinner??????