【发布时间】:2019-11-09 22:05:57
【问题描述】:
我正在处理一个项目,在找到一个错误后,我将其范围缩小到它是由未正确触发的 Always 块引起的。
module Counter(start,clk_len,done,clk,reset);
input [4:0] clk_len;
input clk,start,reset;
output done;
reg [4:0] cntr_var = 0; reg start_val = 0;
assign done = !start_val;
reg test = 0;
always @(reset){cntr_var,start_val} = 2'b0;
always @(posedge start) begin
start_val = start;
end
always @((done and cntr_var == clk_len)) begin // <=== This is the source of the problem
cntr_var = 0;
start_val = 0;
test = 1;
end
always @(clk and !reset) begin
if (start_val == 1 && cntr_var != clk_len)
cntr_var = cntr_var + 1;
end
endmodule
当done AND (cntr_var == clk_len) 时,应该触发一个 always 块。
我尝试同时使用&& 和and 作为逻辑运算符。
为什么这不起作用?
【问题讨论】:
-
所写的内容根本行不通,或者说那是个意外。你的整个编码风格都是错误的。你有从上到下的比赛条件。我建议你看看一些真正的工作 Verilog 代码,看看他们做了什么。从一个也有复位的时钟部分开始,第二个组合部分使用
always @( * )。 -
它不是一个独立的计数器。开始信号进来并告诉计数器开始,一旦完成,它必须以某种方式向主模块发出信号
-
您的模块中已经有时钟和重置。请查找正确使用时钟和重置的示例,并尝试完全重新编写代码以使用正确的样式。你拥有它的方式是行不通的。从简单的独立触发器建模开始。
标签: verilog active-hdl