【问题标题】:Verilog and condition for Always block始终阻塞的 Verilog 和条件
【发布时间】: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 块。

我尝试同时使用&amp;&amp;and 作为逻辑运算符。 为什么这不起作用?

【问题讨论】:

  • 所写的内容根本行不通,或者说那是个意外。你的整个编码风格都是错误的。你有从上到下的比赛条件。我建议你看看一些真正的工作 Verilog 代码,看看他们做了什么。从一个也有复位的时钟部分开始,第二个组合部分使用always @( * )
  • 它不是一个独立的计数器。开始信号进来并告诉计数器开始,一旦完成,它必须以某种方式向主模块发出信号
  • 您的模块中已经有时钟和重置。请查找正确使用时钟和重置的示例,并尝试完全重新编写代码以使用正确的样式。你拥有它的方式是行不通的。从简单的独立触发器建模开始。

标签: verilog active-hdl


【解决方案1】:

你的第一个大问题是@(expression) 的意思是“等到表达式有值改变”。这种变化可能来自 1➩0 或 0➩1。通常只使用always @(posedge clk) 用于同步逻辑,或always @(*) 用于组合逻辑。 (always_comb 在 SystemVerilog 中)

你的另一个问题是你应该只对一个特定的变量进行赋值,并且只有一个总是阻塞。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 2020-05-18
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 2021-12-29
    相关资源
    最近更新 更多