win70xc000000e修复-(win70xc000000e修复引导)
win70xce修复。
(win70xce修复引导)。
来源:创芯大讲堂。
创芯大讲堂:EETOP旗下在线教育平台,欢迎关注。
春节期间,EETOP分享了网友通过Vivado直接板级调试时钟用的PCIEIP输出的:春节快乐时序抓取图,纯粹的硬逻辑产生。如下图:。
作者:CETC41-缪国锋。
实现原理:因为项目需要,需要在板子上完成PCIE接口的通信,还要完成两路AD,两路DA的调试,还有四个颗粒的内存颗粒,来完成信号的收发,FPGA用的是XC7V690T,还有时钟芯片AD9512,ADI的这些芯片多是用SPI来控制寄存器,因此我在写寄存器的时候就想把寄存器的值换成节日祝福,应该挺有新意的,就从新例化了一个module,每配置完一个寄存器自动跳转到下一个,直到所有寄存器配置完成结束,每一个寄存器位数为16位,每个汉字16个值,前后加0隔开,一共74个,时钟也可以根据需要分频更改。
经作者授权,现将实现代码公布给大家:。
实现代码包含两个模块:。
SPI_16Bit_Controller。v。
Spi_Festival_Config。v。
SPI_16Bit_Controller。v。
`timescale1ns/1ps。
//////////////////////////////////////////////////////////////////////////////////。
//pany:。
//Engineer:。
//CreateDate:2019/01/2909:18:43。
//DesignName:。
//ModuleName:SPI_16Bit_Controller。
//ProjectName:。
//TargetDevices:。
//ToolVersions:。
//Deion:。
//Dependencies:。
//Revision:。
//Revision0.01-FileCreated。
//Additionalments:。
//////////////////////////////////////////////////////////////////////////////////。
moduleSPI_16Bit_Controller(。
inputclk_i,//SPI控制器时钟输入,。
input[15:0]spi_data,//SPI总线时钟信号并行输入。
inputspi_start,//启动传输。
inputrst_n,//SPI控制器复位信号。
(*mark_debug=“true”*)inputspi_miso,//SPI总线数据信号输入。
(*mark_debug=“true”*)outputwirespi_mosi,//SPI总线数据信号输出。
(*mark_debug=“true”*)outputwirespi_sclk,//SPI总线时钟信号输出。
(*mark_debug=“true”*)outputwirespi_cs,//SPI总线片选信号输出。
outputregdata_end//传输结束标志。
//以下信号为测试信号。
(*mark_debug=“true”*)reg[5:0]sd_counter;//SPI数据发送计数器。
(*mark_debug=“true”*)regspi_sdo_reg;//SPI控制器发送的串行数据。
(*mark_debug=“true”*)regspi_cs_reg;。
(*mark_debug=“true”*)reg[15:0]spi_data_reg;。
assignspi_sclk=(~spi_cs_reg)&(((sd_counter>=2)&(sd_counter<=18))?~clk_i:0);。
assignspi_mosi=spi_sdo_reg;//如果输出数据为1,spi_SDAT设为高阻。
assignspi_cs=spi_cs_reg;。
//--SPI计数器。
always@(negedgerst_norposedgeclk_i)。
begin。
if(!rst_n)sd_counter=6‘b;。
elsebegin。
if(spi_start==0)。
sd_counter=0;。
else。
begin。
if(sd_counter==6’b)。
sd_counter<=0;。
else。
sd_counter=sd_counter+1;。
end。
end。
end。
always@(negedgerst_norposedgeclk_i)。
begin。
if(!rst_n)。
beginspi_cs_reg=1‘b1;spi_sdo_reg=1’b0;data_end=1‘b1;end。
else。
case(sd_counter)。
6’d0:beginspi_cs_reg<=1‘b1;data_end<=1’b0;spi_sdo_reg=1‘b0;end。
////////////////////////SPISTART////////////////////////////////////。
6’d1:beginspi_cs_reg<=1‘b1;spi_data_reg<=spi_data;end。
//发送从设备地址。
6’d2:beginspi_cs_reg<=1‘b0;spi_sdo_reg<=spi_data_reg[15];end。
6’d3:beginspi_cs_reg<=1‘b0;spi_sdo_reg<=spi_data_reg[14];end。
6’d4:beginspi_cs_reg<=1‘b0;spi_sdo_reg<=spi_data_reg[13];end。
6’d5:beginspi_cs_reg<=1‘b0;spi_sdo_reg<=spi_data_reg[12];end。
6’d6:beginspi_cs_reg<=1‘b0;spi_sdo_reg<=spi_data_reg[11];end。
6’d7:beginspi_cs_reg<=1‘b0;spi_sdo_reg<=spi_data_reg[10];end。
6’d8:beginspi_cs_reg<=1‘b0;spi_sdo_reg<=spi_data_reg[9];end。
6’d9:beginspi_cs_reg<=1‘b0;spi_sdo_reg<=spi_data_reg[8];end。
6’d10:beginspi_cs_reg<=1‘b0;spi_sdo_reg<=spi_data_reg[7];end。
6’d11:beginspi_cs_reg<=1‘b0;spi_sdo_reg<=spi_data_reg[6];end。
6’d12:beginspi_cs_reg<=1‘b0;spi_sdo_reg<=spi_data_reg[5];end。
6’d13:beginspi_cs_reg<=1‘b0;spi_sdo_reg<=spi_data_reg[4];end。
6’d14:beginspi_cs_reg<=1‘b0;spi_sdo_reg<=spi_data_reg[3];end。
6’d15:beginspi_cs_reg<=1‘b0;spi_sdo_reg<=spi_data_reg[2];end。
6’d16:beginspi_cs_reg<=1‘b0;spi_sdo_reg<=spi_data_reg[1];end。
6’d17:beginspi_cs_reg<=1‘b0;spi_sdo_reg<=spi_data_reg[0];end。
//////////////////////SPISTOP//////////////////////////////////////。
6’d18:beginspi_cs_reg<=1‘b0;spi_sdo_reg<=1’b0;data_end<=1‘b0;end。
6’d19:beginspi_cs_reg<=1‘b1;spi_sdo_reg<=1’b0;data_end<=1‘b1;end。
default:beginspi_cs_reg<=1’b1;spi_sdo_reg<=1‘b0;data_end<=1’b0;end。
endcase。
end。
endmodule。
Spi_Festival_Config。v代码。
`timescale1ns/1ps。
//////////////////////////////////////////////////////////////////////////////////。
//pany:。
//Engineer:。
//CreateDate:2019/01/2908:42:10。
//DesignName:。
//ModuleName:Spi_Festival_Config。
//ProjectName:。
//TargetDevices:。
//ToolVersions:。
//Deion:。
//Dependencies:。
//Revision:。
//Revision0.01-FileCreated。
//Additionalments:。
//////////////////////////////////////////////////////////////////////////////////。
moduleSpi_Festival_Config(。
inputclk_i,//时钟输入。
inputrst_n,//复位信号。
input[12:0]wr_addr,。
input[31:0]wr_data,。
inputwr_en,。
inputspi_miso,//SPI总线数据信号输入。
outputwirespi_sclk,//SPI总线时钟信号输出。
outputwirespi_mosi,//SPI总线数据信号。
outputwirespi_cs//SPI使能。
//内部寄存器及连线。
(*mark_debug=“true”*)reg[15:0]spi_data_reg;。
(*mark_debug=“true”*)regspi_start;。
(*mark_debug=“true”*)wireSPI_END;//寄存器并串转换结束标志位。
(*mark_debug=“true”*)reg[15:0]reg_data;。
(*mark_debug=“true”*)reg[7:0]addr_index;。
//时钟参数。
parameterCLK_Freq=;//输入的系统时钟100MHz。
parameterSPI_Freq=;//SPI总线时钟10MHz。
//存储SPI配置数据的查找表容量。
parameterLUT_SIZE=72;。
(*mark_debug=“true”*)reg[1:0]state;。
//statemachinecode。
localparamS_IDLE=2‘b00;。
localparamS_START=2’b01;//startbit。
localparamS_STOP=2‘b10;。
//////100MHz时钟分频得到10MHz的SPI控制时钟//////。
(*mark_debug=“true”*)reg[7:0]spi_clk_div;。
(*mark_debug=“true”*)regspi_ctrl_clk;。
always@(posedgeclk_iornegedgerst_n)。
begin。
if(!rst_n)。
begin。
spi_ctrl_clk<=0;。
spi_clk_div<=8’h00;。
end。
else。
begin。
if(spi_clk_div==(CLK_Freq/SPI_Freq-1‘b1))。
begin。
spi_clk_div<=0;。
spi_ctrl_clk<=~spi_ctrl_clk;。
end。
else。
spi_clk_div<=spi_clk_div+1;。
end。
end。
wireinitial_en;//触发信号,可使用单脉冲做触发源;。
reginitial_clr;//初始化结束清零位;。
regwr_start_en;//初始化使能开始;。
assigninitial_en=(wr_addr==12’h660&wr_en);。
always@(posedgeclk_i)。
begin。
if(initial_clr)。
begin。
wr_start_en<=1‘b0;。
end。
elseif(initial_en)。
begin。
wr_start_en<=1’b1;。
end。
end。
//////////////////////配置过程控制///////////////////////。
always@(posedgespi_ctrl_clkornegedgerst_n)。
begin。
if(~rst_n)//复位。
begin。
addr_index<=0;。
spi_start<=0;。
end。
else。
begin。
if(wr_start_en)。
begin。
if(addr_index begin。 case(state)。 S_IDLE:begin//第一步:准备数据,启动传输。 spi_data_reg<=reg_data;。 spi_start<=1‘b1;。 state<=1’b1;end。 S_START:。 begin。 if(SPI_END)//第二步:检验传输是否正常结束。 begin。 state<=S_STOP;。 spi_start<=1‘b0;。 end。 else。 state<=S_START;。 end。 S_STOP:begin//传输结束,改变LUT_INDEX的值,准备传输下一个数据。 addr_index<=addr_index+1;。 state<=S_IDLE;end。 endcase。 end。 else。 begin。 state<=S_IDLE;。 addr_index<=0;。 initial_clr<=1’b1;。 end。 end。 elseinitial_clr<=1‘b0;。 end。 end。 /////////////////////配置数据查找表//////////////////////////。 always@(posedgeclk_i)。 begin。 case(addr_index)。 8’d00:beginreg_data<=16‘h0000;end。 8’d01:beginreg_data<=16‘h0000;end。 8’d02:beginreg_data<=16‘h0020;end。 8’d03:beginreg_data<=16‘h0020;end。 8’d04:beginreg_data<=16‘h0040;end。 8’d05:beginreg_data<=16‘h1140;end。 8’d06:beginreg_data<=16‘h1180;end。 8’d07:beginreg_data<=16‘h15ff;end。 8’d08:beginreg_data<=16‘h1549;end。 8’d09:beginreg_data<=16‘h7f49;end。 8’d10:beginreg_data<=16‘h7f49;end。 8’d11:beginreg_data<=16‘h1549;end。 8’d12:beginreg_data<=16‘h15ff;end。 8’d13:beginreg_data<=16‘h1180;end。 8’d14:beginreg_data<=16‘h1140;end。 8’d15:beginreg_data<=16‘h0040;end。 8’d16:beginreg_data<=16‘h0020;end。 8’d17:beginreg_data<=16‘h0020;end。 8’d18:beginreg_data<=16‘h0000;end。 8’d19:beginreg_data<=16‘h0000;end。 8’d20:beginreg_data<=16‘h0800;end。 8’d21:beginreg_data<=16‘h0800;end。 8’d22:beginreg_data<=16‘h0900;end。 8’d23:beginreg_data<=16‘h0900;end。 8’d24:beginreg_data<=16‘h7f00;end。 8’d25:beginreg_data<=16‘h7f00;end。 8’d26:beginreg_data<=16‘h0900;end。 8’d27:beginreg_data<=16‘h09ff;end。 8’d28:beginreg_data<=16‘h09ff;end。 8’d29:beginreg_data<=16‘h0900;end。 8’d30:beginreg_data<=16‘h7f20;end。 8’d31:beginreg_data<=16‘h7f20;end。 8’d32:beginreg_data<=16‘h0910;end。 8’d33:beginreg_data<=16‘h09f0;end。 8’d34:beginreg_data<=16‘h0800;end。 8’d35:beginreg_data<=16‘h0800;end。 8’d36:beginreg_data<=16‘h0000;end。 8’d37:beginreg_data<=16‘h0000;end。 8’d38:beginreg_data<=16‘h0180;end。 8’d39:beginreg_data<=16‘h0e00;end。 8’d40:beginreg_data<=16‘h7fff;end。 8’d41:beginreg_data<=16‘h7fff;end。 8’d42:beginreg_data<=16‘h0c00;end。 8’d43:beginreg_data<=16‘h0443;end。 8’d44:beginreg_data<=16‘h0842;end。 8’d45:beginreg_data<=16‘h084c;end。 8’d46:beginreg_data<=16‘h0858;end。 8’d47:beginreg_data<=16‘h7fe0;end。 8’d48:beginreg_data<=16‘h0870;end。 8’d49:beginreg_data<=16‘h084c;end。 8’d50:beginreg_data<=16‘h0846;end。 8’d51:beginreg_data<=16‘h0fc2;end。 8’d52:beginreg_data<=16‘h0041;end。 8’d53:beginreg_data<=16‘h0040;end。 8’d54:beginreg_data<=16‘h0000;end。 8’d55:beginreg_data<=16‘h0000;end。 8’d56:beginreg_data<=16‘h0006;end。 8’d57:beginreg_data<=16‘h3f8c;end。 8’d58:beginreg_data<=16‘h2098;end。 8’d59:beginreg_data<=16‘h20b0;end。 8’d60:beginreg_data<=16‘h2081;end。 8’d61:beginreg_data<=16‘h2081;end。 8’d62:beginreg_data<=16‘h2083;end。 8’d63:beginreg_data<=16‘h2ffe;end。 8’d64:beginreg_data<=16‘h2080;end。 8’d65:beginreg_data<=16‘h4080;end。 8’d66:beginreg_data<=16‘h4080;end。 8’d67:beginreg_data<=16‘h4098;end。 8’d68:beginreg_data<=16‘h408c;end。 8’d69:beginreg_data<=16‘h4086;end。 8’d70:beginreg_data<=16‘h0000;end。 8’d71:beginreg_data<=16‘h0000;end。 default:beginreg_data<=16’h0000;end。 endcase。 end。 //定义上位机单独配置寄存器的值,无需更改不用配置。 regpci_write_en;。 reg[15:0]spi_data;。 reg[7:0]wr_en_t;。 always@(posedgeclk_i)。 begin。 if(SPI_END)。 begin。 pci_write_en<=1‘b0;。 end。 elseif(wr_addr==12’h650&wr_en)。 pci_write_en<=1‘b1;。 end。 always@(posedgeclk_i)。 begin。 if(~rst_n)。 spi_data<=16’h0000;。 else。 begin。 if((wr_addr[12:0]==13'h640)&wr_en)。 spi_data<=wr_data[15:0];。 elseif(spi_start)。 spi_data<=spi_data_reg[15:0];。 end。 end。 wirespi_en;。 assignspi_en=pci_write_en|spi_start;。 ////例化SPI控制器将16位并行数据完成并串转换///。 SPI_16Bit_ControllerSPI_16Bit_Controller_inst(。 。clk_i(spi_ctrl_clk),//SPI控制器工作时钟。 。spi_sclk,//SPI总线时钟信号。 。spi_miso,//SPI总线数据信号。 。spi_mosi,//SPI总线数据信号。 。spi_cs,//SPI总线使能信号。 。spi_data(spi_data),//寄存器data。 。spi_start(spi_en),//启动传输。 。data_end(SPI_END),//传输结束标志。 。rst_n(rst_n)//复位信号。 endmodule。