shinehjx 发表于 2010-6-9 12:22:29

新手求助,Verilog编写SPI读取计数的问题

现在是ss为高电平时取计数数据,低电平时SPI发送,仿真通过但总觉得有点别扭
请教如何改?才能达到只在ss的下降沿才执行一次读取计数器的动作。

/* SPI SLAVE */
module Clock(clk,spsck,mosi,miso,ss);
input clk,spsck,mosi,ss;       
output miso;

reg counter;
reg out_data;
reg miso;
       
always@(posedge clk)
    begin
      counter = counter+1;
    end

always@(posedge spsck or posedge ss)
    begin
      if (ss)
      begin
      out_data = counter;       // 如何改?才能使此句只在ss的下降沿才执行一次
      end
      else
      begin
      miso = out_data;
      out_data = out_data >> 1;
      end
    end
       
endmodule

http://cache.amobbs.com/bbs_upload782111/files_29/ourdev_560646JHFM2A.JPG
仿真波形 (原文件名:simclock.JPG)

http://cache.amobbs.com/bbs_upload782111/files_29/ourdev_560647SICQ50.JPG
SPI时序 (原文件名:m8spi.JPG)

tear086 发表于 2010-6-9 12:41:30

negedge ss

shinehjx 发表于 2010-6-9 14:39:56

楼上可否写详细点

如果这样写always@(posedge spsck or negedge ss)
下面就不知要如何处理了,如再判断ss的话就变成低电平读取计数器而非下降沿读取了

wangbo19852008 发表于 2010-6-9 22:54:41

count是基于高频clk时域,
always@(posedge spsck or posedge ss)
    begin
      if (ss)
      begin
      out_data = counter;       // 如何改?才能使此句只在ss的下降沿才执行一次
      end

你用低频的spsck处理out_data = counter; 这样out_data很有可能才空,或者采不到你实际需要的值。
对于采一次ss的下降沿可以这样处理:
always@(posedge spsck)
begin
   ss_buf1 <= ss;
   ss_buf2 <= ss_buf1;
end

assign ss_down = !ss_buf1 && ss_buf2;
//ss_down为ss信号的下降沿
页: [1]
查看完整版本: 新手求助,Verilog编写SPI读取计数的问题