計算機組成原理_verilog學習_實驗一答案(原創)


//答案
//計組實驗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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM