计算机组成原理_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

 

posted @ 2020-04-16 10:13  LightAc  阅读(2197)  评论(0编辑  收藏  举报
返回顶端