vivado 设计PC与RAM

  1. CPU部件实现之PC和半导体存储器RAM
    1. 设计要求

理解和掌握 CPU 中程序计数器 PC 和半导体存储器 RAM 的工作原理,并使用 Verilog 和 ModelSim 进行设计和仿真

1. 使用 Verilog 完成程序计数器 PC 的设计,要求:

l PC 为 8 位计数器

2. 使用 Verilog 完成数据存储器的设计,并编写测试仿真文件验证其正确性。要求

l 存储字长 16 位,存储容量 1K 字节;

l 一根读写控制信号线控制读写,低电平有效。

    1. 方案设计
      1. 实验原理

PC模块:PC模块的功能就是给出取指令地址,同时每个时钟周期取指令的地址递增。

图 3.1 PC模块结构图

PC模块接口

图3.2 PC模块接口图

表  3.1PC模块接口描述

序号

接口名

宽度

输入/输出

作用

1

rst

1

输入

复位信号

2

clk

1

输入

时钟信号

3

pc

8

输出

要读取时钟信号

RAM模块

存储单元的内容可按需随意取出或存入,且存取的速度与存储单元的位置无关的存储器。

这种存储器在断电时将丢失其存储内容,故主要用于存储短时间使用的程序。 按照存储信息的不同,随机存储器又分为静态随机存储器(Static RAM,SRAM)和动态随机存储器(Dynamic RAM,DRAM)。

RAM结构图:

图3.3 RAM结构图

RAM模块接口:

图 3.4  RAM模块的接口

表 3.2 RAM模块接口描述

序号

接口名

宽度

输入/输出

作用

1

clk

1

输入

时钟信号

2

Wen

1

输入

判断

3

indata

16

输入

要读取的指令

4

address

9

输入

要读取得指令地址

5

outdata

16

输出

读出的指令

      1. Verilog关键代码实现

图 3.5 pc模块源文件

PC_des源文件定义了两个输入变量clk,与rst,一个输出变量pc, posedge说明在每一个上升沿进行判断如果rst等于1,则将pc置为0,不然则pc = pc +1。

 图 3.6 pc模块测试文件

每隔1ns翻转clk时钟,在开始时设置clk = 1,pcs = 1.

经过1ns后pcs = 1,10ns 后pcs = 1

图 3.7 RAM源文件代码

代码解释:

定义了四个输入变量 clk,Wen,address,indata,一个输出变量 outdata,

构建存储单元 unit 16位 且存储单元1K字节,在每一个上升沿进行判断,如果Wen= 0,则将数据写入储存单元

图 3.8 RAM测试文件代码

代码解释:

每隔1ns翻转clk时钟,在开始时设置clk = 1,pcs = 1.

经过1ns后pcs = 1

10ns 后pcs = 1

    1. 实验步骤
  1. 创建文件,编写源文件,仿真文件

创建项目test3

图 3.9 创建项目test3

创建源文件,编写代码

  

图 3.10 创建pc_des 图 3.11编写pc_des源文件代码

    

图 3.12 创建ram_des源文件 图 3.13编写ram_des源文件代码

创建测试文件,并编写代码

         

图 3.14创建pc_sim测试文件 图 3.15编写pc_sim测试文件代码

        

图 3.16创建 ram_sim测试文件 图 3.17编写 ram_sim测试文件代码

  1. 进行行为仿真,RTL分析

图 3.18 PC行为仿真结果图

结合我们verilog语言编写和测试文件可知

在前12ns时 pc在不断+1。

第11ns,我们将pcs设为0,即在下一个上升沿的时候把pc设为0

图 3.19 RTL原理图

上图为RTL原理图,此图将PC得硬件编程语言用电路图表示出来了

图 3.20 RAM行为仿真结果图

结合我们verilog语言编写和测试文件,仿真图可知在前1000个ns,我们在不断的写入数字后1000个ns改变address实现了数字的验证。

图 3.21 RTL原理图

上图为RTL原理图,此图将RAM的硬件编程语言用电路图表示出来了

  1. 综合

图 3.22 PC模块与器件相关的原理图

图 3.23 RAM模块与器件相关原理图

    1. 故障与调试
      1. 仿真故障1

故障现象:

图 3.24 故障图

图 3.25 故障图

原因分析: 

通过查看log日志,我们发现是测试文件中的pc_count,  pcs出现了问题,

混淆了测试文件中例化模块与源文件模块中的输入输出变量。

图 3.26 logr日志

解决方案: 

       

图 3.27 修改前                          图 3.28 修改后

将pc try 模块中的  

.pcs(pcs)修改为 .rst(pcs)

.pc_count(pc_count)修改为pc(pc_count)

建议以后给变量取名字的时候尽量取一样的名字。

      1.  RAM模块无法仿真 故障2

故障现象:

图 3.29 故障现象图

当我对PC模块仿真,并进行综合后,对RAM进行仿真出现了这个问题,无法进行仿真。

原因分析:

我在重新对RAM进行仿真的过程中没有关掉上一个仿真,导致log文件一直被占用。

解决方案:

双击左侧边栏Flow Nacigator中的SIMULATION,进入仿真页面后点击右上角的叉叉,再重新进行仿真即可

图 3.30 操作图

图 3.31 操作图

还需要注意的一件事是,由于刚开始创建文件的顺序,pc_des,与pc_sim这两个文件是处于顶层的,我们需要把ram_des与ram_sim这两个文件设置为顶层 使用 set as top 即可

图 3.32 set as top操作

      1.  未区分大小写 故障3

故障现象:

图 3.33 故障图

当进行RAM仿真的时候出现了此错误,不能进行仿真。

原因分析

经过查看 Tcl Console 发现 Module<RAM>未发现,回想自己之前写的源文件,此处应该使用 ram_des.

解决方案

将ram_sim中的RAM更改为 ram_des即可。

图 3.34 更改前    图 3.35 更改后

    1. 仿真与分析

PC仿真测试用例

表 3.3 仿真测试用例

#

clk

pcs

pc_out

0

1

1

0

1

0

0

1

2

1

0

2

3

0

0

3

4

1

0

4

5

0

0

5

6

1

0

6

12

1

1

0

图 3.36 PC行为仿真结果图

在前12ns时 pc在不断+1。第11ns,我们将pcs设为0,即在下一个上升沿的时候把pc设为0。根据仿真图,可知我们的实验成功。

表 3.4 RAM测试用例

#

clk

Wen

indata

address

outdata

0

0

1

x

x

x

10

0

1

0

0

x

20

0

1

2

1

x

30

0

1

4

2

x

40

0

1

6

3

x

50

0

1

8

4

x

60

0

1

10

5

x

70

0

1

12

6

x

图 3.37 RAM行为仿真图

在前1000个ns,我们在不断的写入数字后1000个ns改变address实现了数字的验证结合ModelSim仿真文件我们可以知道实验成功

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

油豆皮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值