//答案
//計組實驗1答案
//1-1
//第1關
module fa_behavioral(a,b,ci,s,co);//考慮進位的加法器模塊
input a,b;
input ci;
output s;
output co;
// 請在下面添加代碼,完成一位全加器功能
/* Begin */
assign {co, s} = a + b +ci;
/* End */
endmodule
//第二關
module adder(a,b,cin,cout,sum);
parameter bit_width=8;
output[bit_width-1:0] sum;
output cout;
input [bit_width-1:0] a,b;
input cin;
// 請在下面添加代碼,完成n=8位的無符號二進制數加法器功能
/* Begin */
assign {cout, sum} = a + b + cin;
/* End */
endmodule
//第三關
module substractor(a,b,cin,cout,sum);
parameter bit_width=8;
output [bit_width-1:0] sum;
output cout;
input [bit_width-1:0] a,b;
input cin;//carry
// 請在下面添加代碼,完成n位的無符號二進制數減法器功能
/* Begin */
assign sum = (a + ~b + 1 + cin);
assign cout = (a < b);
/* End */
endmodule
//第四關
module add_sub(a,b,control,cout,overflow,sum);
parameter bit_width=4;
output reg[bit_width-1:0] sum; output cout,overflow;
input [bit_width-1:0] a,b; input control;//carry
reg overflow,cout;
reg [bit_width:0] a2,b2,sum2;
always@(control or a or b)
begin
a2[bit_width]=a[bit_width-1]; //將a符號位擴展成2位並賦值給a2
a2[bit_width-1:0]=a[bit_width-1:0];
// 請在下面添加代碼,將b符號位擴展成2位並賦值給b2
/********** Begin *********/
b2[bit_width]=b[bit_width-1]; //將b符號位擴展成2位並賦值給b2
b2[bit_width-1:0]=b[bit_width-1:0];
/********** End *********/
if (control==0) {cout,sum2}=a2+b2;
else {cout,sum2}=a2+(~b2)+control;
if((sum2[bit_width]^sum2[bit_width-1])==1) overflow=1;
else overflow=0; //用雙符號位判溢出
sum[bit_width-1:0]=sum2[bit_width-1:0];
end
endmodule
//1-2
//第一關
//設計一個輸入輸出均為高電平有效的3位二進制優先編碼器
//I[7]的優先權最高,I[0]的優先權最低
module encoder8_3_test(I,Y);
input [7:0] I;
output reg[2:0] Y;
always @(I)
begin
if(I >= 8'b00000000 && I < 8'b00000010)
Y = 3'b000;
if(I >= 8'b00000010 && I < 8'b00000100)
Y = 3'b001;
if(I >= 8'b00000100 && I < 8'b00001000)
Y = 3'b010;
if(I >= 8'b00001000 && I < 8'b00010000)
Y = 3'b011;
if(I >= 8'b00010000 && I < 8'b00100000)
Y = 3'b100;
if(I >= 8'b00100000 && I < 8'b01000000)
Y = 3'b101;
if(I >= 8'b01000000 && I < 8'b10000000)
Y = 3'b110;
if(I >= 8'b10000000)
Y = 3'b111;
end
/* End */
endmodule
//第二關
//設計具有一位使能端的3線-8線譯碼器。當使能端為0時,8位輸出信號全為0;
//如果一位使能信號為1,則輸出高電平有效的譯碼信號。
module decoder3e_test(a,ena,y);
input [2:0] a;
input ena;
output reg[7:0] y;
// 請在下面添加代碼,完成設計任務
/* Begin */
always @(ena or a)
begin
if (ena == 0)
y = 8'b00000000;
else
case(a)
3'b000: y = 8'b00000001;
3'b001: y = 8'b00000010;
3'b010: y = 8'b00000100;
3'b011: y = 8'b00001000;
3'b100: y = 8'b00010000;
3'b101: y = 8'b00100000;
3'b110: y = 8'b01000000;
3'b111: y = 8'b10000000;
default: y = 8'b00000000;
endcase
end
/* End */
endmodule