Bootstrap

合肥工业大学(HFUT)2024计算机组成原理实验1

注:相应的源文件在文末的github链接中

实验一 Vivado环境下组合电路的设计与仿真

一.实验要求

1. 在Vivado 环境下完成对简单电路工作情况的仿真模拟;

2. 实现以下组合逻辑功能:编码/译码器,比较器,全加器。

二.Led灯的控制电路实现

源文件

`timescale 1ns / 1ps

 module  led(  input  CLK   ,   output reg[1:0]   led_out     );

reg [32:0]   count=0;

 parameter T1MS=50000000;                    //定义一个时间常量

 always@(posedge CLK)                 //上升沿时钟(CLK)敏感

begin

count<=count+1;                   //非阻塞的赋值,每一个时钟周期count自动+1

if(count==T1MS)

 begin     //当计数器count到达时间常量就置零

count<=0;

 end

if(count<25000000)  //前半个周期

 begin

led_out<=2'b01;

end

else begin

led_out<=2'b10; end  //后半个周期

end endmodule

激励文件(注意可能需要改变延时时间为自己的学号)

module  comp_tb();

    reg CLK, RST;  //输入信号

    reg [1:0] A,B;

    wire  AGTB,ALTB,AEQB;  //输出信号

    comp cp(CLK,RST,A,B,AGTB,ALTB,AEQB);  //调用实例

    initial

        begin//这个其实就是真值表的应用

            RST = 1; CLK = 0;

            A = 2'b00; B = 2'b01;

            #73 A = 2'b00;  B = 2'b00;

            #73 A = 2'b00;  B = 2'b01;

            #73 A = 2'b10;  B = 2'b01;

            #73 A = 2'b11;  B = 2'b10;

            #73 A = 2'b01;  B = 2'b01;

        end

        always #73 CLK = ~CLK;

endmodule

激励图像

三.编码器的实现

源文件

module    encoder4_2(q,d);

 input[3:0]   d;  //数据输入端 4

output[1:0]   q; //输出端口 2

reg[1:0]  q;  // reg变量在always语句中赋值

always@(d)

begin

case(d)

4'b0111:     q<=2'b11; //D3位有效输入

4'b1011:     q<=2'b10; //D2位有效输入

4'b1101:     q<=2'b01; //D1位有效输入

4'b1110:     q<=2'b00; //D0位有效输入

default:       q<=2'bzz;

endcase

end

 endmodule

激励文件(注意可能需要改变延时时间为自己的学号)

`timescale 1ns / 1ps

module  encoder4_2_tb();

    reg [3:0] d;  //输入信号

    wire [1:0] q;  //输出信号

    encoder4_2  e2(q,d);  //调用实例

    initial

        begin//这个其实就是真值表的应用

            d = 4'b0111;

            #73 d = 4'b1011;

            #73 d = 4'b1101;

            #73 d = 4'b1110;

        end

endmodule

激励图像

四.比较器的实现

源文件

module comp(CLK,RST,A,B,AGTB,ALTB,AEQB);

input  CLK,RST;  //

input[1:0]  A,B; //被比较的两个二位数字

output     AGTB,ALTB,AEQB;

 reg         AGTB,ALTB,AEQB;

always@(posedge CLK or negedge RST) begin  //对时钟信号的上升沿和清零信号的下降沿敏感

if(!RST) //如果清零

begin

        AGTB<=0; AEQB<=0; ALTB<=0;

end

else

begin

         if(A>B) //大于

        begin

                AGTB<=1; AEQB<=0; ALTB<=0;

        end

        else if(A==B) //等于                     

        begin

                AGTB<=0;

                AEQB<=1;

                ALTB<=0

        end

         else   // 小于

         begin

                 AGTB<=0; AEQB<=0; ALTB<=1;

        end

end

end endmodule

激励文件(注意可能需要改变延时时间为自己的学号)

module  comp_tb();

    reg CLK, RST;  //输入信号

    reg [1:0] A,B;

    wire  AGTB,ALTB,AEQB;  //输出信号

    comp cp(CLK,RST,A,B,AGTB,ALTB,AEQB);  //调用实例

    initial

        begin//这个其实就是真值表的应用

            RST = 1; CLK = 0;

            A = 2'b00; B = 2'b01;

            #73 A = 2'b00;  B = 2'b00;

            #73 A = 2'b00;  B = 2'b01;

            #73 A = 2'b10;  B = 2'b01;

            #73 A = 2'b11;  B = 2'b10;

            #73 A = 2'b01;  B = 2'b01;

        end

        always #73 CLK = ~CLK;

endmodule

激励图像

 五.全加器的实现

源文件

module ful_adder(cout,sum,a,b,cin);

input    a,b;

input    cin;

output    sum;

output    cout;

reg    sum;

reg    cout;

always@(a or b or cin) begin 

{cout,sum}=a+b+cin;  //使用位拼接符号{},如果有进位就进位到out

        end

endmodule

module  ful_adder_tb ();

        reg a,b,cin;  //输入信号

                wire  sum,cout;  //输出信号

          ful_adder fa (cout,sum,a,b,cin);

    initial

        begin//这个其实就是真值表的应用

            a = 1'b1; b = 1'b0; cin = 1'b1;

            #73 a = 1'b1; b = 1'b1; cin = 1'b1;

            #73 a = 1'b0; b = 1'b0; cin = 1'b1;

            #73 a = 1'b0; b = 1'b1; cin = 1'b0;

            #73 a = 1'b1; b = 1'b0; cin = 1'b1;

        end

endmodule

激励文件(注意可能需要改变延时时间为自己的学号)

module  ful_adder_tb ();

        reg a,b,cin;  //输入信号

                wire  sum,cout;  //输出信号

          ful_adder fa (cout,sum,a,b,cin);

    initial

        begin//这个其实就是真值表的应用

            a = 1'b1; b = 1'b0; cin = 1'b1;

            #73 a = 1'b1; b = 1'b1; cin = 1'b1;

            #73 a = 1'b0; b = 1'b0; cin = 1'b1;

            #73 a = 1'b0; b = 1'b1; cin = 1'b0;

            #73 a = 1'b1; b = 1'b0; cin = 1'b1;

        end

endmodule

激励图像

;