<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何實現一套FPGA工程無縫兼容兩款管腳不同的板卡?

電子電路開發學習 ? 來源:電子電路開發學習 ? 2023-11-08 14:21 ? 次閱讀

試想這樣一種場景,有兩款不同的FPGA板卡,它們的功能代碼90%都是一樣的,但是兩個板卡的管腳分配完全不同,一般情況下,我們需要設計兩個工程,兩套代碼,之后還需要一直維護兩個版本。 那么有沒有一種自動化的方式,實現一個工程,編譯出一個程序文件,下載到這兩個不同的板卡上,都可以正常運行呢?

本文以開發板A和開發板B為例,介紹如何實現一套FPGA工程無縫兼容兩款管腳不同的板卡?

兩款開發板的時鐘信號分別為clk_a和clk_b,分別位于兩個不同的芯片管腳,兩個開發板的FPGA型號完全一致,外部時鐘的頻率也一樣。

首先需要判斷當前是哪款板卡?實現方式是通過兩個計數器,分別對時鐘信號進行計數,由于兩款板子的時鐘信號分別位于不同的管腳,所以只有一個計數器會累加,并達到目標值,這樣就實現了板卡型號的自動區分。

具體代碼如下:

/*********************************************************************
* Copyright ? blog.csdn.net/whik1194
* ModuleName : board_sel.v
* CreateTim : 2023年11月5日 19:16:48
* Author : mcu149
* Function : function
* Version : v1.0
* Version | Modify
* ----------------------------------
* v1.0 | first version
*********************************************************************/

module board_sel(
//Inputs
input clk_a, //100MHz
input clk_b, //100MHz

//Outputs
output reg [1:0] sel = 2'd0,
output reg rst_n = 1'b0
);

//1.parameter
// parameter LATCH_TIME = 10_000_000 / 10; //10ms
// parameter RESET_TIME = 100_000_000 / 10; //100ms
// for simulation
parameter LATCH_TIME = 5_000 / 10; //simulation, 5 us
parameter RESET_TIME = 10_000 / 10; //simulation, 10 us

//2.localparam
localparam BOARD_A = 2'd1;
localparam BOARD_B = 2'd2;

//3.reg
reg [31:0] cnt_a = 0;
reg [31:0] cnt_b = 0;

//4.wire

//5.assign

//6.always
always @ (posedge clk_a) begin
if(cnt_a < LATCH_TIME + RESET_TIME)
cnt_a <= cnt_a + 1;
end

always @ (posedge clk_b) begin
if(cnt_b < LATCH_TIME + RESET_TIME)
cnt_b <= cnt_b + 1;
end

always @ (*) begin
if(cnt_a == LATCH_TIME)
sel <= BOARD_A;
else if(cnt_b == LATCH_TIME)
sel <= BOARD_B;
end

always @ (*) begin
if((cnt_a == LATCH_TIME + RESET_TIME) || (cnt_b == LATCH_TIME + RESET_TIME))
rst_n <= 1;
end

//7.instance

endmodule //board_sel end

這里的代碼,使用了寄存器定義時賦初值0的一個小技巧,一般工程不建議這么使用。

板卡區分之后,再根據區分的結果即sel的值對輸出、輸入分別進行選擇。

具體實現如下:

/*********************************************************************
* Copyright ? blog.csdn.net/whik1194
* ModuleName : board_sel.v
* CreateTim : 2023年11月5日 19:40:48
* Author : mcu149
* Function : function
* Version : v1.0
* Version | Modify
* ----------------------------------
* v1.0 | first version
*********************************************************************/

module board_dock(
//Inputs
input [1:0] sel,

input clk_a,
input clk_b,
input uart_txd,
input led1,

//Outputs
output clk,
output uart_txd_a,
output uart_txd_b,
output led1_a,
output led1_b
);

//1.parameter

//2.localparam
localparam BOARD_A = 2'd1;
localparam BOARD_B = 2'd2;
localparam DEFAULT_OUT_VALUE = 1'b1;

//3.reg

//4.wire

