主頁 > 移動端開發 > 如何在if條件下使用匯入的列舉?

如何在if條件下使用匯入的列舉?

2022-05-09 16:37:19 移動端開發

在一個程序中,我需要根據其中一個埠是否具有特定值來做一些事情。此值在單獨的包檔案中的型別 def 中定義。

比較應該在“if-statement”中完成,以獲得簡短易讀的代碼。

因為我需要確保沒有我不能使用的混淆use work.pkg.all,所以我使用pkg_name.enum_name


    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    
    use work.all;
    
    use work.SAWTOOTH_INNER_pkg.all;  -- other pkg which is needed. 
    
    entity SAWTOOTH_entity is
        PORT(
            p_clk : in std_logic;
            p_event_enum_next : in SAWTOOTH_pkg.in_event_enum
        );
    end entity;

    architecture arch of SAWTOOTH_entity is
    
    begin
        process(p_clk)
        begin
            if rising_edge(p_clk) then              
                
                -- Throws error. Modelsim says 'no feasable entry for /='
                if (p_event_enum_next /= SAWTOOTH_pkg.event_enum_empty) then
                    -- do something
                end if;
                
                -- Does the same but compiles without errors. But it is much longer.
                case p_event_enum_next is
                    when  SAWTOOTH_pkg.event_enum_empty =>
                        -- do nothing
                    when others =>  
                        -- do something
                end case;
            end if;
        end process;        
    end architecture;

編輯:更多資訊:

確切的錯誤:

** Error: C:\Users\4DIAC\Desktop\ModelSimWS\Bug.vhd(25): (vcom-1581) No feasible entries for infix operator '/='.
** Error: C:\Users\4DIAC\Desktop\ModelSimWS\Bug.vhd(25): Type error resolving infix expression "/=" as type std.STANDARD.BOOLEAN.

包:SAWTOOTH_INNER_PKG:

    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    
    use work.all;

    package SAWTOOTH_INNER_pkg is
            
            TYPE in_event_enum is (event_enum_empty, event_enum_START, event_enum_STOP, event_enum_REQ, event_enum_CONFIG);
            TYPE buffer_event_type is array (0 to 3) of in_event_enum;
            

                    
     end SAWTOOTH_INNER_pkg;

SAWTOOTH_PKG:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

use work.all;

package SAWTOOTH_pkg is
    
    TYPE in_event_enum is (event_enum_empty, event_enum_CONFIG, event_enum_START, event_enum_STOP);
    TYPE buffer_event_type is array (0 to 3) of in_event_enum;

                
 end SAWTOOTH_pkg;


uj5u.com熱心網友回復:

問題中聲稱的包 SAWTOOTH_pkg 宣告存在缺陷,雖然問題文本顯示 SAWTOOTH_pkg,但宣告顯示為 SAWTOOTH_INNER_pkg:

SAWTOOTH_PKG:

    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    
    use work.all;

    package SAWTOOTH_INNER_pkg is
            
            TYPE in_event_enum is (event_enum_empty, event_enum_START, event_enum_STOP, event_enum_REQ, event_enum_CONFIG);
            TYPE buffer_event_type is array (0 to 3) of in_event_enum;
            

                    
     end SAWTOOTH_INNER_pkg;

出于最小、完整和可驗證的示例的目的,這兩個包除了包名之外可以相同,因此包 SAWTOOTH_pkg 的包名應為 SAWTOOTH_pkg(在兩個地方)代替 SAWTOOTH_INNER_pkg。

預定義運算子在型別宣告之后立即隱式宣告。這意味著通過所選名稱使型別宣告可見并不會使運算子宣告可見。

IEEE Std 1076-2008
9.2 運算子
9.2.3 關系運算子

為檔案型別和受保護型別以外的所有型別定義了相等和不等運算子(= 和 /=)。如果兩個運算元相等,相等運算子回傳值 TRUE,否則回傳值 FALSE。如果兩個運算元相等,則不等式運算子回傳值 FALSE,否則回傳值 TRUE。

