Делаю простое ОЗУ - создаю несколько триггреров reg q (запись производится по фронту)
Код
module my_dff (
input clk,
input d,
output...);
reg q;
always @(posedge clk)
q <= d;
assign...
endmodule
Подключаю их в основной модуль, записть в выбранный триггер произвожу демультиплексором
ссылкаКод
module my_module(
input...
output...);
//демультиплексор
reg [3:0]out;
always @ *
begin
case( addr )
2'd0: out = { 3'b000, clk };
2'd1: out = { 2'b00, clk, 1'b0 };
2'd2: out = { 1'b0, clk, 2'b00 };
2'd3: out = { clk, 3'b000 };
endcase
end
//триггеры
my_dff dff1 (
.d(d),
.clk(out[0]) );
my_dff dff2 (... );
my_dff dff3 (... );
my_dff df4 (... );
Но вот странно:
Запись в триггер происходит как по фронту, так и по спаду (при переключении на другой адрес) , т.е. я переключаюсь, например, с 00 на 01, и в триггер с адресом 00 производится запись (как-бы по спаду).
Если я остаюсь на одном адресе, запись нового значения по спаду не производится.
Хотите правильно : берите листок бумаги и рисуете на ней все триггеры, которые Вам нужны, все клоки, все сигналы разрешения, все входы и выходы. И когда на бумаге будет схема - описывайте её на языке HDL.
Более того, если что-то выкладывайте - то выкладывайте полностью кусок кода, в котором ошибка. Сейчас я вижу непонятный огрызок кода, в этом огрызке написана полная ерунда, извините меня за резкость.