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

Работа с матрицами в Verilog

Здравствуйте. Передо мной стоит учебная задача написать программу транспонирования матрицы на Verilog. Я Verilog начал изучать совсем недавно и с вопросом о работе с массивами и матрицами еще не разобрался. Я написал код, но Quartus выдает ошибку, что массив matrix у меня объявлен неверно. Помогите пожалуйста разобраться в данной теме.

 

Привожу пример части кода:

integer i=0;
integer j=0;
reg [2:0] matrix [2:0]= {3'b110,3'b001,3'b101};
reg [2:0] matrixt[2:0];
always @ (posedge C)
    begin
      for(i=0; i<2; i=i+1)
        begin
          for(j=i; j<2; j=j+1)
            begin
              matrixt[j][i]<=matrix[i][j];
            end
        end
     end

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


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

Здравствуйте. Передо мной стоит учебная задача написать программу транспонирования матрицы на Verilog. Я Verilog начал изучать совсем недавно и с вопросом о работе с массивами и матрицами еще не разобрался. Я написал код, но Quartus выдает ошибку, что массив matrix у меня объявлен неверно. Помогите пожалуйста разобраться в данной теме.

 

Привожу пример части кода:

 

integer i=0;

integer j=0;

reg [2:0] matrix [2:0]= {3'b110,3'b001,3'b101};

reg [2:0] matrixt[2:0];

always @ (posedge C)

begin

for(i=0; i<2; i=i+1)

begin

for(j=i; j<2; j=j+1)

begin

matrixt[j]<=matrix[j];

end

end

end

 

В Verilog нельзя присвоить значение матрицы reg [2:0] matrix [2:0]= {3'b110,3'b001,3'b101};

Необходимо присвоение делать через for или просто каждому значению в цикле. Например:

always @(posedge C)

begin

matrix [2:0][0] = 3'b110;

matrix [2:0][1] = 3'b001;

matrix [2:0][2] = 3'b101;

 

end

 

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


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

В Verilog нельзя присвоить значение матрицы reg [2:0] matrix [2:0]= {3'b110,3'b001,3'b101};

Необходимо присвоение делать через for или просто каждому значению в цикле. Например:

always @(posedge C)

begin

matrix [2:0][0] = 3'b110;

matrix [2:0][1] = 3'b001;

matrix [2:0][2] = 3'b101;

 

end

 

Спасибо за совет. Используя ваши рекомендации, я написал программу для проверки правильности алгоритма транспонирования. В ней я ввожу исходную матрицу и транспонированную, затем ПЛИС выполняет операцию транспонирования и результат сравнивает с введенной мной транспонированной матрицей-если они равны (т.е. алгоритм верен), то загорается светодиод на отладочной плате. Quartus ее откомпилировал, но она не работает. Может у меня есть какие то ошибки или неточности в коде? Помогите пожалуйста разобраться.

 

Привожу код программы:

 

module matrix2 (C,a);
input C;
output a;
integer i=0;
integer j=0;
integer k=0;
wire #200 D=C;
reg a=1'b0;
reg [2:0] matrix [2:0];
reg [2:0] matrixt[2:0];
reg [2:0] result [2:0];
initial
  begin
     matrix [0][2:0] = 3'b110;
     matrix [1][2:0] = 3'b001;
     matrix [2][2:0] = 3'b101;
     result [0][2:0] = 3'b101;
     result [1][2:0] = 3'b100;
     result [2][2:0] = 3'b011;
  end
always @ (posedge C)
    begin
      for(i=0; i<2; i=i+1)
        begin
          for(j=i; j<2; j=j+1)
            begin
              matrixt[j][i]<=matrix[i][j];
            end
        end
    end    
always @ (posedge D) 
     begin   
        for(i=0; i<2; i=i+1)
        begin
          for(j=0; j<2; j=j+1)
            begin
              if (matrixt[i][j]==result[i][j])begin
                  k=k+1;
                end  
            end
        end
        if (k==9)
          begin
            a=1'b1;
          end
     end 
endmodule

Чтобы второй блок always выполнялся последовательно за первым блоком, я поставил его чувствительным к сигналу D, задержанным на 200 нс по отношению к тактовому сигналу. Правильно я сделал? Есть ли какие то другие способы добиться того, чтобы блоки выполнялись последовательно?

Изменено пользователем des00
используйте теги code для оформления кода (с) модератор

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


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

wire #200 D=C;

 

Чтобы второй блок always выполнялся последовательно за первым блоком, я поставил его чувствительным к сигналу D, задержанным на 200 нс по отношению к тактовому сигналу. Правильно я сделал? Есть ли какие то другие способы добиться того, чтобы блоки выполнялись последовательно?

Несинтезируемая конструкция, годится только для симулятора...

 

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


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

Несинтезируемая конструкция, годится только для симулятора...

 

Подскажите пожалуйста, каким образом лучше эту задержку выполнить?

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


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

Подскажите пожалуйста, каким образом лучше эту задержку выполнить?

1. Сделать синхронный проект, с клоками как и полагается

2. Могу предложить персональные занятия по ПЛИС

 

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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