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

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

实验二 Vivado环境下时序逻辑电路的设计与仿真

一.实验要求

  1. 在 Vivado 环境下进行时序电路的设计;
  2. 在 Vivado 环境下进行时序电路的仿真;

二.加法计数器的实现

源文件

module addcounter(clk,Q) ;

input clk ;

output[3 :0] Q ;

reg[3 :0] Q ;

initial Q = 4'b0000; //给加法器初始化

always @(posedge clk)

begin Q<=Q+1 ;

end endmodule

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

module  addcounter_tb();

    reg clk;  //输入信号

    wire [3:0] Q;  //输出信号

    addcounter ac(clk,Q);  //调用实例

    initial

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

            clk = 0;

        end

        always #73 clk = ~clk;

endmodule

激励图像

三.减法计数器的实现

源文件

module subcounter(clk,Q) ;

input clk ;

output[3 :0] Q ;

reg[3 :0] Q ;

initial Q = 4'b1111; //给减法器初始化

always @(posedge clk)

begin Q<=Q-1 ;

end endmodule

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

module  subcounter_tb();

    reg clk;  //输入信号

    wire [3:0] Q;  //输出信号

    subcounter ac(clk,Q);  //调用实例

    initial

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

            clk = 0;

        end

        always #73 clk = ~clk;

endmodule

激励图像

四.有限状态机设计时序控制电路的实现

要求

流水灯的实验结果,通过拨码开关sw的选择可以显示两种方式的流水灯。

如果将上面例3的状态机代码,编译后生成的bit文件下载到EGO1开发板上,并且管脚分配表如下:(下载部分不需要完成)

程序中管脚名

实际管脚

说明

clk

P17

clk时序电路时钟100MHZ

reset

P15

复位控制

SW

P5

拨动开关 SW0

DATA[0]

F6

LED0

DATA[1]

G4

LED1

DATA[2]

G3

LED2

DATA[3]

J4

LED3

例3的实验结果如下(仅供参考):

拨动开关

sw0 值

LED0

LED1

LED2

LED3

1

从左至右逐次只亮一个灯

0

从左至右逐次只灭一个灯

源文件

module led(clk,data,sw);

    input clk, sw;  // 输入时钟信号和开关信号

    output[3:0] data;  // 输出LED数据

    reg clk1s;  // 1秒钟时钟

    parameter max=5000000;  // 最大计数值

    reg[1:0] state=2'b00;  // 状态机状态

    reg[30:0] n;  // 计数器

    reg[3:0] data;  // LED数据寄存器

    always @(posedge clk) begin

        if(n==max) begin

            if(!clk1s)

                clk1s<=1'b1;  // 1秒时钟

            else

                clk1s<=1'b0;

            n<=0;  // 计数器复位

        end

        else

            n<=n+1;  // 计数器递增

    end

    always @(posedge clk1s) begin

        case(state)

            2'b00:begin

                state<=2'b01;  // 状态转移为01

                if(sw) begin

                    data<=4'b1000;  // 如果开关为1,输出1000

                end

                else begin

                    data<=4'b0111;  // 如果开关为0,输出0111

                end

            end

            2'b01:begin

                state<=2'b10;  // 状态转移为10

                if(sw) begin

                    data<=4'b0100;  // 如果开关为1,输出0100

                end

                else begin

                    data<=4'b1011;  // 如果开关为0,输出1011

                end

            end

            2'b10:begin

                state<=2'b11;  // 状态转移为11

                if(sw) begin

                    data<=4'b0010;  // 如果开关为1,输出0010

                end

                else begin

                    data<=4'b1101;  // 如果开关为0,输出1101

                end

            end

            2'b11:begin

                state<=2'b00;  // 状态转移为00

                if(sw) begin

                    data<=4'b0001;  // 如果开关为1,输出0001

                end

                else begin

                    data<=4'b1110;  // 如果开关为0,输出1110

                end

            end

        endcase

    end

endmodule

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

module tb_led();

   // 输入

   reg clk;

   reg sw;

   // 输出

   wire [3:0] data;

   // 实例化

   led UUT (

      .clk(clk),

      .data(data),

      .sw(sw)

   );

   // 时钟信号

   always #10 clk = ~clk; // Assuming 10ns clock period

   // 激励初始化

   initial begin

      clk = 0;

      sw = 0;

      #73 sw = 1;

      #73 sw = 0;

      #73 sw = 1;

      #73 sw = 1;

      #73 sw = 0;

      #73 sw = 1;

      $finish;

   end

endmodule

激励图像

五.github仓库链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值