該標準在 4.5 子程式多載、4.5.1 通用、4.5.2 運算子多載小節中包含了一種提供多載子程式和運算子的機制(“其指示符為運算子符號的函式的宣告用于多載運算子。運算子符號的字符應是 9.2.") 和 4.5.3 簽名中定義的運算子類別中的運算子之一。這些可用于為新型別多載運算子,例如列舉型別(5.2 標量型別 5.2.1 通用)in_event_enum。

12.5 多載決議的背景關系

12.5 多載決議的背景關系

多載是為名稱、子程式和列舉字面量定義的。

對于多載的物體,只要可見性規則確定在出現的位置可以接受多個含義,多載決策就會確定識別符號或字符文字的出現所具有的實際含義;多載決議同樣決定了一個運算子或基本操作出現的實際意義(見 5.1)。

這里的物體是指命名物體,而不是由物體宣告宣告的外部塊。

所有這一切都基于 12.3 可見性:

對于文本中的每個識別符號和每個位置,可見性規則確定了一組宣告(使用此識別符號),這些宣告定義了識別符號出現的可能含義。當根據可見性規則,宣告定義了此事件的可能含義時,則稱宣告在文本中的給定位置可見。在確定這種宣告的含義時,會出現以下兩種情況:

— 可見性規則最多確定一種可能的含義。在這種情況下,可見性規則足以確定定義識別符號出現的含義的宣告,或者在沒有這樣的宣告的情況下,確定該出現在給定點是不合法的。

— 可見性規則決定了不止一種可能的含義。在這種情況下,當且僅當恰好一個可見宣告對于給定背景關系中的多載規則是可接受的,或者所有可見宣告都表示相同的命名物體時,此時識別符號的出現是合法的。

vcom-1581 錯誤告訴我們第一種情況不滿足沒有可見的運算子多載宣告(由“/=”指定)回傳一個布林值并具有 in_event_enum 的引數基型別。

根據您的問題,我們可以通過 use 子句禁止您直接看到包的宣告,沒有提供推理,或者我們可以通過選擇使宣告可見(這與問題要求“比較應該在' if-statement' 具有簡短易讀的代碼。” 選定的名稱可以用作函式呼叫的前綴,但不能用作運算子,并且將指示符用作函式呼叫可能滿足要求,也可能不滿足要求。(它只是更長前綴,括號括起來的引數和雙引號來指定運算子符號。)我們已經可以看到您嘗試使用 use 子句“縮短” if 陳述句條件use work.all;使作業庫中的包宣告直接可見。通常,高級 VHDL 用戶會認為使用這樣的 use 子句是粗俗的,它實際上需要您回溯到 use 子句以了解可見性是如何產生的。

那么有沒有辦法讓預定義的不等式運算子的隱式宣告直接可見(避免函式呼叫的前綴)?

VHDL 支持使用別名(6.6 別名宣告),其中非物件別名在其宣告中使用簽名來提供資訊以滿足上述 12.3 的第一種情況(在包 SAWTOOTH_pkg 中找到的每個型別宣告,對的參考SAWTOOTH_pkg."/="將是模棱兩可的與第二種情況發生沖突)。

所以我們的別名宣告看起來像

architecture arch of SAWTOOTH_entity is
    alias "/=" is work.sawtooth_pkg."/="
        [work.sawtooth_pkg.in_event_enum,
         work.sawtooth_pkg.in_event_enum return boolean];
begin  
    process(p_clk)
    begin
        if rising_edge(p_clk) then              
            
            -- Throws error. Modelsim says 'no feasable entry for /='
            if (p_event_enum_next /= SAWTOOTH_pkg.event_enum_empty) then
                -- do something
            end if;
            

并且可以作為架構宣告項制作,或者因為不等式運算子僅在流程宣告中使用,在流程宣告部分中。

在運算子指示符直接可見的情況下,二級設計物體(架構)進行分析(當問題提供最小、完整且可驗證的示例時,提供兩個包宣告)。

還有宣告范圍的概念(12.2 宣告范圍)。如果禁止使用使包 SAWTOOTH_pkg 中的所有宣告直接可見的 use 子句是由于包 SAWTOOTH_INNER_pkg 中出現相同的宣告,您可以利用內部宣告區域,其中不依賴包 SAWTOOTH_INNER_pkg 中的宣告來使用用于使包 SAWTOOTH_pkg 中的宣告直接可見的 use 子句:

begin  
    process (p_clk)
        use work.SAWTOOTH_pkg.all;
    begin
        if rising_edge(p_clk) then              
            
            -- Throws error. Modelsim says 'no feasable entry for /='
            if p_event_enum_next /= event_enum_empty then
                -- do something
            end if;

這也適用于此處,這可能是也可能不是示例過于最小的結果。流程陳述句是一個內部宣告區域,它允許任何出現的宣告也被所有 use 子句可見,其范圍包括這個地方被內部宣告區域中的 use 子句可見的宣告隱藏(參見 12.4 Use 子句)。

問題示例代碼不排除通過在外部宣告區域中隱藏宣告來使用內部宣告區域來劃分可見性。

不依賴于這些使不等式運算子多載的宣告直接可見的方法將依賴于選定的名稱,并且不符合 if 陳述句的最短可讀代碼主觀標準:

architecture arch of SAWTOOTH_entity is
    -- alias "/=" is work.sawtooth_pkg."/="
    --     [work.sawtooth_pkg.in_event_enum,
    --    work.sawtooth_pkg.in_event_enum return boolean];
begin  
    process (p_clk)
        -- use work.sawtooth_pkg.all;
    begin
        if rising_edge(p_clk) then              
            
            -- Throws error. Modelsim says 'no feasable entry for /='
            -- if p_event_enum_next /= sawtooth_pkg.event_enum_empty then
            --     -- do something
            -- end if;
            if sawtooth_pkg."/="(p_event_enum_next, 
                                 sawtooth_pkg.event_enum_empty) then
                -- do something
            end if;
            
            -- Does the same but compiles without errors. But it is much longer.
            case p_event_enum_next is
                when  SAWTOOTH_pkg.event_enum_empty =>
                    -- do nothing
                when others =>  
                    -- do something
            end case;
        end if;
    end process;        
end architecture;

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/471123.html

標籤:if 语句 进口 视频文件

上一篇:應用ifelse而不使用R應用for回圈

下一篇:如何防止不想要的資料被添加到佇列中?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more