模型机设计(VERILOG)-连接与验证

一.组件连接

完成模型机所有组件的设计后可以开始进行部件连接。只需要按照模型机结构将部件按端口连接,其中相邻的部件的数据传输线路、总线都可以直接连接,控制信号等由于部件不相邻,距离较远,建议采用端口命名的方式进行连接。

1.添加部件

        首先创建一个新的工程。
        先在工程文件中加入各部件的.v文件。

        逐个为部件创建符号。

         创建完成后,新建一个BDF文件,然后就可以在bdf图中使用这些部件了。

2.连接

        指令存储部分,RAM是元件库中的一个元件,不需要我们设计,只需要更改并去除多余的端口(properties-ports中将不需要的端口设置为unused)。

        指令译码和控制信号部分。

        运算部分数据通路,状态寄存器的输入cf是ALU的cf和移位逻辑的相或。

        整体连接:

        左侧连接到总线的是输入输出端口。
        连接后的编译结果(资源消耗):

二.验证

1.验证方式

        模型机执行的指令存放在RAM中,并按地址单元进行存储,通过设计RAM中的数据,进行指令的验证。其中RAM的指令存放在.mif文件内,如下:

        验证指令执行正确的方式是查看数据结果。新建vwf波形文件,添加需要查看的数据,注意图中圈出的部分,如果是PINS:选项则只能查看模型机与外部连接的端口,只有in,out,clk,更改这个选项就可以找到其他已经连入的端口和寄存器。


        这里为了方便验证,找出了clk,sm,in,out,寄存器a,b,c,状态c,z,和输入RAM的地址add,并把add设置为10进制,查看指令地址单元更加方便。

 2.测试代码

        为了测试给寄存器c初值(.v文件中用initial语句赋初值):01100000(这个值任意,给哪个寄存器赋初值或不赋初值都任意,只要结果是和设计的程序执行后的结果相同就算验证成功)
        使用如下指令进行测试,共16个指令,加上JZ,JC执行不成功共20种情况,增加两次输出便于观察结果,共执行20个指令,停机后的OUT指令不执行。

 3.测试结果

波形结果


        JMP跳转后计数器中指令地址变为4,验证正确。向A寄存器IN指令写入OUT指令输出数据11000000验证正确。


       将寄存器A中数据写入存储器地址01100000(寄存器C的初值),再写给寄存器B,A=B,MOVB,MOVC指令正确,JZ跳转不成功,pc+1,验证正确。


       执行SUB指令,A-B=0,Z=1,JZ跳转成功,地址跳转至16,执行NOT指令,A=11111111,三条指令执行验证正确。


        执行AND A C,A=A&C=01100000,AND指令验证正确,JC跳转不成功,PC+1。执行ADD A B,A=A+B=01100000+11000000(转移指令后,B为IN指令时输入的A),运算结果A=00100000,C=1,验证正确。此时执行JC,地址载入为64,验证正确。


       跳转后执行空指令后,RSR指令将A中数据右移一位,A=00010000,输出,验证正确。


       RSL指令将B中数据左移一位,B=10000001,验证正确。MOVA A B将B中数据移给A并输出,验证正确。HALT停机指令后,sm=1,不再翻转,验证正确。

下载验证:

       共有三次输出寄存器A的数据,第一次输出为11000000,第二次输出为00010000,第三次输出为10000001。将时钟频率调低,下载进行验证,验证正确。
 

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
目 录 译者序 前言 第1章 简介 1 1.1 什么是Verilog HDL? 1 1.2 历史 1 1.3 主要能力 1 第2章 HDL指南 4 2.1 模块 4 2.2 时延 5 2.3 数据流描述方式 5 2.4 行为描述方式 6 2.5 结构化描述形式 8 2.6 混合设计描述方式 9 2.7 设计模拟 10 第3章 Verilog语言要素 14 3.1 标识符 14 3.2 注释 14 3.3 格式 14 3.4 系统任务和函数 15 3.5 编译指令 15 3.5.1 `define和`undef 15 3.5.2 `ifdef、`else 和`endif 16 3.5.3 `default_nettype 16 3.5.4 `include 16 3.5.5 `resetall 16 3.5.6 `timescale 16 3.5.7 `unconnected_drive和 `nounconnected_drive 18 3.5.8 `celldefine 和 `endcelldefine 18 3.6 值集合 18 3.6.1 整型数 18 3.6.2 实数 19 3.6.3 字符串 20 3.7 数据类型 20 3.7.1 线网类型 20 3.7.2 未说明的线网 23 3.7.3 向量和标量线网 23 3.7.4 寄存器类型 23 3.8 参数 26 第4章 表达式 28 4.1 操作数 28 4.1.1 常数 28 4.1.2 参数 29 4.1.3 线网 29 4.1.4 寄存器 29 4.1.5 位选择 29 4.1.6 部分选择 29 4.1.7 存储器单元 30 4.1.8 函数调用 30 4.2 操作符 30 4.2.1 算术操作符 31 4.2.2 关系操作符 33 4.2.3 相等关系操作符 33 4.2.4 逻辑操作符 34 4.2.5 按位操作符 35 4.2.6 归约操作符 36 4.2.7 移位操作符 36 4.2.8 条件操作符 37 4.2.9 连接和复制操作 37 4.3 表达式种类 38 第5章 门电平模型化 39 5.1 内置基本门 39 5.2 多输入门 39 5.3 多输出门 41 5.4 三态门 41 5.5 上拉、下拉电阻 42 5.6 MOS开关 42 5.7 双向开关 44 5.8 门时延 44 5.9 实例数组 45 5.10 隐式线网 45 5.11 简单示例 46 5.12 2-4解码器举例 46 5.13 主从触发器举例 47 5.14 奇偶电路 47 第6章 用户定义的原语 49 6.1 UDP的定义 49 6.2 组合电路UDP 49 6.3 时序电路UDP 50 6.3.1 初始化状态寄存器 50 6.3.2 电平触发的时序电路UDP 50 6.3.3 边沿触发的时序电路UDP 51 6.3.4 边沿触发和电平触发的混合行为 51 6.4 另一实例 52 6.5 表项汇总 52 第7章 数据流模型化 54 7.1 连续赋值语句 54 7.2 举例 55 7.3 线网说明赋值 55 7.4 时延 55 7.5 线网时延 57 7.6 举例 57 7.6.1 主从触发器 57 7.6.2 数值比较器 58 第8章 行为建模 59 8.1 过程结构 59 8.1.1 initial 语句 59 8.1.2 always语句 61 8.1.3 两类语句在模块中的使用 62 8.2 时序控制 63 8.2.1 时延控制 63 8.2.2 事件控制 64 8.3 语句块 65 8.3.1 顺序语句块 66 8.3.2 并行语句块 67 8.4 过程性赋值 68 8.4.1 语句内部时延 69 8.4.2 阻塞性过程赋值 70 8.4.3 非阻塞性过程赋值 71 8.4.4 连续赋值与过程赋值的比较 72 8.5 if 语句 73 8.6 case语句 74 8.7 循环语句 76 8.7.1 forever 循环语句 76 8.7.2 repeat 循环语句 76 8.7.3 while 循环语句 77 8.7.4 for 循环语句 77 8.8 过程性连续赋值 78 8.8.

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值