我正在学习Verilog HDL。现在,我正在尝试在Digilent Atlys Spartan 6 xc6slx45上运行一个程序 我正在董事会上实施这个计数器。
module counter_s2( output reg [7:0] count);
initial begin
count=0;
repeat(127) begin
#10000000 count=count+1;
end
end
endmodule
当我在电路板上运行此代码时,我得到1111111的最终输入。电路板上没有延迟。我想产生一个延迟,比如1秒,看看输出。 谢谢!
P.S:我是Verilog的新手。答案 0 :(得分:1)
您创建的内容适用于测试平台组件,并且可以在模拟中使用,但它的某些部分不可合成。
特别是initial
只能用于fpgas来设置初始值,它不能随着时间的推移而改变,在这个块中,它可以在一个单独的块中更新。注意:这是两个区块可以设置相同注册的唯一时间。
#delay
个值。任意异步时序控制不能可靠地实现,因此不是综合工具的一部分。
为了开发Verilog计数器,通常使用时钟,这意味着他的计数器值将保存在触发器中。为了能够观察到计数,你需要一个足够慢的时钟。
以下计数器将溢出并继续计数
module counter_s2(
input clk,
output reg [7:0] count
);
initial begin
count= 'b0;
end
always @(posedge clk) begin
count <= count + 1 ;
end
endmodule
如果是 ASIC 那么您应该使用重置而不是依赖于初始值。
module counter_s2(
input clk,
input rst_n, //Active Low reset
output reg [7:0] count
);
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
count <= 'b0;
end
else begin
count <= count + 1 ;
end
end
endmodule