我想用verilog做一个单周期的方波 分别是20和10 下面是我写的代码 编译的时候没有问题 但是仿真的结果却不

2024-12-20 04:28:07
推荐回答(3个)
回答1:

第二个回答是正确的
你原来仿真的现象应该是当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

回答2:

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

回答3:

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;