先上代码:
module flash( output flash_dataout//flash数据输出 output led0 output led1 output wire [7:0] DB8 input flash_clk//flash时钟 input flash_cs input flash_datain ); 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; assign DB8 = clk_num; //cs上升沿需要初始化所有数据 标志着新的一条命令到来 //clk上升沿 读取数据 always @(posedge flash_cs or posedge flash_clk) //clk上升沿沿触发 begin if( flash_cs ) begin //cs 低电平状态 不知道为什么会进这个if语句内 clk_num <= 8'h00; //清除时钟计数 reg_cmd <= 8'h00; //清空命令寄存器 red_id <= 1'b0; //读取ID命令标志位 end else begin if(clk_num < 8) begin//前8个时钟是 命令 reg_cmd[7-clk_num] = flash_datain ;//循环将8位命令拼接 end else if(clk_num == 8) begin//接收完前8位命令 开始判断 led1_n <= ~led1_n; if(reg_cmd == 8'h4b) begin //判断是不是读取芯片ID red_id <= 1'b1; //读取ID命令标志位 end end clk_num <= clk_num + 8'h01;//时钟的下降沿计数 用来查询是否命令结束 led0_n <= ~led0_n; end end
程序的目的:为了模拟25Q64存储器部分功能,STM32向FPGA读取一个ID号,(时序与真实的25Q64一样)
逻辑分析仪采集到的数据:
0 -> flash_cs (stm32输出的片选) 1 -> flash_clk (stm32输出的时钟) 2 -> flash_datain(stm32输出的数据输出) 3->flash_dataout (FPGA输出的数据输出) 4-8 接的是 DB8的低4位 为了观察 clk_num 的数据
问题:每到 flash_datain 高电平的时候 clk_num就清空了 (也就是进入 if( flash_cs ) begin 这里面了),已经修改过引脚测试了,不是电路的问题,软件的问题,
reg_cmd[7-clk_num] = flash_datain ;//循环将8位命令拼接
这个语句是无效的对于综合器来说,可以使用移位寄存器代替