Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
  • Страница:
  • 1

ТЕМА: Организация записи отсчетов данных в регистры

Организация записи отсчетов данных в регистры 8 года 11 мес. назад #4875

Здравствуйте.
Помогите, пожалуйста, организовать на языке Verilog HDL следующую логику работы:

1) на вход устройства поступают 8-ми битные отсчеты (DATA_IN) в большом количестве (напр. 128 шт);
2) по тактовому сигналу и сигналу разрешения записи (LOAD_1) нужно записывать каждый отсчет из DATA_IN в свои отдельные регистры (напр. A1, A2 .. A128) ;
3) по тактовому сигналу и сигналу разрешения записи (LOAD_2) нужно записывать каждый отсчет из DATA_IN в свои отдельные регистры (напр. B1, B2 .. B128);
4) произвести перемножение данных в регистрах по логике: первый с последним, второй с предпоследним и т.т. Т.е. нужно инвертировать вторую последовательность
и последовательно перемножить, образовав тем самым новые 8-ми битные регистры (напр. C1, C2 .. C128) и выдать на выход эти регистры.

Прошу помочь мне с пунктами 2. и 3.
Каким образом организовать правильную запись?
Нужно ли использовать какой-либо цикл?
Буду признателен за представление этого кусочка кода.

Прикрепляю подробное описание задания.
Надеюсь, будет видно текст.
Вложения:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Организация записи отсчетов данных в регистры 8 года 11 мес. назад #4876

valek_16rus пишет: Здравствуйте.
Каким образом организовать правильную запись?
Нужно ли использовать какой-либо цикл?
Буду признателен за представление этого кусочка кода.


Я бы объявил модуль, который накапливает данные. В первом приближении получилось что-то эдакое:
module stream_buffer(
  input 	clk,
  input 	reset,
// Захват потока
  input [7:0]  	data_in,
  input    	load,
  output   	buffer_full,
  output   	error,
// Работа с потоком
  input 	rd_req,  // Запрос чтения
  input  [6:0] 	address,
  output [7:0] 	data,
  output 	read_complete  // Данные готовы
);

   reg [7:0] ram_block[127:0];
   reg [7:0] wr_idx;  // Старший бит используется как признак готовности данных
   reg overflow;

   wire data_ready = wr_idx[7];

assign buffer_full = data_ready;
assign error = overflow;

assign read_complete = rd_req & ~overflow & data_ready;
assign data = read_complete ? ram_block[address] : 8'hz;

always @ (posedge clk) begin
  if (reset) begin
     wr_idx <= 8'h0;
     overflow <= 1'b0;
  end else begin
     if(load) begin
        if (~buffer_full) begin
           ram_block[wr_idx[6:0]] <= data_in;
          wr_idx <= wr_idx + 8'h1;
        end else begin
           overflow <= 1'b1;
        end
     end 
  end
end

endmodule

Затем этот модуль использовал бы два раза (для двух потоков) в конечном модуле, который производит сложение по заданному алгоритму.
Там тривиально - адрес ячейки потока "B" равен 127 - адрес ячейки потока "A":

assign addr_B = 7'h7f - addr_A;

p.s. Я не гарантирую что мой код правильный - в симуляторе его не прогонял.
Спасибо сказали: valek_16rus

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от alman.

Организация записи отсчетов данных в регистры 8 года 11 мес. назад #4987

Простите за мою некорректность в вопросе.
На самом деле все было гораздо проще.
Меня интересовало именно создание большого числа регистров для записи.
А создавались они элементарно: reg [битность] имя [количество штук].
В этом и была вся моя загвоздка. Но все равно спасибо за ответ!

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
Время создания страницы: 0.108 секунд
Работает на Kunena форум