跑马灯实验的第一部分记录:

1. vivado 2018.2的HLS在跑C/RTL co-simulation的时候,一直报错,不论是用modelsim 还是vivado自带的similator。使用vivado 2015.4的HLS没有问题。

2. modelsim 我用的是10.1c版本,vivado 2018.2对modelsim支持至少是10.5以上。

3. 在vivado hls跑co-simulation未结束的情况下,打开modelsim会报错。等协同仿真跑完,再用modelsim打开波形文件。

4. Vivado 2015.4的HLS做的IP核,在VIvado 2018.2中是可以使用的。

打开Vivado HLS,新建一个工程。

  工程位置和名称自定义,一直点下一步,中间添加到文件暂时不用添加,直到出现下面一步。在part selection中选好芯片型号,时钟周期 Clock Period 按照默认 10ns,Uncertaintly 和 Solution Name 均按照默认设置,然后点击 finish。

  一个建立好的工程如下图所示。

  在工程左侧添加如下空文件。

代码:

main.c

#include "shift_led.h"
#include <stdio.h> using namespace std; int main()
{
led_t led_o;
led_t led_i = 0xFE;//1111_1110
const int SHIFT_TIME = ;
int i;
for(i = ;i < SHIFT_TIME;i++)
{
shift_led(&led_o,led_i);
led_i = led_o;
char string[];
itoa((unsigned int)led_o&0xFF,string,);//&oxFF是为了取led_o的8位,转化为二进制数出
if(i == )
fprintf(stdout,"shift_out= 0%s\n",string);//数据对齐,高位补零
else
fprintf(stdout,"shift_out= %s\n",string);
}
}
#ifndef _SHIFT_LED_H_
#define _SHIFT_LED_H_ #include "ap_int.h" #define MAX_CNT 100000000/2
#define SHIFT_FLAG MAX_CNT-2 typedef ap_fixed<,> led_t;
typedef ap_fixed<,> cnt32_t; void shift_led(led_t *led_o,led_t led_i); #endif

shift_led.cpp

#include "shift_led.h"

void shift_led(led_t *led_o,led_t led_i)
{
#pragma HLS INTERFACE ap_ovld port=led_o
#pragma HLS INTERFACE ap_ovld port=led_o
#pragma HLS INTERFACE ap_vld port=led_i led_t tmp_led;
cnt32_t i;
tmp_led = led_i;
for(i = ;i < MAX_CNT;i++)
{
if(i==SHIFT_FLAG)
{
tmp_led = ((tmp_led>>)&0x01) + ((tmp_led<<)&0xFE);
*led_o = tmp_led;
}
}
}

代码综合步骤:

步骤一:点击 Project -> Project Settings, 在 Synthesis 界面下选择综合的顶层函数名。 单击 Browse 指定工程的顶层文件, 最后单击 OK 完成修改。

