FPGA中ICAP原语的使用——Multiboot功能的实现
ICAP原語的使用
- 一、雜談
- ICAP原語的介紹
- ICAPE2原語的介紹
- ICAPE2原語的代碼
- 驗證
- 結束語
一、雜談
有一段時間沒寫博客了,因為從學校回家了。現在正值肺炎流行,不給社會添麻煩,自己在家調調程序看看論文。可是今天寫的icap原語在板子上的驗證沒通過,因為學的是icap原語是用在S6芯片上的,但是因為自己回家沒帶S6的開發板,這里用7系列的icape2原語進行做實驗,雖然板上驗證沒通過,但是還是非常用實用意義。最后在這個不平穩的日子里,希望武漢加油、中國加油、一起共度難關!!!
ICAP原語的介紹
ICAP原語是S6芯片上的一個原語,這里有必要對原語的概念說明一下,我們可以把原語想象成一個IP核,只不過IP核是圖形化界面,而原語就相當于生成IP核生成的.v文件,原語的使用不需要添加相應的文件。對于ISE軟件,原語調用的位置如下:
其中對應的ICAP原語的調用位置如下:
其中,icap原語的內容如下:
這里對原語中得分幾個信號的使用做出介紹:
1、DEVICE_ID:不同芯片的DEVICE_ID不相同,在使用該原語時,一定要查找對用芯片的ID,具體查找的數據手冊UG380 ;
2、SIM_CFG_FILE_NAME:仿真使用,默認即可。
3、BUSY:原語對應的忙信號
4、O:配置數據的輸出
5、CE:原語的使能信號,低電平有效
6、CLK:原語的時鐘信號
7、I:原語配置數據的輸入信號
8、WRITE:讀寫原語的使能信號,低電平有效
這里需要在DEVICE_ID中填入對應的ID號
然后按照上面的要求該原語得從I中輸入相應的指令,FPGA才能從指定的存儲地址啟動。
按照上面的數據輸入到ICAP原語中,FPGA便可以從制定的存儲器件指定的存儲地址中讀取代碼,這里需要注意的是I中的數據與上表中的數據要按照字節反轉,這部分內容在手冊中也能查找到,如下:
這里需要重點解釋Opcode的含義,如下圖:
該Opcode的物理意義是對用flash的讀命令代碼,對應鎂光的一般是0x03。其余配置數據的含義從圖中可以知道。有了以上信息,我們便可以操作S6系列的ICAP原語。
ICAPE2原語的介紹
由于在家沒帶S6的開發板,我們緊接著介紹A7開發板中ICAP原語的使用,通S6一樣知道上述信息如下:
對于vivado軟件,原語調用的位置如下:
其中對應的ICAP原語的調用位置如下:
其中,icap原語的內容如下:
ICAPE2原語的代碼
工程1的代碼:
top模塊的代碼
icap_start模塊的代碼:
`timescale 1ns / 1ps // ********************************************************************************* // Project Name : OSXXXX // Author : zhangningning // Email : nnzhang1996@foxmail.com // Website : // Module Name : icap_start.v // Create Time : 2020-01-29 13:02:26 // Editor : sublime text3, tab size (4) // CopyRight(c) : All Rights Reserved // // ********************************************************************************* // Modification History: // Date By Version Change Description // ----------------------------------------------------------------------- // XXXX zhangningning 1.0 Original // // *********************************************************************************module icap_start(input sclk ,input rst_n ,input icap_flag ,output reg icap_done );//========================================================================================\ //**************Define Parameter and Internal Signals********************************** //========================================================================================/ wire csib ; reg [31:0] con_data [ 7:0] ; wire [31:0] con_data_r ; reg [ 2:0] cnt ; reg busy_flag ; reg rdwrb ;//========================================================================================\ //************** Main Code ********************************** //========================================================================================/ initial begincon_data[0] = 32'hFFFF_FFFF;con_data[1] = 32'hAA99_5566;con_data[2] = 32'h2000_0000;con_data[3] = 32'h3002_0001;con_data[4] = 32'h00a0_0000;con_data[5] = 32'h3000_8001;con_data[6] = 32'h0000_000F;con_data[7] = 32'h2000_0000; end assign csib = ~busy_flag; assign con_data_r = {con_data[cnt][24],con_data[cnt][25],con_data[cnt][26],con_data[cnt][27],con_data[cnt][28],con_data[cnt][29],con_data[cnt][30],con_data[cnt][31],con_data[cnt][16],con_data[cnt][17],con_data[cnt][18],con_data[cnt][19],con_data[cnt][20],con_data[cnt][21],con_data[cnt][22],con_data[cnt][23],con_data[cnt][08],con_data[cnt][09],con_data[cnt][10],con_data[cnt][11],con_data[cnt][12],con_data[cnt][13],con_data[cnt][14],con_data[cnt][15],con_data[cnt][00],con_data[cnt][01],con_data[cnt][02],con_data[cnt][03],con_data[cnt][04],con_data[cnt][05],con_data[cnt][06],con_data[cnt][07]};always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0)busy_flag <= 1'b0;else if(icap_flag == 1'b1 && busy_flag == 1'b0)busy_flag <= 1'b1; else if(cnt == 3'd7 && rdwrb == 1'b0)busy_flag <= 1'b0;elsebusy_flag <= busy_flag;always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0)cnt <= 3'd0;else if(busy_flag == 1'b1 && rdwrb == 1'b0)cnt <= cnt + 1'b1;else if(cnt == 3'd7 && rdwrb == 1'b0)cnt <= 3'd0;elsecnt <= cnt;always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0)icap_done <= 1'b0; else if(cnt == 3'd7 && rdwrb == 1'b0)icap_done <= 1'b1;elseicap_done <= 1'b0;always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0)rdwrb <= 1'b1; else if(cnt == 3'd7 && rdwrb == 1'b0)rdwrb <= 1'b1; else if(busy_flag == 1'b1)rdwrb <= 1'b0;elserdwrb <= rdwrb;ICAPE2 #(.DEVICE_ID (32'h3631093 ), // Specifies the pre-programmed Device ID value to be used for simulation// purposes..ICAP_WIDTH ("X32" ), // Specifies the input and output data width..SIM_CFG_FILE_NAME ("NONE" ) // Specifies the Raw Bitstream (RBT) file to be parsed by the simulation )ICAPE2_inst(.O ( ), // 32-bit output: Configuration data output bus.CLK (sclk ), // 1-bit input: Clock Input.CSIB (csib ), // 1-bit input: Active-Low ICAP Enable.I (con_data_r ), // 32-bit input: Configuration data input bus.RDWRB (rdwrb ) // 1-bit input: Read/Write Select input );//========================================================================================\ //******************************* Debug ********************************** //========================================================================================/ ila_0 ila_0_inst (.clk (sclk ), // input wire clk.probe0 (icap_flag ), // input wire [0:0] probe0 .probe1 (icap_done ), // input wire [0:0] probe1 .probe2 (csib ), // input wire [0:0] probe2 .probe3 (rdwrb ), // input wire [0:0] probe3 .probe4 (con_data_r ) // input wire [31:0] probe4 );endmoduleled模塊的代碼:
`timescale 1ns / 1ps // ********************************************************************************* // Project Name : OSXXXX // Author : zhangningning // Email : nnzhang1996@foxmail.com // Website : // Module Name : led.v // Create Time : 2020-01-30 11:47:29 // Editor : sublime text3, tab size (4) // CopyRight(c) : All Rights Reserved // // ********************************************************************************* // Modification History: // Date By Version Change Description // ----------------------------------------------------------------------- // XXXX zhangningning 1.0 Original // // *********************************************************************************module led(input sclk ,input rst_n ,output reg [ 3:0] led );//========================================================================================\ //**************Define Parameter and Internal Signals********************************** //========================================================================================///========================================================================================\ //************** Main Code ********************************** //========================================================================================/ always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0)led <= 4'b0000;else led <= 4'b1010;endmodulekey模塊的代碼:
`timescale 1ns / 1ps // ********************************************************************************* // Project Name : OSXXXX // Author : zhangningning // Email : nnzhang1996@foxmail.com // Website : // Module Name : key.v // Create Time : 2020-01-05 13:49:36 // Editor : sublime text3, tab size (4) // CopyRight(c) : All Rights Reserved // // ********************************************************************************* // Modification History: // Date By Version Change Description // ----------------------------------------------------------------------- // XXXX zhangningning 1.0 Original // // *********************************************************************************module key(input sclk ,input rst_n ,input key ,output reg key_o );//========================================================================================\ //**************Define Parameter and Internal Signals********************************** //========================================================================================/ parameter IDLE = 4'b0001 ; parameter S1 = 4'b0010 ; parameter S2 = 4'b0100 ; parameter S3 = 4'b1000 ;reg [ 3:0] state ; reg [ 9:0] cnt ; reg key_r1 ; reg key_r2 ; reg key_r3 ; reg nege_flag ; reg pose_flag ;//========================================================================================\ //************** Main Code ********************************** //========================================================================================/ always @(posedge sclk)key_r1 <= key;always @(posedge sclk)key_r2 <= key_r1;always @(posedge sclk)key_r3 <= key_r2;always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0)nege_flag <= 1'b0;else if(key_r3 == 1'b1 && key_r2 == 1'b0)nege_flag <= 1'b1;elsenege_flag <= 1'b0;always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0)pose_flag <= 1'b0;else if(key_r3 == 1'b0 && key_r2 == 1'b1) pose_flag <= 1'b1;elsepose_flag <= 1'b0;always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0)state <= IDLE;else case(state)IDLE : if(nege_flag == 1'b1)state <= S1;elsestate <= IDLE; S1 : if(cnt == 10'd999)state <= S2;else if(pose_flag == 1'b1)state <= IDLE;elsestate <= S1; S2 : if(pose_flag == 1'b1)state <= S3;elsestate <= S2; S3 : if(cnt == 10'd999)state <= IDLE;else if(nege_flag == 1'b1)state <= S2;elsestate <= S3;default : state <= IDLE;endcasealways @(posedge sclk or negedge rst_n)if(rst_n == 1'b0)cnt <= 10'd0;else if(state != S1 && state != S3)cnt <= 10'd0;elsecnt <= cnt + 1'b1;always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0)key_o <= 1'b0;else if(state == S1 && cnt == 10'd999) key_o <= 1'b1;elsekey_o <= 1'b0;endmodule工程2的代碼:
`timescale 1ns / 1ps // ********************************************************************************* // Project Name : OSXXXX // Author : zhangningning // Email : nnzhang1996@foxmail.com // Website : // Module Name : led.v // Create Time : 2020-01-30 11:47:29 // Editor : sublime text3, tab size (4) // CopyRight(c) : All Rights Reserved // // ********************************************************************************* // Modification History: // Date By Version Change Description // ----------------------------------------------------------------------- // XXXX zhangningning 1.0 Original // // *********************************************************************************module led(input sclk ,input rst_n ,output reg [ 3:0] led );//========================================================================================\ //**************Define Parameter and Internal Signals********************************** //========================================================================================///========================================================================================\ //************** Main Code ********************************** //========================================================================================/ always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0)led <= 4'b0000;else led <= 4'b1010;endmodule驗證
上面的程序是我按照ICAP原語的使用直接擴展到ICAPE2原語上面,上板結果有點小問題,但是按照該方法寫ICAP原語是沒問題的,應該是自己對ICAPE2的使用還沒熟悉,等回到學校仔細讀了技術手冊再做相應的改正。
結束語
創作不易,認為文章有幫助的同學們可以收藏點贊支持。(工程也都在群中)對文章有什么看法或者需要更近一步交流的同學,可以加入下面的群:
總結
以上是生活随笔為你收集整理的FPGA中ICAP原语的使用——Multiboot功能的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习 基于加州房价的线性回归实验
- 下一篇: compiler java_使用Java