基于FPGA实现LED的闪烁——HLS

工具
Vivado 2018.3

一、HLS的介绍

  1. HLS的概念
    HLS是一款高层次综合工具,可以帮助开发者加快开发效率。开发者可以通过HLS将C/C++等高级语言转换为RTL电路。尤其,在对于一些比较复杂的算法的时候,能够提供较大的便利。
  2. HLS与VHDL/Verilog
    VHDL/Verilog对于一些算法比较简单,开发周期不长的来说是比较适用的,然而,一个开发过程,往往算法会比较复杂,并且可能会经历较长时间的仿真和调试,面对这样的问题,提出了HLS。通过高级语言编程,来实现功能模块,这样就会大大提供开发效率。
  3. HLS的关键技术
    通过高级语言实现功能,并转换为RTL电路。实际上HLS相对于一个IP生成器。
  4. 技术局限性
    对于人工智能方面来说,HLS在开发上,还是比较困难的,需要有强大的C/C++的编程能力,从而,来实现功能。

二、实现HLS的环境配置

安装vivado的参考链接:
https://blog.csdn.net/qq_43279579/article/details/116849636
对于vivado的安装,就已经自动完成了HLS

三、HLS的实例——Led点亮

  1. 创建一个HLS工程
    ①打开Vivado HLS,点击Create New Project
    在这里插入图片描述
    ②输入相关工程信息
    在这里插入图片描述
    ③选择顶层函数,此处暂不管
    在这里插入图片描述
    ④选择添加C仿真文件,此处可以暂时不管
    在这里插入图片描述
    ⑤选择器件
    在这里插入图片描述
  2. 添加文件
    ①源文件添加
    点击Source,右键后,选择New File,创建文件
    led.h
    #ifndef _SHIFT_LED_H_
    #define _SHIFT_LED_H_
    
    #include "ap_int.h"
    #define CNT_MAX 100000000
    //#define CNT_MAX 100,100M时钟频率下计数一秒钟所需要的计数次数
    #define FLASH_FLAG CNT_MAX-2
    // typedef int led_t;
    // typedef int cnt_t;
    typedef ap_int<1> led_t;
    typedef ap_int<32> cnt_t;
    void flash_led(led_t *led_o , led_t led_i);
    
    #endif
    
    led.cpp
    #include "led.h"
    
    void flash_led(led_t *led_o , led_t led_i){
    #pragma HLS INTERFACE ap_vld port=led_i
    #pragma HLS INTERFACE ap_ovld port=led_o
    	cnt_t i;
    	for(i=0;i<CNT_MAX;i++){
    		if(i==FLASH_FLAG){
    			*led_o = ~led_i;
    		}
    	}
    }
    
    ②仿真测试文件添加
    右键Test Bench,选择New File
    test_led.cpp
    #include "led.h"
    #include <stdio.h>
    
    int main(){
    
    	led_t led_i=0x01;
    	led_t led_o;
    	const int SHIFT_TIME = 4;
    	int i;
    	for(i=0;i<SHIFT_TIME;i++){
    		flash_led(&led_o , led_i);
    		led_i = led_o;
    		printf("shift_out is %d \n",(int)(led_o&0x01));
    	}
    }
    
  3. C仿真与C综合
    ①点击project->project settings->synthesis->browser->选择顶层函数
    在这里插入图片描述
    ②点击project->Run C Simulation(输出01交替,表示C仿真结果正确)
    在这里插入图片描述
    ③点击Solution->Run C Synthesis->Active Solution
    在这里插入图片描述
  4. 创建Vivado工程
    ①打开Vivado,选择Greate Project
    在这里插入图片描述
    ②点击Next,进行项目信息填写
    在这里插入图片描述
    ③勾选RTL Project
    在这里插入图片描述
    ④Source和约束文件添加,暂时不管,直接Next
    ⑤选择器件

    ⑥点击Finish
    在这里插入图片描述
  5. 导入HLS生成的IP核
    ①生成IP核
    选择Solution->Export RTL
    在这里插入图片描述
    ②导入
    点击setting
    在这里插入图片描述
    选择IP->Repository,并且点击加号,选择solution,将会自动识别到IP,识别到后,点击Apply->OK
    在这里插入图片描述
    检验是否导入成功
    在这里插入图片描述
    生成IP
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  6. 添加实验代码
    ①选择Add Sources
    在这里插入图片描述
    ②文件名称填写
    在这里插入图片描述
    ③代码内容
    `timescale 1ns / 1ps
    module flash_led(
    input wire clk ,
    input wire rst_n ,
    output wire led_o
    );
     
    wire rst ;//同步复位
    wire ap_ready ;//当前可以接收下一次数据
    reg ap_start ;//IP 开始工作
    reg led_i_vld ;//输入数据有效
    wire led_o_vld ;
    reg led_i ;//输入的 led 信号
    wire led_o_r ;
    wire ap_done ;
    wire ap_idle ;
    reg [1:0] delay_cnt ;
    assign rst = ~rst_n ;
    assign led_o = led_o_r ;
     
    //----------------delay_cnt------------------
    always @(posedge clk) begin
    if (rst==1'b1) begin
    delay_cnt <= 'd0;
    end
    else if(delay_cnt[1]==1'b0) begin
    delay_cnt <= delay_cnt + 1'b1;
    end
    end
     
    //----------------ap_start------------------
    always @(posedge clk) begin
    if (rst==1'b1) begin
    ap_start <= 1'b0;
    end
    else if(delay_cnt[1]==1'b1)begin
    ap_start <= 1'b1;
    end
    end
     
    //----------------led_i_vld------------------
    always @(posedge clk) begin
    if (rst==1'b1) begin
    led_i_vld <= 1'b0;
    end
    else if(delay_cnt[1]==1'b1)begin
    led_i_vld <= 1'b1;
    end
    end
     
    //----------------ap_i------------------
    always @(posedge clk) begin
    if (rst==1'b1) begin
    led_i <= 1'b0;
    end
    else if(led_o_vld==1'b1)begin
    led_i <= led_o_r ;
    end
    end
     
     
    flash_led_0 inst_flash_led (
    .led_o_V_ap_vld(led_o_vld), // output wire led_o_V_ap_vld
    .led_i_V_ap_vld(led_i_vld), // input wire led_i_V_ap_vld
    .ap_clk(clk), // input wire ap_clk
    .ap_rst(rst), // input wire ap_rst
    .ap_start(ap_start), // input wire ap_start
    .ap_done(ap_done), // output wire ap_done
    .ap_idle(ap_idle), // output wire ap_idle
    .ap_ready(ap_ready), // output wire ap_ready
    .led_o_V(led_o_r), // output wire [0 : 0] led_o_V
    .led_i_V(led_i) // input wire [0 : 0] led_i_V
    ); 
    endmodule
    
  7. 约束文件编写
    ①创建约束文件
    在这里插入图片描述
    ②填写相关文件信息
    在这里插入图片描述
    ③代码内容
    ##############LED define################## 
    set_property PACKAGE_PIN P15 [get_ports {led_o}] 
    set_property IOSTANDARD LVCMOS33 [get_ports {led_o}]
    
    ##############Reset define################## 
    set_property PACKAGE_PIN P16 [get_ports {rst_n}] 
    set_property IOSTANDARD LVCMOS33 [get_ports {rst_n}]
    
    ##############50M CLK define################## 
    create_clock -period 20.000 -name clk -waveform {0.000 10.000} [get_ports clk]
    set_property PACKAGE_PIN N18 [get_ports {clk}] 
    set_property IOSTANDARD LVCMOS33 [get_ports {clk}]
    
  8. 编译生成获取结果
    ①生成
    在这里插入图片描述
    ②进行下载
    点击Open Hardware Manager->Open target->Auto target后,显示如下
    在这里插入图片描述
    点击Program device,下载程序,直接点击Program
    在这里插入图片描述
    实验结果
    在这里插入图片描述
  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值