HNU电路电子学实验二

一、实验目的

1.了解简易模型机的内部结构和工作原理。

2.熟悉译码器、运算器的工作原理。

3.分析模型机的功能,设计指令译码器。

4.分析模型机的功能,设计 ALU。

二、实验内容

  1. 用 VERILOG 语言设计指令译码器;

  1. 用 VERILOG 语言设计ALU。

三、实验过程

1、指令译码器

A)创建工程(选择的芯片为 family=Cyclone II;name=EP2C5T144C8)

步骤:左上角file->New Project Wizard->选择工程位置和工程名->选择芯片 Cyclone II, availabledevice 中选择 EP2C5T144C8->点击 next->最后点击 finish 完成创建工程

工程创建图:

  1. 编写源代码

根据实验指导和要求实现的功能写出对应的 Verilog 代码。

步骤:左上角 file->new->Verilog hdlfile->编写代码(模块名需与工程名一致)->编译成功后保存到工程文件中

module ins_decode (
        input en,
        input [7:0] ir,
        output reg mova,
        output reg movb,
        output reg movc,
        output reg add,
        output reg sub,
        output reg and1,
        output reg not1,
        output reg rsr,
        output reg rsl,
        output reg jmp,
        output reg jz,
        output reg jc,
        output reg in1,
        output reg out1,
        output reg nop,
        output reg halt
    );

    // parameter MOV = 4'b1100,ADD = 4'b1001,SUB = 4'b0110,AND = 4'b1011,NOT = 4'b0101,RSR = 4'b1010,JMP = 4'b0011,IN = 4'b0010,OUT = 4'b0100,NOP = 4'b0111,HALT = 4'b1000;

    always @(*) begin
        {mova,movb,movc,add,sub,and1,not1,rsr,rsl,jmp,jz,jc,in1,out1,nop,halt} = 0;
        if (en) begin
            case(ir[7:4])
                4'b1100: begin
                    if (ir[3] & ir[2])
                        movb = 1'b1;
                    else if (ir[1] & ir[0])
                        movc = 1'b1;
                    else
                        mova = 1'b1;
                end
                4'b1001:
                    add = 1'b1;
                4'b0110:
                    sub = 1'b1;
                4'b1011:
                    and1 = 1'b1;
                4'b0101:
                    not1 = 1'b1;
                4'b1010: begin
                    if (ir[1] & ir[0])
                        rsl = 1'b1;
                    else
                        rsr = 1'b1;
                end
                4'b0011: begin
                    jc  = ir[1];
                    jz  = ir[0];
                    jmp = !ir[1] && !ir[0];
                end
                4'b0010:
                    in1 = 1'b1;
                4'b0100:
                    out1 = 1'b1;
                4'b0111:
                    nop = 1'b1;
                4'b1000:
                    halt = 1'b1;
                default:
                    ;
            endcase
        end
    end
endmodule

代码图:

  1. 编译与调试(包含编译调试过程中的错误﹑警告信息以及资源消耗)

  1. RTL 视图

视图分析及结论:

分析:由视图可得,视图左边为输入,右边为输出。其中连接有一系列的元器件。比如比较器:当输入相等时输出 1,不相等时输出 0;还有大部分的 2-1 选择器构成,当控制信号为 0 时,输出第一位,控制信号为 1 时,输出第二位。图中输入信号为 ir 和 en,输出信号包括 add 等 16 种情况。各个输出端口之间通过导线相连。

结论:一个功能的实现需要经过多重门的处理后才能实现,一个元件的内部原理结构图十分复杂。

D)功能仿真模型

结果分析及结论:

分析:功能仿真是指不考虑器件延时和布线延时的理想情况下对源代码进行逻辑功能的验证。由仿真波形可得,对于输入状态的变化,输出结果实时变化,没有延迟,其结果与电路设计的真值表的结果相对应。

当 en 为 0 时,不管 ir 为何值,16 个输出全为 0当 en 为 1 时:

