Перейти к содержанию
    

Как лучше на verilog записать следующий мультиплексор

Имеется 5 входных и 5 выходных шин данных;

 

Имеется счетчик (cnt) от 0 до 4

 

В зависимости от величины счетчика нужно коммутировать входные шины на выходные:

cnt1<= ((cnt + 3'h1) < 3'h5) ? (cnt + 3'h1) :  (cnt + 3'h1 - 3'h5);
cnt2<= ((cnt + 3'h2) < 3'h5) ? (cnt + 3'h2) :  (cnt + 3'h2 - 3'h5);
cnt3<= ((cnt + 3'h3) < 3'h5) ? (cnt + 3'h3) :  (cnt + 3'h3 - 3'h5);
cnt4<= ((cnt + 3'h4) < 3'h5) ? (cnt + 3'h4) :  (cnt + 3'h4 - 3'h5);

out_bus[  cnt][32:0]<= in_bus_0[32:0];
out_bus[cnt1][32:0]<= in_bus_1[32:0];
out_bus[cnt2][32:0]<= in_bus_2[32:0];
out_bus[cnt3][32:0]<= in_bus_3[32:0];
out_bus[cnt4][32:0]<= in_bus_4[32:0];

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ИМХО, я б написал так

case(cnt)
0: {out_bus[0], out_bus[1], out_bus[2], out_bus[3], out_bus[4]} <= {in_bus_0, in_bus_1, in_bus_2, in_bus_3, in_bus_4};
1: {out_bus[1], out_bus[2], out_bus[3], out_bus[4], out_bus[0]} <= {in_bus_0, in_bus_1, in_bus_2, in_bus_3, in_bus_4};
2: {out_bus[2], out_bus[3], out_bus[4], out_bus[0], out_bus[1]} <= {in_bus_0, in_bus_1, in_bus_2, in_bus_3, in_bus_4};
3: {out_bus[3], out_bus[4], out_bus[0], out_bus[1], out_bus[2]} <= {in_bus_0, in_bus_1, in_bus_2, in_bus_3, in_bus_4};
default: {out_bus[4], out_bus[0], out_bus[1], out_bus[2], out_bus[3]} <= {in_bus_0, in_bus_1, in_bus_2, in_bus_3, in_bus_4};
endcase

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ИМХО, я б написал так

не красиво ИМХО %)

  wire [0 : 4][31 : 0] bus = {in_bus_0, in_bus_1, in_bus_2, in_bus_3, in_bus_4};

  always_comb begin
    case (cnt)
      0       : for (int i = 0; i < 5; i++) out_bus[(i + 0) % 5] = bus[i];
      1       : for (int i = 0; i < 5; i++) out_bus[(i + 1) % 5] = bus[i];
      2       : for (int i = 0; i < 5; i++) out_bus[(i + 2) % 5] = bus[i];
      3       : for (int i = 0; i < 5; i++) out_bus[(i + 3) % 5] = bus[i];
      default : for (int i = 0; i < 5; i++) out_bus[(i + 4) % 5] = bus[i];
    endcase
  end

 

если откинуть SV фенечки то

  integer i;
  wire [0 : 4*32-1] bus = {in_bus_0, in_bus_1, in_bus_2, in_bus_3, in_bus_4};

  always @(*) begin
    case (cnt)
      0       : for (i = 0; i < 5; i=i+1) out_bus[(i + 0) % 5] = bus[i*32 +: 32];
      1       : for (i = 0; i < 5; i=i+1) out_bus[(i + 1) % 5] = bus[i*32 +: 32];
      2       : for (i = 0; i < 5; i=i+1) out_bus[(i + 2) % 5] = bus[i*32 +: 32];
      3       : for (i = 0; i < 5; i=i+1) out_bus[(i + 3) % 5] = bus[i*32 +: 32];
      default : for (i = 0; i < 5; i=i+1) out_bus[(i + 4) % 5] = bus[i*32 +: 32];
    endcase
  end

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...