要求123456789,10、11,12,输入后,输出为12,123456789、10,11
也就是最后输入的数据放到最前面输出,其他顺序不变
module stack(datain, push, pop, reset, clk, stackfull, dataout);
input [7:0] datain;//堆栈输入数据
input push;//堆栈信号
input pop;//弹栈信号
input reset;//复位
input clk;//时钟
output stackfull;//堆栈满指示信号
output [7:0] dataout;//堆栈读出数据
reg [7:0] dataout;
integer i;
reg [7:0] data[11:0];//深度12.数据位宽为8
reg [11:0] stackflag;
assign stackfull = stackflag[0];//堆栈满指示信号
wire [1:0] selfunction;
assign selfunction = {push, pop};//将堆栈信号弹栈信号组成2bit信号
always @(posedge clk or posedge reset)
begin
if (reset == 1'b1)//复位
begin
stackflag <= {12{1'b0}};
dataout <= {8{1'b0}};
for (i = 0; i <= 11; i = i + 1)
data[i] <= 8'b00000000;////复位清零
end
else
case (selfunction)
2'b10 ://入栈信号
if (stackflag[0] == 1'b0)
begin
data[11] <= datain;//堆栈输入数据
stackflag <= {1'b1, stackflag[11:1]};//右移,高位移入1
for (i = 0; i <= 10; i = i + 1)
data[i] <= data[i + 1];//数据移位
end
2'b01 ://出栈信号
begin
dataout <= data[11];//读出最外部数据
stackflag <= {stackflag[10:0], 1'b0};//左移,低位移入0
for (i = 11; i >= 1; i = i - 1)
data[i] <= data[i - 1];////数据移位
end
default :
;
endcase
end
endmodule