当 ir=11000000 时,mova 输出为 1;当 ir=11001100 时,movb 输出为 1;当 ir=11000011 时,movc 输出为 1;当 ir=10010000 时,add 输出为 1;当 ir=01100000 时,sub 输出为 1;当 ir=10110000 时,and1 输出为 1;当 ir=01010000 时,not1 输出为 1;当 ir=10100000 时,rsr 输出为 1;当 ir=10100011 时,rsl 输出为 1;当 ir=00110000 时,jmp 输出为 1;当 ir=00110001 时,jz 输出为 1; 当 ir=00110010 时,jc 输出为 1; 当 ir=00100000 时,in1 输出为 1;当 ir=01000000 时,out1 输出为 1;当 ir=01110000 时,nop 输出为 1;当 ir=10000000 时,halt 输出为 1;

结论:功能仿真操作简单,能体现和验证实验的功能,但忽略延迟的影响会使结果与实际结

果有一定误差。

E)时序仿真

结果分析及结论:

分析:时序仿真是指在布线后进行,是最接近真实器件运行的仿真,它与特定的器件有关,又包含了器件和布线的延时信息。由波形可得,当输入状态发生改变时,输出结果并未同时改变,而是有一定延迟,同时由于输入状态的改变,导致电路出现“冒险”,导致输出结果并未与预期结果相同。

结论:时序仿真可以用来验证程序在目标器件中的时序关系。同时考虑了器件的延迟后,其输出结果跟接近实际情况,但是考虑的情况过多,不容易操作,容易产生错误。时序仿真不仅反应出输出和输入的逻辑关系,同时还计算了时间的延时信息,是与实际系统更接近的一种仿真结果。不过,要注意的是,这个时间延时是仿真软件“估算”出来的。

  1. 时序分析

操作方法是:编译后,在 compilation report 中选择【timing analysis】-【summary】-

【tpd】

Timing Analyzer Summmary图

Tpd 图

结果分析及结论:

分析:由图可得,Timing Analyzer Summmary 总结所有经典定时分析的结果,并报告每个定时特性的最坏情况定时。比如从 ir[3]到 jmp的最坏定时情况的 tpd 为 11.720ns。下面的tpd 报告表则给出了源节点和目标节点之间的 tpd 延迟时间,比如第二行中 ir[5]到 add 的 tpd 为 11.699ns。

结论:实际连接图中个元器件连接之间是存在时间延迟的,而且不同的元器件之间的时间延迟也不相同。

2.算术单元ALU

A)创建工程(选择的芯片为 Cyclone II;name= EP2C5T144C8)步骤同指令译码器

