使用Quartus-II 9.1SP2 + ModelSim 6.5b-Aletra + Altera DE2-115 FPGA開發平台,設計 8-bit ALU part2 為例(FPGA開發平台)
![]() |
3'b000: y = a + b; // op=000, 執行 a + b
3'b001: y = a + 1; // op=001, 執行 a + 1
3'b010: y = a - b; // op=010, 執行 a - b
3'b011: y = a ^ b; // op=011, 執行 a xor b
3'b100: y = a | b; // op=100, 執行 a or b
3'b101: y = a & b; // op=101, 執行 a and b
3'b110: y = ~a; // op=110, 執行 not a
3'b111: y = a<<1; // op=111, 執行 a << 1’b1
3'b001: y = a + 1; // op=001, 執行 a + 1
3'b010: y = a - b; // op=010, 執行 a - b
3'b011: y = a ^ b; // op=011, 執行 a xor b
3'b100: y = a | b; // op=100, 執行 a or b
3'b101: y = a & b; // op=101, 執行 a and b
3'b110: y = ~a; // op=110, 執行 not a
3'b111: y = a<<1; // op=111, 執行 a << 1’b1
module DE2_115 (SW, LEDR, LEDG , CLOCK_50 ,KEY ,HEX0 ,HEX1 ,HEX2,HEX3,HEX4 ,HEX5 ,HEX6,HEX7, GPIO );
input [17:0] SW; // toggle switches
input [7:0] KEY; // Push bottom
input CLOCK_50; //Clock 27MHz , 50Mhz
output [17:0] LEDR; // red LEDS
output [8:0] LEDG; // green LEDs
output [6:0] HEX0,HEX1,HEX2,HEX3; //7-segment display
output [6:0] HEX4,HEX5,HEX6,HEX7; //7-segment display
inout [35:0] GPIO;
assign HEX0=7'b111_1111;
assign HEX1=7'b111_1111;
assign HEX2=7'b111_1111;
assign HEX3=7'b111_1111;
assign HEX4=7'b111_1111;
assign HEX5=7'b111_1111;
assign HEX6=7'b111_1111;
assign HEX7=7'b111_1111;
//reg8 (reset_n,EN, CLK, Din, Qout);
// input reset_n;
// input CLK;
// input EN,
// input [7:0] Din;
// output [7:0] Qout;
wire [15:0]reg_temp;
assign LEDR=reg_temp;
input [17:0] SW; // toggle switches
input [7:0] KEY; // Push bottom
input CLOCK_50; //Clock 27MHz , 50Mhz
output [17:0] LEDR; // red LEDS
output [8:0] LEDG; // green LEDs
output [6:0] HEX0,HEX1,HEX2,HEX3; //7-segment display
output [6:0] HEX4,HEX5,HEX6,HEX7; //7-segment display
inout [35:0] GPIO;
assign HEX0=7'b111_1111;
assign HEX1=7'b111_1111;
assign HEX2=7'b111_1111;
assign HEX3=7'b111_1111;
assign HEX4=7'b111_1111;
assign HEX5=7'b111_1111;
assign HEX6=7'b111_1111;
assign HEX7=7'b111_1111;
//reg8 (reset_n,EN, CLK, Din, Qout);
// input reset_n;
// input CLK;
// input EN,
// input [7:0] Din;
// output [7:0] Qout;
wire [15:0]reg_temp;
assign LEDR=reg_temp;
reg8 u0(KEY[0], SW[17],CLOCK_50,SW[7:0],reg_temp[7:0]);
reg8 u1(KEY[0], SW[16],CLOCK_50,SW[7:0],reg_temp[15:8]);
//alu(input [7:0] a, input [7:0] b, input [2:0] op, output reg [7:0] y);
alu u2(reg_temp[7:0],reg_temp[15:8],SW[15:13],LEDG[7:0]);
endmodule
//ALU_8bit_REG
module reg8 (reset_n,EN, CLK, Din, Qout);
input reset_n;
input CLK;
input EN;
input [7:0] Din;
output [7:0] Qout;
reg [7:0] Qout;
always @(posedge CLK , negedge reset_n )
begin
if (!reset_n)
Qout = 0;
else if (EN)
Qout = Din;
end
endmodule // reg8
// 輸入 a, b 後會執行 op 所指定的運算,然後將結果放在暫存器 y 當中
module alu(input [7:0] a, input [7:0] b, input [2:0] op, output reg [7:0] y);
always@(a or b or op) begin // 當 a, b 或 op 有改變時,就進入此區塊執行。
case(op) // 根據 op 決定要執行何種運算
3'b000: y = a + b; // op=000, 執行 a + b
3'b001: y = a + 1; // op=001, 執行 a + 1
3'b010: y = a - b; // op=010, 執行 a - b
3'b011: y = a ^ b; // op=011, 執行 a xor b
3'b100: y = a | b; // op=100, 執行 a or b
3'b101: y = a & b; // op=101, 執行 a and b
3'b110: y = ~a; // op=110, 執行 not a
3'b111: y = a<<1; // op=111, 執行 a << 1’b1
endcase
end
endmodule
沒有留言:
張貼留言