想使用FPGA代替25Q64存储器部分功能,只使用ID读取这一部分,以下是他的时序图 ,通过STM32向FPGA读取这个ID
使用仿真,一切正常,读取的命令 数据都正常 时序也正常,但是使用STM32读取就不行了,(确认过程序可以读取真实的25q64存储器ID)
刚上个星期接触FPGA,写的程序不咋样,但是编译可以通过,希望大神可以赐教
module flash( output flash_dataout//flash数据输出 output led0 output led1 input flash_clk//flash时钟 input flash_cs input flash_datain ); //reg cs_bit;//CS低电平标志位 也就是数据读写标志位 reg [7:0] clk_num;//时钟计数 reg [7:0] reg_cmd;//命令寄存器 reg red_id= 1'b0;//读取命令标志位 reg data_out= 1'b1; reg led0_n = 1'b1; reg led1_n = 1'b1; parameter ID_data=64'h0102030405060708; assign flash_dataout = red_id ? data_out : flash_datain ; assign led0 = led0_n ? 1'b1 : 1'b0; assign led1 = led1_n ? 1'b1 : 1'b0; //cs上升沿需要初始化所有数据 标志着新的一条命令到来 //clk上升沿 读取数据 always @(posedge flash_cs or posedge flash_clk) //clk上升沿沿触发 begin if( flash_cs == 1'b1 ) begin //cs 高电平状态 clk_num <= 1'b0; //清除时钟计数 reg_cmd <= 8'h00; //清空命令寄存器 red_id <= 1'b0; //读取ID命令标志位 end else begin if(clk_num < 8) begin//前8个时钟是 命令 reg_cmd = reg_cmd |(flash_datain << (7-clk_num));//循环将8位命令拼接 //DB8 <= reg_cmd; end if(clk_num == 8) begin//接收完前8位命令 开始判断 led0_n <= ~led0_n; if(reg_cmd == 8'h4b) begin //判断是不是读取芯片ID led1_n <= ~led1_n;// red_id <= 1'b1; //读取ID命令标志位 end end clk_num <= clk_num + 1'b1;//时钟的下降沿计数 用来查询是否命令结束 end end always @( negedge flash_clk) //clk下降沿触发 begin if( red_id == 1'b1 ) begin//如果读取的是ID if( clk_num > 40 ) begin //后面的全部是数据 //DB9 <= clk_num; data_out <= ID_data[(104-clk_num)];//循环输出64位ID号 end end end endmodule
data_out <= ID_data[(104-clk_num)];
index内不能使用reg型,你检查一个综合器的警告,会有提示;你这句最后被综合成一个简单的赋值语句,也就是输出是一个常量,不会变化;因为这种语句不可综合,但是仿真是支持的