Sunteți pe pagina 1din 3

module RPN_FPGA(

input internal_clk,
input clk,
input [7:0] number,
input [3:0] btn,
output [7:0] out,
output reg [3:0] Q = 4'b0001,
output reg [6:0] seg, seg1, seg2, seg3);
wire
reg
reg
wire

[3:0]
[7:0]
[7:0]
[1:0]

out1, out2, out3;


stack[3:0];
y;
operation;

assign operation = number;


assign out = stack[0];
always @(posedge clk)
case (btn) /*PUSH_BUTTON/
/*OPERATOR*/

4'b0001: case (operation)


0: begin stack[0]
stack[1]
stack[2]
stack[3]
1: begin stack[0]
stack[1]
stack[2]
stack[3]
2: begin stack[0]
stack[1]
stack[2]
stack[3]
endcase

=
=
=
=
=
=
=
=
=
=
=
=

stack[1]*stack[0];
stack[2];
stack[3];
0; end
stack[1]+stack[0];
stack[2];
stack[3];
0; end
stack[1]-stack[0];
stack[2];
stack[3];
0; end

/*OPERAND*/ 4'b0010: begin

stack[3]
stack[2]
stack[1]
stack[0]

<=
<=
<=
<=

stack[2];
stack[1];
stack[0];
number; end

/*POP*/ 4'b0100: begin

stack[0]
stack[1]
stack[2]
stack[3]

<=
<=
<=
<=

stack[1];
stack[2];
stack[3];
0; end

/*CLEAR*/ 4'b1000: begin

stack[0]
stack[1]
stack[2]
stack[3]

<=
<=
<=
<=

0;
0;
0;
0; end

endcase
always @(out) if ( out[7] == 0 ) y = out; else y = -out;
assign out1 = y % (4'd10);
assign out2 = (y/10) % (4'd10);
assign out3 = y/100;

/*7SEGMENTS*/
_7segDisplay digit1( out1 , seg1 );
_7segDisplay digit2( out2 , seg2 );
_7segDisplay digit3( out3 , seg3 );
always @(posedge internal_clk) begin
Q = { Q[2:0] , Q[3] } ;
case (Q)
4'b0001: seg = seg1;
4'b0010: seg = seg2;
4'b0100: seg = seg3;
4'b1000: if (out[7]) seg=7'b0000001; else seg=7'b0000000
;
endcase
end
endmodule
module _7segDisplay(
input [3:0] number,
output reg [6:0] seg); /* seg = {a,b,c,d,e,f,g} */
always @(number)
case (number)
4'd0 :
4'd1 :
4'd2 :
4'd3 :
4'd4 :
4'd5 :
4'd6 :
4'd7 :
4'd8 :
4'd9 :
default
endcase
endmodule

seg
seg
seg
seg
seg
seg
seg
seg
seg
seg
seg

=
=
=
=
=
=
=
=
=
=
=

7'b1111110;
7'b0110000;
7'b1101101;
7'b1111001;
7'b0110011;
7'b1011011;
7'b1011111;
7'b1110000;
7'b1111111;
7'b1111011;
7'b0000000;

/*
NET "internal_clk" LOC = "P55";
NET "clk" LOC = "P94";
NET
NET
NET
NET
NET
NET
NET
NET

"number[0]"
"number[1]"
"number[2]"
"number[3]"
"number[4]"
"number[5]"
"number[6]"
"number[7]"

NET
NET
NET
NET

"btn[0]"
"btn[1]"
"btn[2]"
"btn[3]"

LOC
LOC
LOC
LOC

LOC
LOC
LOC
LOC
LOC
LOC
LOC
LOC
=
=
=
=

=
=
=
=
=
=
=
=

"P97";
"P98";
"P99";
"P100";
"P101";
"P102";
"P104";
"P105";

"P87";
"P88";
"P92";
"P93";

NET "seg[0]" LOC = "P118";


NET "seg[1]" LOC = "P116";
NET "seg[2]" LOC = "P117";

NET
NET
NET
NET

"seg[3]"
"seg[4]"
"seg[5]"
"seg[6]"

NET
NET
NET
NET
*/

"Q[0]"
"Q[1]"
"Q[2]"
"Q[3]"

LOC
LOC
LOC
LOC

LOC
LOC
LOC
LOC

=
=
=
=

=
=
=
=

"P121";
"P112";
"P114";
"P111";

"P120";
"P119";
"P115";
"P124";

S-ar putea să vă placă și