module alu(
        input  m,
        input [3:0]s,
        input [7:0]a,
        input [7:0]b,
        output reg cf,
        output reg zf,
        output reg [7:0]t
    );
    reg[8:0] temp;
    always @(*) begin
        zf=1'b0;
        cf=1'b0;
        temp=9'b000000000;
        if(m==1'b1)    begin
            if(s[3:0]==4'b1001) begin
                t=a+b;
                temp=a+b;
                if(temp[8]==1'b1)
                    cf=1;
                else
                    cf=0;
                if(t==8'b00000000)
                    zf=1;
                else
                    zf=0;
            end
            else if(s[3:0]==4'b0110) begin
                t=b-a;
                temp=b-a;
                if(temp[8]==1'b0)
                    cf=0;
                else
                    cf=1;
                if(t==8'b00000000)
                    zf=1;
                else
                    zf=0;
            end
            else if(s[3:0]==4'b1011)
                t=a&b;
            else if(s[3:0]==4'b0101)
                t=~b;
            else if(s[3:0]==4'b0100||s[3:0]==4'b1010)
                t=b;
            else
                t=8'bxxxxxxxx;
        end
        else if(m==1'b0&&s[3:0]==4'b1100)
            t=a;
        else
            t=8'bxxxxxxxx;
    end
endmodule

步骤同指令译码器

  1. 编译与调试(包含编译调试过程中的错误、警告信息以及资源消耗)

步骤同指令译码器

资源消耗:

  1. RTL 视图

结果分析及结论:

分析:由视图可得,视图左边为输入,右边为输出。其中连接有一系列的元器件。比如比较器:当输入相等时输出 1,不相等时输出 0;还有大部分的 2-1 选择器构成,当控制信号为 0 时,输出第一位,控制信号为 1 时,输出第二位。图中输入信号为 m,s,a,b,输出信号为 t,cf,zf。各个输出端口之间通过导线相连。

结论:一个功能的实现需要经过多重门的处理后才能实现,一个元件的内部原理结构图十分复杂。

D)功能仿真波形

功能仿真波形图

结果分析及结论:

分析:功能仿真是指不考虑器件延时和布线延时的理想情况下对源代码进行逻辑功能的验证。由仿真波形可得,对于输入状态的变化,输出结果实时变化,没有延迟,其结果与电路设计的真值表的结果相对应。

当控制信号m 为 1,s 为1001 时,执行 t=a+b当控制信号 m 为1,s 为 0110 时,执行 t=b-a当控制信号 m 为1,s 为 1011 时,执行 t=a&b当控制信号 m 为 1,s 为 0101 时,执行 t=~b当控制信号 m 为1,s 为 1010 时,执行 t=b 当控制信号 m 为0,s 为 1100 时,执行 t=a 有进位和借位时 cf 为1,否则为 0;

和为 0 或差为 0 时 zf 为 1,否则为0;

结论:功能仿真操作简单,能体现和验证实验的功能,但忽略延迟的影响会使结果与实际结果有一定误差。

  1. 时序仿真波形

结果分析及结论:

分析:时序仿真是指在布线后进行,是最接近真实器件运行的仿真,它与特定的器件有关,又包含了器件和布线的延时信息。由波形可得,当输入状态发生改变时,输出结果并未同时改变,而是有一定延迟,同时由于输入状态的改变,导致电路出现“冒险”,导致输出结果并未与预期结果相同。

结论:时序仿真可以用来验证程序在目标器件中的时序关系。同时考虑了器件的延迟后,其输出结果跟接近实际情况,但是考虑的情况过多,不容易操作,容易产生错误。时序仿真不仅反应出输出和输入的逻辑关系,同时还计算了时间的延时信息,是与实际系统更接近的一种仿真结果。不过,要注意的是,这个时间延时是仿真软件“估算”出来的。

G)时序分析

结果分析及结论:

分析:由图可得,Timing Analyzer Summmary 总结所有经典定时分析的结果,并报告每个定时特性的最坏情况定时。比如从 a[0]到 zf 的最坏定时情况的 tpd 为 38.50ns。下面的 tpd报告表则给出了源节点和目标节点之间的 tpd 延迟时间,比如第二行中 s[0]到 t[0]的 tpd为 29.6ns。

结论:实际连接图中个元器件连接之间是存在时间延迟的,而且不同的元器件之间的时间延迟也不相同。

四、思考题

  1. 指令译码器必须要 16 个输出吗?可否将一些输出合并,哪些可以合并,为什么?

答:不一定。jmp 和 add 可以合并起来,因为 jmp 是将 add 后的结果写入pc 中,则可以进行 add 操作后直接进行写入操作。Add 和 sub 和 and 操作可以合并,因为这三个操作类似,且输出为使能信号,故可以用一个合并使能信号来作为三个输出的共同使能信号。

  1. ALU 中的 S[3..0]控制信号是来自哪里或者说与什么信息相同?答:来自指令码 ir的前四位。

3、为何 S[3..0]等于 1100 时将输入 a 传给t,S[3..0]等于 1010 或 0100 时将输入b 传给t? S[3..0]为控制信号,当 S[3..0]输入为 1100 时,控制输出 t 等于a,S[3..0]等于 1010 或0100 时,t 等于 b,此时 alu 相当于选择器。

五、实验总结、必得体会及建议

1、从需要掌握的理论、遇到的困难、解决的办法以及经验教训等方面进行总结。

基本了解了简易模型机的内部结构和工作原理。同时熟悉了译码器、ALU 的工作原理。学会使用 Verilog 语言编写电路。但遇到了一些困难,比如不懂使用 QuartusII 进行波形仿真。但通过上网查询相关资料和询问同学后得以解决问题,并通过分析报告发现电路中的问题。还有不懂根据实验要求的功能表输出相对应的结果,不懂使用 always 和 assign 语句等,通过上网查询资料等都得以解决。以后再遇到相关问题时,可以通过先上网查询资料,再询问老师和同学来解决。

2、对本实验内容、过程和方法的改进建议(可选项)。

希望在元件的功能表中能给出当输入除了已给出的输出情况外的输入,输出结果应该取什么。

  • 26
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值