-
valek_16rus
-
Автор темы
-
Не в сети
-
Новый участник
-
-
Сообщений: 15
-
Спасибо получено: 0
-
-
-
-
|
Здравствуйте.
Помогите, пожалуйста, организовать на языке 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.
Каким образом организовать правильную запись?
Нужно ли использовать какой-либо цикл?
Буду признателен за представление этого кусочка кода.
Прикрепляю подробное описание задания.
Надеюсь, будет видно текст.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
alman
-
-
Не в сети
-
Завсегдатай
-
-
Сообщений: 263
-
Спасибо получено: 41
-
-
-
-
-
|
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. Я не гарантирую что мой код правильный - в симуляторе его не прогонял.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от alman.
|
-
valek_16rus
-
Автор темы
-
Не в сети
-
Новый участник
-
-
Сообщений: 15
-
Спасибо получено: 0
-
-
-
-
|
Простите за мою некорректность в вопросе.
На самом деле все было гораздо проще.
Меня интересовало именно создание большого числа регистров для записи.
А создавались они элементарно: reg [битность] имя [количество штук].
В этом и была вся моя загвоздка. Но все равно спасибо за ответ!
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
Время создания страницы: 0.108 секунд