// コンパイラ指定子
`timescale 1ns / 1ns
module Stack #(
// パラメータの宣言
parameter WIDTH = 2,
parameter DEPTH = 2,
parameter INIT = 2'b0,
parameter RESET_COMMAND = 2'b0,
parameter PUSH_COMMAND = 2'b10,
parameter POP_COMMAND = 2'b11
) (
// ポートの宣言
output wire [WIDTH - 1: 0] out,
input [WIDTH - 1: 0] in,
input [1: 0] command,
input clock
);
// 定数の宣言
parameter STACK_WIDTH = WIDTH * DEPTH;
// 信号、変数の宣言
integer i;
reg [STACK_WIDTH - 1: 0] stack;
// 処理の記述
assign out = stack[0 +: WIDTH];
always @(posedge clock) begin
case(command)
RESET_COMMAND:
for(i = 0; i < DEPTH; i = i + 1) begin
stack[i * WIDTH +: WIDTH] <= INIT;
end
PUSH_COMMAND:
stack <= {stack[0 +: STACK_WIDTH - WIDTH], in};
POP_COMMAND:
stack <= {INIT, stack[STACK_WIDTH - 1: WIDTH]};
default:
stack <= stack;
endcase
end
endmodule
|