大家来看看如何描述这个时序……
如题,如图:http://cache.amobbs.com/bbs_upload782111/files_24/ourdev_520195.jpg
如何描述一下这个时序? (原文件名:123.jpg) 补充说明:Sclk和 SDFO都是输入信号,通过这个时序来输出SDIN,
看了好长时间了,不知道如何下手,关键是需要看怎么能够通过两个信号来控制下面信号的输出。大家给点建议、思路啊。 写一个状态机即可: SCLK作为时钟,SDFO作为触发信号 回复【2楼】qinxg
-----------------------------------------------------------------------
上个程序来看看啊 回复【2楼】qinxg
-----------------------------------------------------------------------
请问这个状态机怎么写啊,写哪种形式的,能不能提示的再具体一点啊? 两个过程:一个当时钟为高时来了SDFO的上跳做个触发器输出Q=1,第二过程:有了Q=1后,当SDOF=0,在时钟SCLK下沿更新SDIN数据 回复【5楼】888888888888
-----------------------------------------------------------------------
还是不太理解,那什么时候操作Q=0啊,能说清楚点么?谢谢…… 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) 回复【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) 怎么没人回答啊,希望大家帮帮忙了,说对说错不要紧,交流一下啊。 代码我写完了。你自己看看吧。
不是一开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 测试代码
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 http://cache.amobbs.com/bbs_upload782111/files_25/ourdev_527769.png
(原文件名:2010-01-23_192936.png) 回复【10楼】sadlife1000
-----------------------------------------------------------------------
感谢楼上的回答,但是这个地方有个疑问,在sdfo为低电平之后,并不是只送一个数据,而是在每个sclk的上升沿都要输送一个数据。请问这个怎么解决…… 回复【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 http://cache.amobbs.com/bbs_upload782111/files_25/ourdev_528977.jpg
(原文件名:未命名.jpg) 回复【15楼】sadlife1000
-----------------------------------------------------------------------
感谢楼上的回答,非常感谢…… 回复【15楼】sadlife1000
-----------------------------------------------------------------------
刚刚验证了一下你的程序,综合出现错误,仔细一看原来你在两个always中对ready_flag进行了赋值,这样会产生竞争冒险的啊,请问能不能有个更好的解决办法?谢谢了……
页:
[1]