NSergeevich 0 20 мая, 2015 Опубликовано 20 мая, 2015 · Жалоба Нужно описать(сгенерировать) большой массив данных в 1500byte и отправить ее на 8-ми битную шину. (дата просто рандомная, вообщем любая) Как описать такой массив на Verilog-е ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 20 мая, 2015 Опубликовано 20 мая, 2015 · Жалоба хранить данные в массиве (в регистрах или в блоках памяти) имеет смысл только если его надо после генерации обрабатывать. иначе - ничего хранить не надо, надо генерировать и отправлять сразу на шину. в плис генерировать удобно например псевдослучайную последовательность (aka PRBS). если массив всё же нужен - то нужно понять, какой доступ к нему необходим. одновременный ко всем ячейкам? или по одному байту за такт на чтение или на запись? и какова допустимая задержка от момента когда ваш алгоритм сообразил что надо из массива взять данные, до момента непосредственно получения этих данных "на руки" в тактах (aka read latency)? в зависимости от этого массив может быть построен либо на регистрах (когда к ним есть доступ всегда), либо на блоках памяти (BRAM, M9K, или ещё какие они там у вашей плис). а в самом общем случае конечно reg [7:0] MEM [0:1499]; но нужно понимать что потом синтезатор из этого кода соберёт. если не выполнятся правила, соответствующие синтезу в примитив блочной памяти, то вы получите после синтеза 12000 регистров, что на мой взгляд пустое расточительство для некоего "абстрактного массива". за объявление массивов в таком виде без серьезной на то причины я бы руки поотрывал =) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NSergeevich 0 21 мая, 2015 Опубликовано 21 мая, 2015 (изменено) · Жалоба иначе - ничего хранить не надо, надо генерировать и отправлять сразу на шину. Мне нужно генерировать и отправлять сразу на шину. Не понятно как в верилоге описать счетчик до 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 Как-то так? Или как?=) Изменено 21 мая, 2015 пользователем NSergeevich Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
egorman44 0 27 мая, 2015 Опубликовано 27 мая, 2015 · Жалоба Мне нужно генерировать и отправлять сразу на шину. Не понятно как в верилоге описать счетчик до 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 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 27 мая, 2015 Опубликовано 27 мая, 2015 · Жалоба симуляцию я не проводил, и точного попадания гарантировать не могу, и в стейт-машине есть опасности, но доводить код до ума мне лень. сделайте хотя бы это сами. 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 27 мая, 2015 Опубликовано 27 мая, 2015 · Жалоба Нужно описать(сгенерировать) большой массив данных в 1500byte и отправить ее на 8-ми битную шину. (дата просто рандомная, вообщем любая) Как описать такой массив на Verilog-е ? Если для синтеза - нужно либо делать генератор данных ПСП, либо забить из в память. А если для симуляции - то данные можно прочитать из файла и написать таски для шины... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться