在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文詳解HLS從C/C++到VHDL的轉(zhuǎn)換

Hx ? 作者:工程師陳翠 ? 2018-07-14 06:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

高層次綜合(High Level Synthesis, HLS)是Xilinx公司推出的最新一代的FPGA設(shè)計(jì)工具,它能讓用戶通過(guò)編寫(xiě)C/C++等高級(jí)語(yǔ)言代碼實(shí)現(xiàn)RTL級(jí)的硬件功能。隨著這款工具的出現(xiàn),軟硬之間的區(qū)別越來(lái)越模糊,即使你對(duì)于硬件完全不懂,你也能編寫(xiě)出符合工程功能要求的RTL代碼。看到HLS工具具有如此神奇的功能,你是否想立即嘗試一下呢?

接下來(lái)我們將談?wù)凥LS相關(guān)的簡(jiǎn)單操作以及C/C++到VHDL的一個(gè)轉(zhuǎn)換關(guān)系:

首先確保你已經(jīng)下好了vivado相關(guān)套件,并且HLS的license(官網(wǎng)有試用的,但只能用一個(gè)月)已經(jīng)下到,然后打開(kāi)桌面上,就可以按照一般的軟件建工程一樣,這里我們寫(xiě)了一個(gè)很簡(jiǎn)單的函數(shù)int andfunction(int array[2],int array1[2]);這里我們注意到函數(shù)返回值是整形,同時(shí)兩個(gè)形參是都是數(shù)組,這個(gè)函數(shù)代碼如下:

int andfunction(int array[2],int array1[2])

{

int i,sum;

sum=0;

for(i=0;i《2;i++)

{

array[i]=i*2;

array1[i]=array[i]+i;

sum+=array1[i];

}

return sum;

}

寫(xiě)好了這個(gè)函數(shù)后,那么我們不妨看看綜合后的VHDL是怎樣的。點(diǎn)擊綠色三角按鈕后生成硬件描述語(yǔ)言,solution1-》syn-》vhdl里可以看到生成的VHDL,代碼如下:

-- ==============================================================

-- RTL generated by Vivado(TM) HLS - High-Level Synthesis from C, C++ and SystemC

-- Version: 2012.4

-- Copyright (C) 2012 Xilinx Inc. All rights reserved.

--

-- ===========================================================

library IEEE;

use IEEE.std_logic_1164.all;

use IEEE.numeric_std.all;

entity andfunction is

port (

ap_clk : IN STD_LOGIC;

ap_rst : IN STD_LOGIC;

ap_start : IN STD_LOGIC;

ap_done : OUT STD_LOGIC;

ap_idle : OUT STD_LOGIC;

ap_ready : OUT STD_LOGIC;

array_r_address0 : OUT STD_LOGIC_VECTOR (0 downto 0);

array_r_ce0 : OUT STD_LOGIC;

array_r_we0 : OUT STD_LOGIC;

array_r_d0 : OUT STD_LOGIC_VECTOR (31 downto 0);

array1_address0 : OUT STD_LOGIC_VECTOR (0 downto 0);

array1_ce0 : OUT STD_LOGIC;

array1_we0 : OUT STD_LOGIC;

array1_d0 : OUT STD_LOGIC_VECTOR (31 downto 0);

ap_return : OUT STD_LOGIC_VECTOR (31 downto 0) );

end;

architecture behav of andfunction is

attribute CORE_GENERATION_INFO : STRING;

attribute CORE_GENERATION_INFO of behav : architecture is

“andfunction,hls_ip_2012_4,{HLS_INPUT_TYPE=c,HLS_INPUT_FLOAT=0,HLS_INPUT_FIXED=0,HLS_INPUT_PART=xc5vlx110tff1136-1,HLS_INPUT_CLOCK=10.000000,HLS_INPUT_ARCH=others,HLS_SYN_CLOCK=3.090000,HLS_SYN_LAT=3,HLS_SYN_TPT=none,HLS_SYN_MEM=0,HLS_SYN_DSP=0,HLS_SYN_FF=3,HLS_SYN_LUT=8}”;

constant ap_const_logic_1 : STD_LOGIC := ‘1’;

constant ap_const_logic_0 : STD_LOGIC := ‘0’;

constant ap_ST_st1_fsm_0 : STD_LOGIC_VECTOR (0 downto 0) := “0”;

constant ap_ST_st2_fsm_1 : STD_LOGIC_VECTOR (0 downto 0) := “1”;

constant ap_const_lv2_0 : STD_LOGIC_VECTOR (1 downto 0) := “00”;