步骤二:因为当前工程中只存在一个 Solution(解决方案) , 我们右键选择 Solution –> Run C Synthesis–>Active Solutions 或者直接点击 绿色三角进行综合, 等待一段时间, 在经过优化的情况下综合报告如图所示(未经优化就是没有加任何#pragma的), 我们可以看到 FF 和 LUT 分别使用了 37 和 140。 

步骤三:单击solution->Open Analysis Perspective打开分析报告

  在 shift_led.h 文件中我们包含一个设置 int 自定义位宽的头文件"ap_int.h", 我们使用ap_fixed()函数自定义 int 型的 bit 数, 其函数原型为:
ap_int_sim.h中class ap_fixed: public ap_fixed_base<_AP_W, _AP_I, true, _AP_Q, _AP_O, _AP_N> 。

  ap_fixed<M,N>,第一个 M 代表数据总位宽, N 代表数据整数部分的位宽, 那么小数部分的位宽即 M – N; 头文件中的第6和7行代码体现了ap_fixed的用法!
步骤四:优化端口

  现在把所有的#pragma都删除掉,可以看到右侧的Derective是没有指令的,只显示了一些端口信息。

右键led_o,插入directive。

  因为 led_o 是接口, 所以 Directive 我们选择为 INTERFACE,Destination 选择为 Source File。Source File 是针对所有的 Solution 采用同一个优化手段, 而 Directive File 是对当前的 Solution 有效, mode(optional)我们选为 ap_ovld,即输出使能。 对 led_i 进行同样的约束, 并选择输入使能,ap_vld。 我们再次综合,就可得到前面步骤二的经过优化后的报告了。
仿真实现步骤:

步骤一:单击 Project 下的 Run C Simulation

步骤二:单击 Solution 下的 Run C/RTL cosimulation 运行协同仿真。

步骤三:使用Modelsim打开sim->verilog->wave.wlf文件,添加interface信号。

打包HLS代码成IP核步骤:

步骤一:单击 Solution 菜单下的 Export RTL 或直接单击 那个“田”的按钮导出 RTL 级。

  这个压缩包就是我们在后面Vivado中建立工程要用的。

  建立Vivado工程,添加顶层文件和约束文件。

module shift_led
#(
parameter DATA_WIDTH =
)
(
input i_clk,
input i_rst_n,
output reg [DATA_WIDTH-:] led
); reg [:] cnt ;
reg [DATA_WIDTH-:] led_i_V ;
wire ap_start ;
wire led_i_vld;
wire [DATA_WIDTH-:] led_o_V ; always@(posedge i_clk or negedge i_rst_n)begin
if(i_rst_n == 'b0)
cnt <= 'd0;
else if(cnt[]=='b0)
cnt <= cnt + 'b1;
end always@(posedge i_clk or negedge i_rst_n)begin
if(i_rst_n == 'b0)
led_i_V <= 'd0;
else if(cnt[]=='b1)
led_i_V <= 'h1;
else if(led_o_vld == 'b1)
led_i_V <= led_o_V;
end always@(posedge i_clk or negedge i_rst_n)begin
if(i_rst_n == 'b0)
led <= 'b0;
else if(led_o_vld == 'b1)
led <= led_o_V;
end assign ap_start = cnt[];
assign led_i_vld = cnt[]; shift_led_0 u_shift_led_0(
.led_o_V_ap_vld (led_o_vld),// output wire led_o_vld
.led_i_V_ap_vld (led_i_vld),// input wire led_i_vld
.ap_clk (i_clk ),// input wire ap_clk
.ap_rst (~i_rst_n ),// input wire ap_rst
.ap_start (ap_start ),// input wire ap_start
.ap_done ( ),// output wire ap_done
.ap_idle ( ),// output wire ap_idle
.ap_ready ( ),// output wire ap_ready
.led_i_V (led_i_V ),// output wire [7 : 0] led_o_V
.led_o_V (led_o_V ) // input wire [7 : 0] led_i_V
); endmodule

开发板现象:

HLS:跑马灯实验的更多相关文章

  1. S3C2410 实验三——跑马灯实验

    http://www.evernote.com/shard/s307/sh/f2a748e7-34c4-4ce6-acac-82a756cc9e82/ad5813188d655e504857970db ...

  2. STM32开发指南-跑马灯实验

    简单对I/O口的控制,主要通过对寄存器的读写控制.主要通过I/O的寄存器来控制:1. 控制I/O的方向2. 控制I/O的输出电平或上下来电阻3. 存储I/O口当前的输入状态(高低电平) 对使用LED灯 ...

  3. STM32F407 跑马灯实验

    1.库函数版本调用的函数有哪些?对应的源文件/头文件是哪个? 库函数 源文件 头文件 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE) stm3 ...

  4. STM32-跑马灯实验

    实验环境: STM32开发板 Keil uVision4 FlyMcu.exe 一. 建立文件夹 1.建立跟文件夹"BASE"(名称任意),再在其下建立四个子文件夹 2. 在&qu ...

  5. 【STM32H7教程】第18章 STM32H7的GPIO应用之跑马灯

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第18章       STM32H7的GPIO应用之跑马灯 本 ...

  6. GPIO原理与配置(跑马灯,蜂鸣器,按键)

    一.STM32 GPIO固件库函数配置方法 1. 根据需要在项目中删掉一些不用的固件库文件,保留有用的固件库文件 2. 在stm32f10x_conf.h中注释掉这些不用的头文件 3. STM32的I ...

  7. 嵌入式02 STM32 实验04跑马灯

    开学STM32 跑马灯的实验主要就是了解GPIO口的配置及使用,我这里是使用库函数进行编程,主要需要设置以下两方面: 1.使能需要使用的IO口的时钟,一共有A.B.C.D.E.F.G七组IO口 2.初 ...

  8. ARM开发(1) 基于STM32的LED跑马灯

    一 跑马灯原理:  1.1 本实验实现2个led的跑马灯效果,即2个led交替闪烁.  1.2 实验思路:根据电路图原理,给led相关引脚赋予高低电平,实现电路的导通,使led灯发光.  1.3 开发 ...

  9. STM32F4寄存器编写跑马灯例程

    最近由于在学习STM32看到别人用寄存器编程控制跑马灯,于是自己也想试一试.可是试了好久终究弄不出来.回头看了下库函数的调用关系才搞明白.首先通过查看GPIOA的设置函数发现设置如下: void GP ...

随机推荐

  1. iconv用法解读

    iconv是一个字符集转换函数,原型为: size_t iconv(iconv_t cd,              char **inbuf, size_t *inbytesleft,       ...

  2. HDU1102&&POJ2421 Constructing Roads 2017-04-12 19:09 44人阅读 评论(0) 收藏

    Constructing Roads Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) ...

  3. 用U盘安装Ubuntu主系统

    用U盘安装Ubuntu主系统 0. 学习Ubuntu系统的的动机 ubuntu系统的内核是linux系统,通过Ubuntu的学习,掌握lInux服务器搭建!!!! 硬件要求:闲置的笔记本  +  U盘 ...

  4. Python + selenium + unittest装饰器 @classmethod

    前言 前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间. 于是就想是不是可以 ...

  5. [label][JavaScript][The Defined Guide of JavaScript] 如何声明变量

    因为觉得我自己的JavaScript基础很不扎实,或者可以说根本就没有所谓基础,所以就最近一直在看<The Defined Guide of JavaScript> . 在一边看的同时,我 ...

  6. 《全民无双》锁链刀光程序生成算法,即U3D——刀光轨迹插件的改进

    <全民无双>手游12月17日上线登录APPSTore付费榜前十,首先特别恭喜还在<全民无双>坚持奋战的老同事们,顺便技术分享一下以前参与项目时的工作 锁链刀软武器刀光轨迹 之前 ...

  7. testNG的高级用法 --DataProvider

    @DataProvider Method参数 数据提供者的第一个参数是java.lang.reflect.Method,TestNG传递这个将调用的测试方法.如果您希望数据提供者根据不同的测试方法返回 ...

  8. stringBuilder类的一些用法

    对String对象进行处理的时候比如拼接.截取,会在内存中新建很多字符串对象.为了减少内存开支,可以使用StringBuilder类型. 创建StringBuiler实例: 用构造函数直接创建: St ...

  9. asp.net——上传图片生成缩略图

    上传图片生成缩略图,原图和缩略图地址一样的时候缩略图会把原图覆盖掉 /// <summary> /// 生成缩略图 /// </summary> /// <param n ...

  10. SQL Server 数据库的分类和用户数据库文件组成

      数据库的分类       数据库分为两大类,一类是系统数据库:另一类是用户数据库,系统数据库我们一般使用的时候较少, 下面我们看看系统数据库包含哪些并分别有什么作用,如下图所示 用户数据库文件组成 ...