第二个回答是正确的
你原来仿真的现象应该是当j==19时,F500KB发生翻转,以后就保持不变了。
原因就是j==19之后没有了加1操作。
下面是我的建议:
1.这个代码应该分成两段来写,代码清晰,而且可以提高工作频率。
2.对于多分支结构,一般采用case结构。这样可以提高工作频率,一般情况下也能节省逻辑资源。
reg[4:0]j;
always@(posedge F10MB)
if(! RESET)
j <= 5'd0;
else if(j==29)
j <= 5'd0;
else
j <= j+5'd1;
always@(posedge F10MB)
if(! RESET)
F500KB <= 0;
else
case(j)
5'd19:
F500KB <= ~F500KB;
5'd29:
F500KB <= ~F500KB;
default:;
endcase
另外不明白你的复位方式,是同步复位吗?建议看一下同步复位、异步复位及 异步复位、同步释放的区别
http://blog.ednchina.com/ilove314/201656/message.aspx
module (clk,
clk2,
rst_2,
period);
input clk,clk2,rst_2;
output [9:0] period;
reg [9:0] period;
reg clk_1d;
reg cnt[9:0];
wire clk_pos;
always @ ( posedge clk2 or negedge rst_2 ) begin
if ( rst_2 == 1'b0 ) begin
clk_1d <= 1'b0;
end
else begin
clk_1d <= clk;
end
end
assign clk_pos = clk & (~clk_1d);
always @ ( posedge clk2 or negedge rst_2 ) begin
if ( rst_2 == 1'b0 ) begin
cnt[9:0] <= 10'd0;
end
else if ( clk_pos == 1'b1 ) begin
cnt[9:0] <= 10'd0;
end
else begin
cnt[9:0] <= cnt[9:0] + 10'd1;
end
end
always @ ( posedge clk2 or negedge rst_2 ) begin
if ( rst_2 == 1'b0 ) begin
period[9:0] <= 10'd0;
end
else if ( clk_pos == 1'b1 ) begin
period[9:0] <= cnt[9:0];
end
else begin
;
end
end
endmodule
补充说明:需要测量的时钟周期最多为追加的时钟频率的1024倍。
祝好,
Timothy
always@(posedge F10MB)
if(! RESET)
begin
F500KB <= 0;
j <= 0;
end
else if(j==19)
begin
F500KB <= ~F500KB;
j <= j+1;
end
else if(j==29)
begin
j <= 0;
F500KB <= ~F500KB;
end
else
j <= j+1;