//5.assign
assign clk = (sel == 2'd0 ) ? DEFAULT_OUT_VALUE : ((sel == BOARD_B) ? clk_b : clk_a );
assign uart_txd_a = (sel == BOARD_A) ? uart_txd : DEFAULT_OUT_VALUE;
assign uart_txd_b = (sel == BOARD_B) ? uart_txd : DEFAULT_OUT_VALUE;
assign led1_a = (sel == BOARD_A) ? led1 : DEFAULT_OUT_VALUE;
assign led1_b = (sel == BOARD_B) ? led1 : DEFAULT_OUT_VALUE;

//6.always

//7.instance

endmodule //board_dock end

仿真文件:

`timescale 1ns/1ps

`define BRD_A
// `define BRD_B

module top_tb;

localparam PERIOD = 10; //10ns
localparam BOARD_A = 2'd1;
localparam BOARD_B = 2'd2;

reg clk_a;
reg clk_b;
reg uart_txd;
reg led1;

wire [1:0] sel;
wire rst_n;

`ifdef BRD_A
always #(PERIOD/2) clk_a <= !clk_a;
`endif

`ifdef BRD_B
always #(PERIOD/2) clk_b <= !clk_b;
`endif

initial begin
$display("testbench: %s", "top_tb");

clk_a = 0;
clk_b = 0;
uart_txd = 0;
led1 = 0;

end

always #(500_000) uart_txd <= !uart_txd;
always #(200_000) led1 <= !led1;

board_sel board_sel_ut0(
//Inputs
.clk_a(clk_a), //100MHz
.clk_b(clk_b), //100MHz

//Outputs
.sel(sel),
.rst_n(rst_n)
);

board_dock board_dock_ut0(
//Inputs
.sel(sel),
.clk_a(clk_a),
.clk_b(clk_b),
.uart_txd(uart_txd),
.led1(led1),

//Outputs
.clk(clk),
.uart_txd_a(uart_txd_a),
.uart_txd_b(uart_txd_b),
.led1_a(led1_a),
.led1_b(led1_b)
);

endmodule //top_tb end

總結

本文所提出的方式,可以在某些應用場景對板卡實現一定的兼容性,比如用來固件在線升級所使用的Golden鏡像工程,不同的板子共用此工程,以后只需要維護一套代碼即可。

wKgaomVLKRCAXg9WAAMNdQ90RoE468.jpg

當然這種方式也有一定的局限性,比如需要兩款板卡的FPGA芯片型號一致、晶振頻率一致,比如同樣為XC7K325T,外部輸入單端50M時鐘。







審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    30

    文章

    5167

    瀏覽量

    118229
  • 仿真器
    +關注

    關注

    14

    文章

    994

    瀏覽量

    83166
  • FPGA芯片
    +關注

    關注

    3

    文章

    246

    瀏覽量

    39584

原文標題:如何做到一套FPGA工程無縫兼容兩款不同的板卡?

文章出處:【微信號:mcu149,微信公眾號:電子電路開發學習】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    兩款消回音,消噪音的芯片

    兩款是消回音,消噪音的芯片資料。大家可以看下。起探討下。
    發表于 09-16 10:22

    兩款u***功放制作

    兩款u***功放制作
    發表于 08-20 14:50

    一套已經實現過的NE5532+LM3886 PCB功放

    一套師兄從網上看到的電路圖,然后自己做成PCB板,他是個音響發燒友,他很喜歡自己設計不同的PCB圖,然后把音響做出來放歌,這一套可以實現大功率音箱使用
    發表于 10-23 11:49

    FPGA板卡如何與非FPGA板卡同步

    我有塊IN的FPGA板卡PXI-7854R和非FPGA板卡PXI-6733,請教各位大神,數據輸出和采集時如何將這
    發表于 12-06 20:47

    剛拆的幫我看看這兩款電機的型號?。。。。?!

    幫我看看這兩款電機能做什么
    發表于 01-08 01:42

    一套FPGA俄羅斯方塊的代碼

    `一套FPGA俄羅斯方塊的代碼`
    發表于 06-21 14:59

    Type-C與USB母座兩款母座焊盤放在實現?

    Type-C母座焊盤 USB母座焊盤Type-C母座、USB母座兩款母座用于充電器上,若現在共用塊PCB,Type-C與USB母座焊盤位置如下圖請教各位高手兩款母座焊盤放在齊,可否
    發表于 06-21 20:18

    請問F28335和F28232這兩款芯片的引腳及其引腳上的電氣新能是否完全兼容?是否可直接替換?

    本帖最后由 只耳朵怪 于 2018-6-14 11:40 編輯 TI工程師,有個項目想直接從F28232升級到F28335,這兩款芯片的引腳及其引腳上的電氣新能是否完全兼容?是
    發表于 06-14 09:04

    Exar兩款多路輸出同步降壓型的可編程電源模塊

    模塊與可編程雙控制器結合起來,對于要求更多電壓軌和更高電流的FPGAs 和SOCs的系統中都能實現高達30Amps輸出?! ≈档?b class='flag-5'>一提的是,Exar的XRP9710和XRP9711兩款
    發表于 09-28 16:16

    吉時利儀器兩款2290系列優化的高壓電源

      導讀:日前,吉時利儀器(以下簡稱“吉時利”)宣布推出了兩款2290系列優化的高壓電源,該全新的2290系列高壓電源具有低電壓的模擬輸出,可實現對高電壓和輸出電流的安全監控?! 〖獣r利作為先進電氣
    發表于 11-30 16:35

    如何采用LabVIEW軟件平臺構建一套某裝備存儲器的檢測系統?

    采用NI系列PXI板卡及靈活方便的LabVIEW軟件平臺,構建了一套某裝備存儲器的檢測系統。
    發表于 05-12 06:53

    介紹一套支持語音交互的車載導航系統

    本文在課題組的車載導航系統和國內兩款語音引擎的基礎上,開發了一套支持語音交互的車載導航系統。
    發表于 05-14 06:28

    兩款PIC的單片機分別是PIC16F873A和PIC16F877A,硬件做了兼容,程序的頭文件也改了,但程序不兼容

    目前我們公司老產品使用的兩款PIC的單片機分別是PIC16F873A和PIC16F877A,硬件做了兼容,也就是 說引腳實現一一對應,程序是匯編程序,程序的頭文件改為16F877A,為什么程序下載后執行的不對 ,按照常理應該是
    發表于 09-06 16:51

    在rockchip平臺怎樣去實現一套兼容多款wifi模塊的自適應框架呢

    在rockchip平臺怎樣去實現一套兼容多款wifi模塊的自適應框架呢?rk3399的wifi模組自適應支持多款wifi是什么技術原理?
    發表于 03-07 08:21

    基于FPGA的速度和位置測量板卡設計實現

    電子發燒友網站提供《基于FPGA的速度和位置測量板卡設計實現.pdf》資料免費下載
    發表于 11-08 09:49 ?0次下載
    基于<b class='flag-5'>FPGA</b>的速度和位置測量<b class='flag-5'>板卡</b>設計<b class='flag-5'>實現</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>