天天看點

實作FPGA Verilog HDL與NIOS II的通信資料交換——利用AVALON總線

平時用FPGA基本都是全程用Verilog HDL程式設計,當遇到液晶的時候,發現Verilog的還不如C語言來的友善,但是用NIOS來編寫的時候,實作NIOS與Verilog的通信又是一個問題,今天用了兩種方法實作Verilog與NIOS通信的方法。

第一:利用AVALON總線,自定義IP核,将Verilog部分挂到AVALON總線,利用AVALON總線與NIOS通信,在NIOS中利用函數讀取AVALON總線資料即可;

首先需要編寫符合AVALON總線的要求的Verilog代碼(xxx.v檔案)。

1、添加信号

input sys_cs_n;	//總線讀片選,低電平有效
input sys_rd_n;			//總線讀使能信号,低電平有效
output[7:0] sys_rddata;	//總線讀取資料
           
input sys_cs_n;	//總線讀片選,低電平有效
input sys_wr_n;			//總線寫使能信号,低電平有效
input[7:0] sys_wrdata;	//總線寫入資料
           

以上是兩組信号,至少需要添加一組。  第一組是讀總線資料需要添加的信号,第二組是寫入總線資料的信号。

資料寬度可以選擇8位  16位  32位。

然後在Verilog代碼中編寫邏輯代碼。

以下以數位管顯示為例,将數位管子產品寫入AVALON總線,以下是數顯顯示子產品的一個頂層檔案。其它類似

module seg(
	clk,rst_n,
	row_scan_sig,
	col_scan_sig,
	sys_cs_n,
	sys_wr_n,
	sys_wrdata		
);

input clk;
input rst_n;
output [7:0] row_scan_sig;
output [3:0] col_scan_sig;
input sys_cs_n;	//總線讀片選,低電平有效
input sys_wr_n;			//總線寫使能信号,低電平有效
input[15:0] sys_wrdata;	//總線寫入資料
reg [13:0] num;

wire wrcs_n = sys_cs_n | sys_wr_n;

//總線位址譯碼鎖存
always @(posedge clk or negedge rst_n)
	if(!rst_n) num <= 8'd0;
	else if(!wrcs_n) num <= sys_wrdata;		


seg_display U4(
	.clk(clk),
	.rst_n(rst_n),
	.row_scan_sig(row_scan_sig),
	.col_scan_sig(col_scan_sig),
	.data(num)
);



endmodule
           

注意以下,是顯示的資料是num變量,這個變量接受來自總線的資料sys_wrdata。當片選信号sys_cs_n與讀使能信号sys_wr_n都有效的情況下,開始傳資料給num。

以下是自定義IP核步驟:

1、打開sopc

file——>now componnet

實作FPGA Verilog HDL與NIOS II的通信資料交換——利用AVALON總線

2、然後點選next  點選ADD  添加Verilog檔案,選擇頂層檔案。系統會自動編譯

實作FPGA Verilog HDL與NIOS II的通信資料交換——利用AVALON總線
實作FPGA Verilog HDL與NIOS II的通信資料交換——利用AVALON總線

3、signal一欄  這一欄比較重要。

實作FPGA Verilog HDL與NIOS II的通信資料交換——利用AVALON總線

系統的信号需要選擇為avalon_slave_0,時鐘是clock ,複位要選擇reset,輸出信号需要選擇conduit_end  singnal Type一欄也要選擇對用的信号類型。next

4、設定個人信号,IP名字,版本資訊,看個人了

實作FPGA Verilog HDL與NIOS II的通信資料交換——利用AVALON總線

完成一個自定義IP核的設計。

在NIOS中需要調用使用一下語句。

IOWR(SEG_0_BASE, 0, data);