constant ap_const_lv1_0 : STD_LOGIC_VECTOR (0 downto 0) := “0”;

constant ap_const_lv2_2 : STD_LOGIC_VECTOR (1 downto 0) := “10”;

constant ap_const_lv2_1 : STD_LOGIC_VECTOR (1 downto 0) := “01”;

constant ap_const_lv32_3 : STD_LOGIC_VECTOR (31 downto 0) := “00000000000000000000000000000011”;

signal ap_CS_fsm : STD_LOGIC_VECTOR (0 downto 0) := “0”;

signal i_1_fu_66_p2 : STD_LOGIC_VECTOR (1 downto 0);

signal i_reg_42 : STD_LOGIC_VECTOR (1 downto 0);

signal exitcond1_fu_60_p2 : STD_LOGIC_VECTOR (0 downto 0);

signal i_cast_fu_54_p1 : STD_LOGIC_VECTOR (31 downto 0);

signal tmp_fu_72_p2 : STD_LOGIC_VECTOR (1 downto 0);

signal tmp_1_fu_83_p2 : STD_LOGIC_VECTOR (1 downto 0);

signal ap_NS_fsm : STD_LOGIC_VECTOR (0 downto 0);

begin

-- the current state (ap_CS_fsm) of the state machine. --

ap_CS_fsm_assign_proc : process(ap_clk)

begin

if (ap_clk‘event and ap_clk = ’1‘) then

if (ap_rst = ’1‘) then

ap_CS_fsm 《= ap_ST_st1_fsm_0;

else

ap_CS_fsm 《= ap_NS_fsm;

end if;

end if;

end process;

-- ap_reg assign process. --

ap_reg_proc : process(ap_clk)

begin

if (ap_clk’event and ap_clk = ‘1’) then

if (((ap_ST_st2_fsm_1 = ap_CS_fsm) and (exitcond1_fu_60_p2 = ap_const_lv1_0))) then

i_reg_42 《= i_1_fu_66_p2;

elsif (((ap_ST_st1_fsm_0 = ap_CS_fsm) and not((ap_start = ap_const_logic_0)))) then

i_reg_42 《= ap_const_lv2_0;

end if;

end if;

end process;

-- the next state (ap_NS_fsm) of the state machine. --

ap_NS_fsm_assign_proc : process(ap_start, ap_CS_fsm, exitcond1_fu_60_p2)

begin

if (((ap_ST_st2_fsm_1 = ap_CS_fsm) and not((exitcond1_fu_60_p2 = ap_const_lv1_0)))) then

ap_NS_fsm 《= ap_ST_st1_fsm_0;

elsif ((((ap_ST_st1_fsm_0 = ap_CS_fsm) and not((ap_start = ap_const_logic_0))) or ((ap_ST_st2_fsm_1 = ap_CS_fsm) and (exitcond1_fu_60_p2 = ap_const_lv1_0)))) then

ap_NS_fsm 《= ap_ST_st2_fsm_1;

else

ap_NS_fsm 《= ap_CS_fsm;

end if;

end process;

-- ap_done assign process. --

ap_done_assign_proc : process(ap_CS_fsm, exitcond1_fu_60_p2)

begin

if (((ap_ST_st2_fsm_1 = ap_CS_fsm) and not((exitcond1_fu_60_p2 = ap_const_lv1_0)))) then

ap_done 《= ap_const_logic_1;

else

ap_done 《= ap_const_logic_0;

end if;

end process;

-- ap_idle assign process. --

ap_idle_assign_proc : process(ap_start, ap_CS_fsm)

begin

if ((not((ap_const_logic_1 = ap_start)) and (ap_ST_st1_fsm_0 = ap_CS_fsm))) then

ap_idle 《= ap_const_logic_1;

else

ap_idle 《= ap_const_logic_0;

end if;

end process;

-- ap_ready assign process. --

ap_ready_assign_proc : process(ap_CS_fsm, exitcond1_fu_60_p2)

begin

if (((ap_ST_st2_fsm_1 = ap_CS_fsm) and not((exitcond1_fu_60_p2 = ap_const_lv1_0)))) then

ap_ready 《= ap_const_logic_1;

else

ap_ready 《= ap_const_logic_0;

end if;

end process;

ap_return 《= ap_const_lv32_3;

array1_address0 《= i_cast_fu_54_p1(1 - 1 downto 0);

-- array1_ce0 assign process. --

array1_ce0_assign_proc : process(ap_CS_fsm, exitcond1_fu_60_p2)

begin

