試想這樣一種場景,有兩款不同的FPGA板卡,它們的功能代碼90%都是一樣的,但是兩個板卡的管腳分配完全不同,一般情況下,我們需要設計兩個工程,兩套代碼,之后還需要一直維護兩個版本。 那么有沒有一種自動化的方式,實現(xiàn)一個工程,編譯出一個程序文件,下載到這兩個不同的板卡上,都可以正常運行呢?
本文以開發(fā)板A和開發(fā)板B為例,介紹如何實現(xiàn)一套FPGA工程無縫兼容兩款管腳不同的板卡?
兩款開發(fā)板的時鐘信號分別為clk_a和clk_b,分別位于兩個不同的芯片管腳,兩個開發(fā)板的FPGA型號完全一致,外部時鐘的頻率也一樣。
首先需要判斷當前是哪款板卡?實現(xiàn)方式是通過兩個計數(shù)器,分別對時鐘信號進行計數(shù),由于兩款板子的時鐘信號分別位于不同的管腳,所以只有一個計數(shù)器會累加,并達到目標值,這樣就實現(xiàn)了板卡型號的自動區(qū)分。
具體代碼如下:
/*********************************************************************
* 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的一個小技巧,一般工程不建議這么使用。
板卡區(qū)分之后,再根據(jù)區(qū)分的結(jié)果即sel的值對輸出、輸入分別進行選擇。
具體實現(xiàn)如下:
/*********************************************************************
* 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
總結(jié)
本文所提出的方式,可以在某些應用場景對板卡實現(xiàn)一定的兼容性,比如用來固件在線升級所使用的Golden鏡像工程,不同的板子共用此工程,以后只需要維護一套代碼即可。
當然這種方式也有一定的局限性,比如需要兩款板卡的FPGA芯片型號一致、晶振頻率一致,比如同樣為XC7K325T,外部輸入單端50M時鐘。
審核編輯:劉清
-
寄存器
+關注
關注
31文章
5294瀏覽量
119816 -
仿真器
+關注
關注
14文章
1014瀏覽量
83591 -
FPGA芯片
+關注
關注
3文章
246瀏覽量
39746
原文標題:如何做到一套FPGA工程無縫兼容兩款不同的板卡?
文章出處:【微信號:mcu149,微信公眾號:電子電路開發(fā)學習】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論