【问题标题】:How to assign variable pins to a port in verilog?如何将可变引脚分配给verilog中的端口?
【发布时间】:2020-03-03 05:23:19
【问题描述】:

我有一个 32 位输入端口 pins 和一个 32 位输入使能 pin_en,并希望生成一个由使能选择的 16 位输出。我这样写了verilog,但似乎有一些错误。 我该如何解决它或任何其他方式来实现?谢谢!

ps:en 选择的引脚不超过 16 个,但可能更少。

input [31:0] pins;
input [31:0] pin_en;
output [15:0] actual_pins;

generate
genvar i;
localparam cnt = 0;
    for(i = 0; (i < 'd32) & (cnt < 'd16); i = i + 'd1) begin : b1
        if(pin_en[i]) begin
            assign actual_pins[i] = pins[cnt];
            cnt = cnt + 'd1;
        end
    end
    if(cnt < 16)
        assign actual_pins[16 : cnt] = 'b0;
endgenerate

【问题讨论】:

  • 我们不能用像 “有一些错误”这样的描述来做任何事情。顺便说一句,您编写 HDL 就像它是一种普通的编程语言一样。它不是!我建议你看看现有的 Verilog 代码。
  • 谢谢@Oldfart,我是verilog的新手,我正在学习。我问了这个问题后用谷歌搜索,我知道 cnt 不能以这种方式使用。我在我的项目中找到了绕过这种情况的方法。但我仍然不知道如何从 32 位动态选择 16 位(或更少)。
  • 您的问题不清楚。您希望如何仅使用 enable 将信号数量从 32 个减少到 16 个?通常,您只会写actual_pins = pins &amp; pin_en,但归约部分令人困惑。正如@Oldfart 所提到的,您编写的代码就像是 Python (?) 代码一样。但这行不通。

标签: verilog assign generate


【解决方案1】:

我认为你的代码有几个错误:

  1. 在生成块中,您不能根据变量的实际值进行任何生成。这些块仅用于可以在编译时而不是在运行时解析的常量表达式。此外,除了 genvars 之外,您不能修改生成的块中的任何内容。参数(localparams)不能修改,所以 cnt = cnt + 1 在那里是非法的。

  2. 你搞砸了actual_pins 和pins。按逻辑应该有 actual_pins[cnt];

  3. 您使用二进制 & 运算符,但您应该使用逻辑 && 代替。

因此,您的所有代码都应该在运行时结构中实现,即总是阻塞。您还需要一个触发器,该触发器将导致对始终块进行评估。我创建了一个小例子,always 块将由时钟触发。

module top (
  input clk,
  input [31:0] pins,
  input [31:0] pin_en,
  output reg [15:0] actual_pins
);

  always @(posedge clk) begin
    int cnt = 0;
    int i;
    for(i = 0; (i < 'd32) && (cnt < 'd16); i = i + 'd1) begin 
        if(pin_en[i]) begin
          actual_pins[cnt] = pins[i];
          cnt = cnt + 'd1;
        end
    end
    for(; cnt < 16; cnt = cnt + 1) 
         actual_pins[j] = 1'b0;
  end
endmodule

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多