catking 发表于 2009-12-29 10:00:28

大家来看看如何描述这个时序……

如题,如图:
http://cache.amobbs.com/bbs_upload782111/files_24/ourdev_520195.jpg
如何描述一下这个时序? (原文件名:123.jpg)

catking 发表于 2009-12-29 13:29:07

补充说明:Sclk和 SDFO都是输入信号,通过这个时序来输出SDIN,

看了好长时间了,不知道如何下手,关键是需要看怎么能够通过两个信号来控制下面信号的输出。大家给点建议、思路啊。

qinxg 发表于 2009-12-29 13:32:59

写一个状态机即可: SCLK作为时钟,SDFO作为触发信号

281229961 发表于 2009-12-30 11:28:26

回复【2楼】qinxg
-----------------------------------------------------------------------


上个程序来看看啊

catking 发表于 2009-12-30 11:34:29

回复【2楼】qinxg
-----------------------------------------------------------------------
请问这个状态机怎么写啊,写哪种形式的,能不能提示的再具体一点啊?

NJ8888 发表于 2009-12-30 11:39:47

两个过程:一个当时钟为高时来了SDFO的上跳做个触发器输出Q=1,第二过程:有了Q=1后,当SDOF=0,在时钟SCLK下沿更新SDIN数据

catking 发表于 2009-12-30 15:16:31

回复【5楼】888888888888
-----------------------------------------------------------------------

还是不太理解,那什么时候操作Q=0啊,能说清楚点么?谢谢……

gibson08 发表于 2010-1-2 13:04:21

FPGA刚入手3天.不知道这个对不对呵.仿真波形如下:
module gibson(sclk,sdfo,sdin);
input sclk;
input sdfo;
output sdin;
reg q=0;
reg sdfo_reg=1;
reg din_reg;
always @(posedge sclk)
begin
if(sdfo)q<=1;
else sdfo_reg<=0;
end
always @(negedge sclk)
begin
if(q&&(!sdfo_reg))
din_reg<=din_reg+1;
end
assign sdin=din_reg;
endmodule
http://cache.amobbs.com/bbs_upload782111/files_24/ourdev_521483.jpg
(原文件名:未命名.jpg)

catking 发表于 2010-1-4 13:49:05

回复【7楼】gibson08
-----------------------------------------------------------------------
个人认为这个程序的关键点在于如下图一所示,而你的这个程序里面在此时的波形如图二所示,可能有些不对……欢迎大家批评指正。
http://cache.amobbs.com/bbs_upload782111/files_24/ourdev_522571.jpg
图一 (原文件名:图1.jpg)
http://cache.amobbs.com/bbs_upload782111/files_24/ourdev_522572.jpg
图二 (原文件名:图2.jpg)

catking 发表于 2010-1-7 10:24:31

怎么没人回答啊,希望大家帮帮忙了,说对说错不要紧,交流一下啊。

sadlife1000 发表于 2010-1-23 19:26:40

代码我写完了。你自己看看吧。
不是一开SCLK的下降沿,这个数据依靠SDFO的低电平的。
两个时钟。
对一个发现SDFO为高电平,设定标志位。
然后在第二个时钟,讲标志位SDFO低位共与得出结果。
其实就是检测SDFO边缘信号。

`timescale 1ns/1ns

module SDIN(sclk,data,sdfo,sdin);
   
parameter n=5;
input sclk;
input sdfo;
input data;
output sdin;

reg sdin_ready;
reg ready_flag;
reg sdin;


always @(posedge sclk)
begin
if(sdfo) begin
   sdin_ready <= data;
       ready_flag<=1'b1;
        end
else sdin_ready <= 0;
end

always @(posedge sclk)
begin
if(ready_flag&&(!sdfo)) begin
   ready_flag<=1'b0;
       sdin<=sdin_ready;
end
end
endmodule

sadlife1000 发表于 2010-1-23 19:27:23

测试代码
module SDIN_TOP;

parameter n=5;
reg in_sclk;
reg in_sdfo;
reg in_data;
wire out_sdin;

SDIN sdn(.sclk(in_sclk),
      .data(in_data),
      .sdfo(in_sdfo),
      .sdin(out_sdin));
      
      
initial
begin

   in_sclk=0;
   in_sdfo=0;
   in_data =5'b0_0000;
end

initial
    begin
    #12 in_sdfo=1;
    #25 in_sdfo=0;
end

always
begin
    #10 in_sclk=~in_sclk;
    if(in_data==5'b1_1111) in_data=5'b0_0000;
    else in_data=in_data+1'b1;
end


endmodule

sadlife1000 发表于 2010-1-23 19:28:36

http://cache.amobbs.com/bbs_upload782111/files_25/ourdev_527769.png
(原文件名:2010-01-23_192936.png)

catking 发表于 2010-1-25 16:37:17

回复【10楼】sadlife1000
-----------------------------------------------------------------------

感谢楼上的回答,但是这个地方有个疑问,在sdfo为低电平之后,并不是只送一个数据,而是在每个sclk的上升沿都要输送一个数据。请问这个怎么解决……

sadlife1000 发表于 2010-1-25 21:34:10

回复【13楼】catking
-----------------------------------------------------------------------

`timescale 1ns/1ns

module SDIN(sclk,data,sdfo,sdin);
   
parameter n=5;
input sclk;
input sdfo;
input data;
output sdin;

reg sdin_ready;
reg ready_flag;
reg sdin;
reg continue_flag;


always @(posedge sclk)
begin
if(sdfo|continue_flag) begin
   sdin_ready <= data;
       ready_flag<=1'b1;
        end
else sdin_ready <= 0;
end

always @(posedge sclk)
begin
if((ready_flag&&(!sdfo))||continue_flag) begin
   ready_flag<=1'b0;
       continue_flag<=1'b1;
       sdin<=sdin_ready;
end
end


endmodule

sadlife1000 发表于 2010-1-25 21:34:43

http://cache.amobbs.com/bbs_upload782111/files_25/ourdev_528977.jpg
(原文件名:未命名.jpg)

catking 发表于 2010-1-26 14:08:12

回复【15楼】sadlife1000
-----------------------------------------------------------------------
感谢楼上的回答,非常感谢……

catking 发表于 2010-1-27 10:24:05

回复【15楼】sadlife1000
-----------------------------------------------------------------------
刚刚验证了一下你的程序,综合出现错误,仔细一看原来你在两个always中对ready_flag进行了赋值,这样会产生竞争冒险的啊,请问能不能有个更好的解决办法?谢谢了……
页: [1]
查看完整版本: 大家来看看如何描述这个时序……