Индексный регистр с различной шириной - PullRequest
0 голосов
/ 24 июня 2018

Есть ли способ индексировать многобитный регистр с таким же смещением, но переменной шириной?Я хочу сделать это:

module foo (input [1:0] data_bits);
always @ (posedge clk) begin
case (data_bits)
    2'b11:
        assign wire_data_out = {3(1'b0), data_received[7:3]};
    2'b10:
        assign wire_data_out = {2(1'b0), data_received[7:2]};
    2'b01:
        assign wire_data_out = {(1'b0), data_received[7:1]};
    2'b00:
        assign wire_data_out = data_received;
endcase
end

В поисках ответа я нашел Оператор выбора индексированной детали "+: или -:", но для него требуется фиксированная ширина, которая не соответствует моим потребностям.Есть ли более простой способ написания кода выше?

1 Ответ

0 голосов
/ 25 июня 2018
always @ (posedge clk)
   wire_data_out <= data_received>>data_bits;

Кстати:

  1. вы не можете использовать присваивания внутри всегда блока.
  2. В синхронизированном разделе вы должны использовать неблокирующие назначения.

Это одна строка, как вы и просили. Но я бы не стал писать свой код таким образом. Это требует, чтобы читатель знал, что Verilog добавит нулевые биты к верху и потеряет нижние биты. Я бы использовал код, как вы написали (но тогда без синтаксических ошибок: -):

always @ (posedge clk) begin
   case (data_bits)
   2'b00: wire_data_out <=       data_received;
   2'b01: wire_data_out <= {1'b0,data_received[7:1]};
   2'b10: wire_data_out <= {2'b0,data_received[7:2]};
   2'b11: wire_data_out <= {3'b0,data_received[7:3]};
   endcase

Конечный результат будет точно такой же логики, но читаемость лучше.

...