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

Генерация данных

Нужно описать(сгенерировать) большой массив данных в 1500byte и отправить ее на 8-ми битную шину. (дата просто рандомная, вообщем любая)

Как описать такой массив на Verilog-е ?

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


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

хранить данные в массиве (в регистрах или в блоках памяти) имеет смысл только если его надо после генерации обрабатывать.

иначе - ничего хранить не надо, надо генерировать и отправлять сразу на шину.

в плис генерировать удобно например псевдослучайную последовательность (aka PRBS).

 

если массив всё же нужен - то нужно понять, какой доступ к нему необходим.

одновременный ко всем ячейкам?

или по одному байту за такт на чтение или на запись?

и какова допустимая задержка от момента когда ваш алгоритм сообразил что надо из массива взять данные, до момента непосредственно получения этих данных "на руки" в тактах (aka read latency)?

в зависимости от этого массив может быть построен либо на регистрах (когда к ним есть доступ всегда), либо на блоках памяти (BRAM, M9K, или ещё какие они там у вашей плис).

 

а в самом общем случае конечно

reg [7:0] MEM [0:1499];

но нужно понимать что потом синтезатор из этого кода соберёт.

если не выполнятся правила, соответствующие синтезу в примитив блочной памяти, то вы получите после синтеза 12000 регистров, что на мой взгляд пустое расточительство для некоего "абстрактного массива".

за объявление массивов в таком виде без серьезной на то причины я бы руки поотрывал =)

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


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

иначе - ничего хранить не надо, надо генерировать и отправлять сразу на шину.

 

Мне нужно генерировать и отправлять сразу на шину.

Не понятно как в верилоге описать счетчик до 1500byte

reg counter;
parameter [7:0] data [0:1499] = {1500'h гигантское число};

always @(posedge clk or posedge rst)

if (rst)
begin
  out <= 0;
  counter <= 0;
end
else 
       begin
            out <= counter > 1500 ? 0 : data[counter];
        counter <= counter + 1'b1;
    end
end

Как-то так? Или как?=)

Изменено пользователем NSergeevich

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


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

Мне нужно генерировать и отправлять сразу на шину.

Не понятно как в верилоге описать счетчик до 1500byte

reg counter;
parameter [7:0] data [0:1499] = {1500'h гигантское число};

always @(posedge clk or posedge rst)

if (rst)
begin
  out <= 0;
  counter <= 0;
end
else 
       begin
            out <= counter > 1500 ? 0 : data[counter];
        counter <= counter + 1'b1;
    end
end

Как-то так? Или как?=)

 

Как я понял у вас есть 1500 байт данных, которыми вы инициализируете массив и вам надо их выдать наружу, коль хотите использовать parameter ? Не проще ли будет использовать RAM блоки на 1500 байт, и формируя адрес читать содержимое, выдавая по 8 бит. Предварительно проинициализируйте RAM блок командой $readmemb.

Да и как у Вас счетчик то работает ? Может он по какой-то внешней команде начинает считать и останавливается , или же постоянно молотит переполняясь на значении 1500 ?

 

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


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

симуляцию я не проводил, и точного попадания гарантировать не могу, и в стейт-машине есть опасности, но доводить код до ума мне лень. сделайте хотя бы это сами.

module pkt_gen (
                clk,sreset_b,
                length,enable,
                Dout, Dout_SOP, Dout_EOP, Dout_valid, Dout_rdy
                );
input clk;
input sreset_b;
input [10:0] length;
input enable;
output [7:0] Dout;
output Dout_SOP; // aka start of packet
output Dout_EOP; // aka end of packet
output Dout_valid; // data valid strobe
input Dout_rdy; // next module ready

// transaction is complete when  (Dout_valid & Dout_rdy)

reg [7:0] Dout;
reg Dout_SOP;
reg Dout_EOP;
reg Dout_valid;

reg [1:0] FSM;
localparam FSM_IDLE=0;
localparam FSM_SOP=1;
localparam FSM_BODY=2;
localparam FSM_EOP=3;

/* PRBS 2^7-1*/
always @(posedge clk) begin
if (!sreset_b) begin
    Dout[7:0] <= 8'hFE;
end
else if (Dout_valid & Dout_rdy)
begin
    Dout[7] <= Dout[6] ^ Dout[5];
    Dout[6] <= Dout[5] ^ Dout[4];
    Dout[5] <= Dout[4] ^ Dout[3];
    Dout[4] <= Dout[3] ^ Dout[2];
    Dout[3] <= Dout[2] ^ Dout[1];
    Dout[2] <= Dout[7] ^ Dout[6] ^ Dout[1];
    Dout[1] <= Dout[7] ^ Dout[5];
    Dout[0] <= Dout[6] ^ Dout[4];
end
end

reg [10:0] remaining_length;

always @(posedge clk) begin
if (!sreset_b) begin
    FSM <= FSM_IDLE;
    Dout_SOP <= 1'b0;
    Dout_EOP <= 1'b0;
    Dout_valid <= 1'b0;
end
else begin
    case (FSM)
        FSM_IDLE: begin
            Dout_SOP <= 1'b0;
            Dout_EOP <= 1'b0;
            Dout_valid <= 1'b0;
            if (enable) begin
                remaining_length <= length;
                FSM <= PSM_SOP;
            end
        end
        FSM_SOP: begin
            Dout_SOP <= 1'b1;
            Dout_EOP <= 1'b0;
            Dout_valid <= 1'b1;
            if (Dout_valid & Dout_rdy) remaining_length <= remaining_length - 1'b1;
            if (Dout_SOP & Dout_valid & Dout_rdy) begin
                Dout_SOP <= 1'b0;
                FSM <= FSM_BODY;
            end
        end
        FSM_BODY: begin
            Dout_SOP <= 1'b0;
            Dout_EOP <= 1'b0;
            Dout_valid <= 1'b1;
            if (Dout_valid & Dout_rdy) remaining_length <= remaining_length - 1'b1;
            if (Dout_valid & Dout_rdy & (remaining_length == 1)) begin
                Dout_EOP <= 1'b1;
                FSM <= FSM_EOP;
            end
        end
        FSM_EOP: begin
            Dout_SOP <= 1'b0;
            Dout_EOP <= 1'b1;
            Dout_valid <= 1'b1;
            if (Dout_valid & Dout_rdy) remaining_length <= remaining_length - 1'b1;
            if (Dout_EOP & Dout_valid & Dout_rdy) begin
                Dout_EOP <= 1'b0;
                Dout_valid <= 1'b0;
                FSM <= FSM_IDLE;
            end
        end
    endcase
end
end
endmodule

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


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

Нужно описать(сгенерировать) большой массив данных в 1500byte и отправить ее на 8-ми битную шину. (дата просто рандомная, вообщем любая)

Как описать такой массив на Verilog-е ?

Если для синтеза - нужно либо делать генератор данных ПСП, либо забить из в память.

А если для симуляции - то данные можно прочитать из файла и написать таски для шины...

 

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


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

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

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

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

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

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

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

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

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

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