if (((ap_ST_st2_fsm_1 = ap_CS_fsm) and (exitcond1_fu_60_p2 = ap_const_lv1_0))) then

array1_ce0 《= ap_const_logic_1;

else

array1_ce0 《= ap_const_logic_0;

end if;

end process;

array1_d0 《= std_logic_vector(resize(unsigned(tmp_1_fu_83_p2),32));

-- array1_we0 assign process. --

array1_we0_assign_proc : process(ap_CS_fsm, exitcond1_fu_60_p2)

begin

if ((((ap_ST_st2_fsm_1 = ap_CS_fsm) and (exitcond1_fu_60_p2 = ap_const_lv1_0)))) then

array1_we0 《= ap_const_logic_1;

else

array1_we0 《= ap_const_logic_0;

end if;

end process;

array_r_address0 《= i_cast_fu_54_p1(1 - 1 downto 0);

-- array_r_ce0 assign process. --

array_r_ce0_assign_proc : process(ap_CS_fsm, exitcond1_fu_60_p2)

begin

if (((ap_ST_st2_fsm_1 = ap_CS_fsm) and (exitcond1_fu_60_p2 = ap_const_lv1_0))) then

array_r_ce0 《= ap_const_logic_1;

else

array_r_ce0 《= ap_const_logic_0;

end if;

end process;

array_r_d0 《= std_logic_vector(resize(unsigned(tmp_fu_72_p2),32));

-- array_r_we0 assign process. --

array_r_we0_assign_proc : process(ap_CS_fsm, exitcond1_fu_60_p2)

begin

if ((((ap_ST_st2_fsm_1 = ap_CS_fsm) and (exitcond1_fu_60_p2 = ap_const_lv1_0)))) then

array_r_we0 《= ap_const_logic_1;

else

array_r_we0 《= ap_const_logic_0;

end if;

end process;

exitcond1_fu_60_p2 《= “1” when (i_reg_42 = ap_const_lv2_2) else “0”;

i_1_fu_66_p2 《= std_logic_vector(unsigned(i_reg_42) + unsigned(ap_const_lv2_1));

i_cast_fu_54_p1 《= std_logic_vector(resize(unsigned(i_reg_42),32));

tmp_1_fu_83_p2 《= std_logic_vector(unsigned(tmp_fu_72_p2) + unsigned(i_reg_42));

tmp_fu_72_p2 《= std_logic_vector(shift_left(unsigned(i_reg_42),to_integer(unsigned(‘0’ & ap_const_lv2_1(2-1 downto 0)))));

end behav;

看到這么長(zhǎng)一大串代碼后,你或許會(huì)說(shuō)看起來(lái)太復(fù)雜來(lái)人,還不如自己寫(xiě);一兩個(gè)簡(jiǎn)單的可以自己寫(xiě),成千上萬(wàn)個(gè)呢?這里我們不去關(guān)注architecture里面具體的實(shí)現(xiàn)過(guò)程(這里面包含很多優(yōu)化),這里我們僅僅討論從C/C++到VHDL的entity的關(guān)系。

看到VHDL后,你也許第一眼就看到了VHDL中的entity了,但是你不一定理解其管腳到底指代什么,下面給出一張int andfunction(int array[2],int array1[2])這個(gè)函數(shù)的硬件結(jié)構(gòu)圖

硬件引腳的具體含義是(這部分是參考的):

ap_clk:設(shè)計(jì)的時(shí)鐘信號(hào)

ap_rst:設(shè)計(jì)的復(fù)位信號(hào)

ap_start:開(kāi)始計(jì)算的開(kāi)始信號(hào)

ap_done:計(jì)算結(jié)束和輸出就緒的完成信號(hào)

ap_idle:表示實(shí)體(設(shè)計(jì))空閑的空閑信號(hào)

ap_ready:表示設(shè)計(jì)為新輸入數(shù)據(jù)做好準(zhǔn)備,與ap_idle 配合使用

ap_return:設(shè)計(jì)的返回值

name_address:存儲(chǔ)器的讀地址 (name指代array或array1,因?yàn)樗鼈兌际菙?shù)組,在硬件中綜合成了寄存器

name_ce0:存儲(chǔ)器的芯片使能

name_we0:存儲(chǔ)器的寫(xiě)使能

name_do0:存儲(chǔ)器的寫(xiě)數(shù)據(jù)

ap_return: 函數(shù)返回值端口

