Как назначить переменные контакты для порта в Verilog? - PullRequest
0 голосов
/ 03 марта 2020

У меня 32-битный входной порт pins и 32-битная входная активация pin_en , и я хочу сгенерировать 16-битный выход, выбранный с помощью enable. Я написал Verilog, как это, но, похоже, есть некоторые ошибки. Как я могу это исправить или каким-либо другим способом добиться? Спасибо!

ps: не более 16 контактов, выбранных en, но, возможно, меньше.

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

1 Ответ

1 голос
/ 03 марта 2020

Я думаю, что в вашем коде есть несколько ошибок:

  1. в сгенерированных блоках вы не можете производить генерацию, основываясь на фактических значениях переменных. Блоки предназначены только для константных выражений, которые могут быть разрешены во время компиляции, а не во время выполнения. Кроме того, вы не можете ничего изменить в сгенерированных блоках, кроме genvars. Параметры (localparams) не могут быть изменены, поэтому cnt = cnt + 1 там просто недопустимо.

  2. вы перепутали фактические булавки и булавки. по логам c должно быть 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
...