• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

FPGA仿真时序正常,使用STM32与他通讯就不正常

视觉℡ 2018-09-03 浏览量:1074



想使用FPGA代替25Q64存储器部分功能,只使用ID读取这一部分,以下是他的时序图 ,通过STM32向FPGA读取这个ID


QQ图片20180903174436.jpg使用仿真,一切正常,读取的命令  数据都正常   时序也正常,但是使用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

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 你这程序语法有问题

    data_out <= ID_data[(104-clk_num)];

    index内不能使用reg型,你检查一个综合器的警告,会有提示;你这句最后被综合成一个简单的赋值语句,也就是输出是一个常量,不会变化;因为这种语句不可综合,但是仿真是支持的

    • 发布于 2018-09-24
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:7
  • 时序正确,只是可以通讯上,但是协议是不是可以识别的呢
    • 发布于2018-09-03
    • 举报
    • 评论 0
    • 2
    • 0

  • 访问时钟频率应该注意一下,太快的话会丢失数据的
    • 发布于2018-09-04
    • 举报
    • 评论 0
    • 0
    • 0

  • 看看是不是spi通讯函数有问题!stm32一般可以调用库函数实现的!
    • 发布于2018-09-04
    • 举报
    • 评论 0
    • 0
    • 0

  • 看看你的IDE配置的是软件仿真 还是是用的 stm32 
    • 发布于2018-09-04
    • 举报
    • 评论 0
    • 0
    • 0

  • 仿真一下,看看收发的数据吧,是不是数据不对
    • 发布于2018-09-04
    • 举报
    • 评论 0
    • 0
    • 0

  • 这种情况建议你排查一下时序的问题,用逻辑分析仪观察一下时序
    • 发布于2018-09-21
    • 举报
    • 评论 0
    • 0
    • 0

  • 要仿真一下你的程序,看程序中是否有时序或者数据存在问题
    • 发布于2018-10-13
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

FPGA仿真时序正常,使用STM32与他通讯就不正常