分析上面的硬件管腳,其中ap_clk、ap_rst、ap_start、ap_done、ap_idle、ap_ready為大多數(shù)綜合后硬件默認(rèn)必有的,因?yàn)檫@些引腳便于處理器對(duì)其進(jìn)行控制;name_address0、name_ce0、name_we0、name_do0這些引腳是為了獲取所使用到寄存器的狀態(tài),在這里我們應(yīng)當(dāng)注意:數(shù)組開(kāi)辟的空間盡量不要大,過(guò)大容易造成硬件資源不足,無(wú)法開(kāi)辟滿足要求的寄存器。

今天就對(duì)HLS從C/C++到VHDL的轉(zhuǎn)換大致說(shuō)到這里,由于剛接觸這一塊,難免有所紕漏,歡迎大家指出!

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • vhdl
    +關(guān)注

    關(guān)注

    30

    文章

    820

    瀏覽量

    129842
  • HLS
    HLS
    +關(guān)注

    關(guān)注

    1

    文章

    133

    瀏覽量

    24791
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    怎么.c轉(zhuǎn)換.m文件.vhdl文件或.vhdl文件

    嗨, 我正在C和MATLAB中實(shí)現(xiàn)圖像比較的代碼。現(xiàn)在我想知道xilinx上的.c文件中的.m文件(或).vhdl文件創(chuàng)建.vhdl文件的
    發(fā)表于 03-18 13:10

    【正點(diǎn)原子FPGA連載】第HLS簡(jiǎn)介-領(lǐng)航者ZYNQ之HLS 開(kāi)發(fā)指南

    不同的編譯器,Xilinx Vivado High-Level Synthesis(高層綜合,HLS)工具同樣是種編譯器,只不過(guò)它是用來(lái)將C或者C++程序部署
    發(fā)表于 10-10 16:44

    HLS系列 – High LevelSynthesis(HLS) 從個(gè)最簡(jiǎn)單的fir濾波器開(kāi)始

    眾所周知,HLS是Xilinx于幾年前推出的個(gè)高級(jí)綜合工具,可以直接把C/C++代碼,轉(zhuǎn)換成可綜合的verilog/
    發(fā)表于 02-08 05:07 ?2266次閱讀
    <b class='flag-5'>HLS</b>系列 – High LevelSynthesis(<b class='flag-5'>HLS</b>) 從<b class='flag-5'>一</b>個(gè)最簡(jiǎn)單的fir濾波器開(kāi)始

    HLS系列 – High Level Synthesis(HLS) 的些基本概念1

    相信通過(guò)前面5篇fir濾波器的實(shí)現(xiàn)和優(yōu)化過(guò)程,大家對(duì)HLS已經(jīng)有了基本的認(rèn)識(shí)。是時(shí)候提煉HLS的基本概念了。 HLS支持C
    發(fā)表于 02-08 05:23 ?1026次閱讀
    <b class='flag-5'>HLS</b>系列 – High Level Synthesis(<b class='flag-5'>HLS</b>) 的<b class='flag-5'>一</b>些基本概念1

    關(guān)于ZYNQ HLS圖像處理加速總結(jié)的分享

    HLS工具 以個(gè)人的理解,xilinx將HLS(高層次綜合)定位于更方便的將復(fù)雜算法轉(zhuǎn)化為硬件語(yǔ)言,通過(guò)添加某些配置條件HLS工具可以把可并行化的C/
    發(fā)表于 10-12 17:34 ?2689次閱讀
    關(guān)于ZYNQ <b class='flag-5'>HLS</b>圖像處理加速總結(jié)的分享

    CVHDL的編譯器設(shè)計(jì)與實(shí)現(xiàn)詳解

    本文主要介紹了CVHDL的編譯器設(shè)計(jì)與實(shí)現(xiàn),首先介紹了CVHDL的語(yǔ)言特征,其次闡述了設(shè)計(jì)方案,最后介紹了
    發(fā)表于 05-17 11:06 ?4920次閱讀

    TCL腳本簡(jiǎn)介 vivado hls 的設(shè)計(jì)流程

    Vivado HLS 是 Xilinx 提供的個(gè)工具,是 Vivado Design Suite 的部分,能把基于 C 的設(shè)計(jì) (C
    發(fā)表于 06-05 10:31 ?6929次閱讀
    TCL腳本簡(jiǎn)介 vivado <b class='flag-5'>hls</b> 的設(shè)計(jì)流程

    圖文詳解C++虛表的剖析

    圖文詳解C++虛表的剖析
    的頭像 發(fā)表于 06-29 14:23 ?2780次閱讀
    圖文<b class='flag-5'>詳解</b>:<b class='flag-5'>C++</b>虛表的剖析

    圖文詳解C++的輸出輸入

    圖文詳解C++的輸出輸入
    的頭像 發(fā)表于 06-29 14:53 ?3614次閱讀
    圖文<b class='flag-5'>詳解</b>:<b class='flag-5'>C++</b>的輸出輸入

    EE-128:C++中的DSP:C++調(diào)用匯編類(lèi)成員函數(shù)

    EE-128:C++中的DSP:C++調(diào)用匯編類(lèi)成員函數(shù)
    發(fā)表于 04-16 17:04 ?2次下載
    EE-128:<b class='flag-5'>C++</b>中的DSP:<b class='flag-5'>從</b><b class='flag-5'>C++</b>調(diào)用匯編類(lèi)成員函數(shù)

    嵌入式編程中C語(yǔ)言C++詳解

    ? OOP第C語(yǔ)言的局限 C++的特點(diǎn) C++的程序特征 C++程序的結(jié)構(gòu)特性 C++程序
    的頭像 發(fā)表于 11-08 17:21 ?2832次閱讀

    如何使用xilinx的HLS工具進(jìn)行算法的硬件加速

    在整個(gè)流程中,用戶先創(chuàng)建個(gè)設(shè)計(jì) CC++ 或 SystemC 源代碼,以及個(gè)C的測(cè)試平臺(tái)。通過(guò) Vivado
    的頭像 發(fā)表于 06-02 09:48 ?7980次閱讀

    使用網(wǎng)絡(luò)實(shí)例比較FPGA RTL與HLS C/C++的區(qū)別

    HLS的FPGA開(kāi)發(fā)方法是只抽象出可以在C/C++環(huán)境中輕松表達(dá)的應(yīng)用部分。通過(guò)使用Vivado(Xilinx)或Intel(Quartus)工具,HLS工具流程基本上可用于任何Bit
    發(fā)表于 08-02 09:18 ?2028次閱讀
    使用網(wǎng)絡(luò)實(shí)例比較FPGA RTL與<b class='flag-5'>HLS</b> <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>的區(qū)別

    Vitis HLS相關(guān)問(wèn)答詳解

    需要手工在 C++ 代碼里明確指定可并行執(zhí)行的任務(wù)(用 task,添加頭文件 hls_task.h),同時(shí)可并行執(zhí)行的 task 接口(對(duì)應(yīng) C++ 函數(shù)的形參)必須是 stream 或 stream_of_blocks。
    的頭像 發(fā)表于 08-11 11:23 ?998次閱讀

    C++在Linux內(nèi)核開(kāi)發(fā)中爭(zhēng)議成熟

    Linux 內(nèi)核郵件列表中篇已有六年歷史的老帖近日再次引發(fā)激烈討論 —— 主題是建議將 Linux 內(nèi)核的開(kāi)發(fā)語(yǔ)言 C 轉(zhuǎn)換為更現(xiàn)代的 C++
    的頭像 發(fā)表于 01-31 14:11 ?886次閱讀
    <b class='flag-5'>C++</b>在Linux內(nèi)核開(kāi)發(fā)中<b class='flag-5'>從</b>爭(zhēng)議<b class='flag-5'>到</b>成熟
    主站蜘蛛池模板: 亚洲成人免费 | 国产精品怡红院永久免费 | 国产三a级日本三级日产三级 | 特黄特色的大片观看免费视频 | 夜夜夜夜夜操 | 久久伊人成人 | 午夜影院h | 五月激情站 | 第四色激情网 | 天天挨操 | 亚洲乱码尤物193yw在线播放 | 中国农村一级片 | 天堂在线最新版在线www | 韩毛片 | 欧美日韩国产另类一区二区三区 | 小泽玛利亚在线观看123 | 四虎影院永久网站 | 久久精品视频网站 | 人人爽天天碰天天躁夜夜躁 | 日本在线视频精品 | 色五月丁香五月综合五月 | 国产在播放一区 | 一级做性色a爱片久久片 | a成人| 亚洲一区二区三区免费看 | 九色视频网站 | 亚洲综合一区二区三区 | 欧美三级免费网站 | 精品午夜久久影视 | 精品久久久久久婷婷 | 国产成人啪精品午夜在线播放 | 天堂bt种子资源地址在线 | 嫩草影院久久国产精品 | 国产 日韩 欧美 高清 | 九九人人| 四虎网站 | 亚洲天堂网在线观看 | 色丁香影院 | 久久精品国产夜色 | 黄 色 片 在 线 看 | 深夜动态福利gif进出粗暴 |