LINUX.ORG.RU
решено ФорумTalks

Операция сложения двух регистров на Verilog

 ,


0

1

Помогите разобраться.

Задача - за один такт прочитать два регистра из регистрового файла, сложить их и записать результат обратно в регистровый файл. Перепробовал всё - блокирующее и неблокирующее копирование в разных комбинациях, затем погонял все варианты на Icarus Verilog, потом любовался результатом в GTKWave - ну не получается же. Уже возникли сомнения, что такое вообще можно сделать за один такт.

На специализированные форумы прошу не отсылать - спрошу там, как время придёт.

Регистры читаются вот отсюда:

module reg_ram (
	input	[4:0]  address_a,
	input	[4:0]  address_b,
	input		  clock,
	input	[31:0]  data_a,
	input	[31:0]  data_b,
	input		  wren_a,
	input		  wren_b,
	output reg 	[31:0]  q_a,
	output reg 	[31:0]  q_b);

   reg [31:0] ram[31:0];

   always @(posedge clock) begin
	if(wren_a) begin
           ram[address_a] <= data_a;
	   q_a <= data_a;
	end else 
   	  q_a <= ram[address_a];
   end

   always @(posedge clock) begin
	if(wren_b) begin
           ram[address_b] <= data_b;
 	  q_b <= data_b;
	end else
   	  q_b <= ram[address_b];
   end

endmodule

Реализацию модуля взял вот отсюда: http://www.altera.com/support/examples/verilog/ver-true-dual-port-ram-sclk.html

Может быть его можно как-то переписать, чтобы поместиться в один такт?

★★★

Последнее исправление: alman (всего исправлений: 1)

за один такт — слишком лихо. Почитай про дельта-задержки симулятора ну и, соответственно, про setup и hold time для реальных сигналов.

Суть такова — для использования в комбинаторной логике входные сигналы должны быть стабильными некоторое время. И наоборот, регистр тоже не сразу по фронту клока выдает стабильный результат.

Для этого, собственно, и нужны всякие там waitstate'ы

demidrol ★★★★★
()
Ответ на: комментарий от demidrol

Спасибо. Ещё вопрос. Если нельзя сделать операцию за «чистый» такт, то как сделать «видимость» одного такта? Т.е. как какой либо простенький конвейер организовать. Что-нибудь примитивно-учебное.

alman ★★★
() автор топика
Ответ на: комментарий от alman

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

registrant ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.