移位寄存器的设计(VHDL)及testbench的编写

移位寄存器是一种常用的存储元件,此处由D触发器构成,如下图所示。

当时钟边沿到来时,存储在移位寄存器的数据朝一个方向移动一个BIT位。

移位寄存器的功能主要为:串并转换,并串转换和同步延迟。

vhdl代码如下:

 1 library ieee;
 2 use ieee.std_logic_1164.all;
 3
 4 entity shiftreg_rb is  --实体说明及端口说明
 5     port(
 6         si,clr_bar,clk:in std_logic;
 7         qout:buffer std_logic_vector(3 downto 0)--由于qout端口既是当前D触发器的输入也是上一个D触发器的输出。
 8     );                                          --即qout信号是被驱动源驱动的同时还要驱动下一个端口。
 9 end entity shiftreg_rb;                         --此情况下要使用buffer模式的端口。
10
11 architecture behavior of shiftreg_rb is
12 begin
13     process (clk) ---当时钟发生变化(上升沿或下降沿发生),执行进程
14     begin
15         if  clk=‘1‘ then    --时钟上升沿触发
16             if clr_bar = ‘0‘ then --时钟使能
17                 qout <= "0000";
18             else
19                 qout(0) <=qout(1);--数据左移
20                 qout(1) <=qout(2);
21                 qout(2) <=qout(3);
22                 qout(3) <=si;
23             end if;
24         end if;
25     end process;
26 end behavior;

Testbench编写:

 1 LIBRARY IEEE;
 2 USE IEEE.std_logic_1164.all;
 3 USE IEEE.NUMERIC_STD.ALL;
 4 USE IEEE.MATH_REAL.ALL;
 5 USE IEEE.STD_LOGIC_UNSIGNED.ALL;
 6 USE IEEE.STD_LOGIC_ARITH.ALL;--因为将INTEGER型数据转换成STD_LOGIC_VECTOR需要使用CONV_STD_LOGIC_VECTOR命令。
 7                             --而此命令在IEEE.STD_LOGIC_ARITH.ALL中。
 8
 9 ENTITY shiftreg_tb IS    --testbench实体声明,由于testbench位最高层模块,因此无输入输出端口。
10 END shiftreg_tb;
11
12 ARCHITECTURE testbench OF shiftreg_tb IS
13     COMPONENT shiftreg_rb IS              --例化子模块(元件)前,需进行子模块(元件)声明
14         port(
15             si,clr_bar,clk:in std_logic;
16             qout:buffer std_logic_vector(3 downto 0)
17         );
18     END COMPONENT;
19     SIGNAL si,clk:STD_LOGIC;              --信号声明,为元件例化时所用
20     SIGNAL clr_bar:STD_LOGIC:=‘1‘;        --信号声明,为元件例化时所用
21     SIGNAL qout:STD_LOGIC_VECTOR(3 downto 0);
22     SIGNAL temp1:INTEGER range 0 to 15;   --将产生的伪随机数转化为整数型数值temp1
23     SIGNAL temp2:STD_LOGIC_VECTOR(3 DOWNTO 0);  --将temp1转化逻辑位矢量temp2
24     SIGNAL count1:STD_LOGIC_VECTOR (0 to 3):="0100";--计数信号
25     CONSTANT clk_period :time:=50 ns;     --时钟信号
26
27
28     BEGIN
29     U_shiftreg_rb:shiftreg_rb PORT MAP(  --UUT(被测元件shiftreg_rb)的例化
30         si=>si,
31         clr_bar=>clr_bar,
32         clk=>clk,
33         qout=>qout
34         );
35
36     PROCESS
37         VARIABLE seed1,seed2:POSITIVE; --伪随机数生成格式  种子seed1,seed2位positive型的,默认位1,改变种子的值会生成不同的随机数
38         VARIABLE rand:REAL;            --伪随机数生成格式  rand必须为real型数值
39         BEGIN
40         IF count1="0100" THEN          --每个200ns产生一次随机数
41             UNIFORM(seed1,seed2,rand);
42             temp1 <= INTEGER(TRUNC(rand*15.0));    --生成的随机数范围在0~15,且把生成的实数型随机数转化为整型。
43             temp2 <=CONV_STD_LOGIC_VECTOR(temp1,4);--由于没找到直接将整数型转化为标准逻辑型(STD_LOGIC)的命令,所以先将整型随机数转化为标准逻辑矢量型
44             --** 此处要注意,要实现移位寄存器的并转串模式,不能将随机数信号直接加再qout上,因为buffer型端口的驱动源只来自其内部。
45             --** 不过可以将qout改成inout类型试试,不过目前没成功。还一种方法是将多位信号分别加在D触发器的输入端口,这种方法肯定可行。
46
47             si <= temp2(0);                        --再将temp2的最低位赋值给移位寄存器的输入si,这样也可以产生一个随机的输入信号si。
48             count1  <=  "0000";
49         END IF;
50         WAIT FOR(clk_period/2);               --使clk时钟信号周期为25ns
51         clk <=  ‘1‘;
52         count1<= count1 +‘1‘;
53         WAIT FOR(clk_period/2);
54         clk <=  ‘0‘;
55
56     END PROCESS;
57 END testbench;

自动仿真.do文件的编写

quit -sim   #退出仿真
.main clear #清空命令框

vlib    ./lib                             #在.do文件所在目录创建名为lib的文件夹
vlib    ./lib/work                        #在lib文件夹里创建名为work的文件夹
vmap    work    ./lib/work                #将物理文件地址./lib/work映射到逻辑工作库work

vcom    -work   work    ./shiftreg_tb.vhd #编译vhdl文件,且将编译结果放在逻辑库work中
vcom    -work   work    ./../design/*.vhd #编译vhdl文件,且将编译结果放在逻辑库work中

vsim    -voptargs=+acc     work.shiftreg_tb #不带优化的启动modelsim仿真

add wave  -divider  {shiftreg_tb}           #添加测试列表名
add wave  shiftreg_tb/clk                   #添加待测信号
add wave  shiftreg_tb/si
add wave  shiftreg_tb/clr_bar
add wave  shiftreg_tb/count1
add wave  shiftreg_tb/temp1
add wave  shiftreg_tb/temp2
add wave  shiftreg_tb/qout
add wave  -divider  {U_shiftreg_tb}
add wave  shiftreg_tb/U_shiftreg_rb/*

run 1us  #仿真运行1us

编写好自动测试文件后,将其与测试平台shiftreg_tb.vhd文件放在一个文件名sim下。

打开modelsim,输入命令 do run.do

仿真结果如下:

原文地址:https://www.cnblogs.com/Maxwill-Peng/p/12227696.html

时间: 2024-10-31 15:43:06

移位寄存器的设计(VHDL)及testbench的编写的相关文章

VHDL与Verilog硬件描述语言TestBench的编写

VHDL与Verilog硬件描述语言在数字电路的设计中使用的非常普遍,无论是哪种语言,仿真都是必不可少的.而且随着设计复杂度的提高,仿真工具的重要性就越来越凸显出来.在一些小的设计中,用TestBench来进行仿真是一个很不错的选择.VHDL与Verilog语言的语法规则不同,它们的TestBench的具体写法也不同,但是应包含的基本结构大体相似,在VHDL的仿真文件中应包含以下几点:实体和结构体声明.信号声明.顶层设计实例化.提供激励:Verilog的仿真文件应包括:模块声明.信号声明.顶层设

JavaScript网站设计实践(七)编写最后一个页面 改进表单

原文:JavaScript网站设计实践(七)编写最后一个页面 改进表单 一.最后一个页面 contact.html.改进表单 在该页面实现的功能: 几乎所有的网站都会有表单填写,对于用户输入和填写的数据,首先我们一般现在前台验证,然后再去后台验证. 在前台最简单的验证:检查必填字段是否填写.填写格式是否符合要求等. 每个表单里面,当获取到输入焦点时,令提示文本消失 现在开始动手来写. 1.实现思路 (1)在这个表单里会验证的是必填字段和邮箱格式是否正确.首先,把判断必填字段和邮箱格式分别写在两个

JavaScript网站设计实践(四)编写about.html页面,利用JavaScript和DOM,选择性的显示和隐藏DIV元素

一.现在我们在网站设计(三)的基础上,来编写about.html页面. 这个页面要用到的知识点是利用JavaScript和DOM实现选择性地显示和隐藏某些DIV about.html页面在前面我们为了看导航栏菜单项高亮显示时,已经写了部分内容,只是那时写的代码没有实现div显示和隐藏,现在就在之前编写的基础上,为页面添加显示和隐藏div的效果. 没有写JavaScript之前看到的效果: 实现后的效果图: 这个就是我们现在要做的效果. 1.背景: 我们在about.html页面中写了一个ul列表

JavaScript网站设计实践(六)编写live.html页面 改进表格显示

原文:JavaScript网站设计实践(六)编写live.html页面 改进表格显示 一.编写live.html页面,1.JavaScript实现表格的隔行换色,并且当鼠标移过时当前行高亮显示:2.是输出表格中的abbr标签的内容 实现后的效果图是这样的: 1.实现思路 在输出表格的时候,给出一个判断,如果偶数或是奇数行我们想换色,则添加一个class为odd的值,在这个class里就设置了表格不同颜色tr行. 这里用到了一个判断函数:(下面是两个不同的方法,任选其一) 法一://隔行换色 添加

JavaScript网站设计实践(五)编写photos.html页面,实现点击缩略图显示大图的效果

原文:JavaScript网站设计实践(五)编写photos.html页面,实现点击缩略图显示大图的效果 一.photos.html页面,点击每一张缩略图,就在占位符的位置那里,显示对应的大图. 看到的页面效果是这样的: 1.实现思路 这个功能在之前的JavaScript美术馆那里已经实现了. 首先在页面中使用ul列表显示出所有的缩略图,然后使用JavaScript,for循环检查出当前点击的是哪一张图片,最后把这张图片给显示出来. 用到三个函数:显示图片函数.创建占位符预装图片.点击显示图片

设计一个JavaScript框架需要编写哪些模块

在这个js框架随处乱跑的时代,你是否考虑过写一个自己的框架?下面的内容也许会有点帮助. 一个框架应该包含哪些内容? 1. 语言扩展 大部分现有的框架都提供了这部分内容,语言扩展应当是以ECMAScript为基础进行的,不应当依赖任何宿主环境,也就是说,作为一个框架的设计者,你应当保证你的语言扩展可以工作在任何宿主环境中,而不是仅仅适合浏览器环境.你必须保证把它放到WScript,SpiderMonkey Shell,Rhino Shell,Adobe ExtendScript Toolkit甚至

[转]消除FPGA设计中的毛刺问题

一.FPGA(Field Programmable Gate Array)以其容量大.功能强以及可靠性高等特点,在现代数字通信系统中得到广泛的应用.采用FPGA设计数字电路已经成为数字电路系统领域的主要设计方式之一.在FPGA的设计中,毛刺现象是长期困扰电子设计工程师的设计问题之一,是影响工程师设计效率和数字系统设计有效性和可靠性的主要因素.由于信号在FPGA的内部走线和通过逻辑单元时造成的延迟,在多路信号变化的瞬间,组合逻辑的输出常常产生一些小的尖峰,即毛刺信号,这是由FPGA内部结构特性决定

(转载)Java程序员应当知道的10个面向对象设计原则

面向对象设计原则是OOPS编程的核心, 但我见过的大多数Java程序员热心于像Singleton (单例) . Decorator(装饰器).Observer(观察者) 等设计模式,而没有把足够多的注意力放在学习面向对象的分析和设计上面.学习面向对象编程像"抽象"."封装"."多态"."继承" 等基础知识是重要的,但同时为了创建简洁.模块化的设计,了解这些设计原则也同等重要.我经常看到不同经验水平的java程序员,他们有的不知

5-2数据库设计

5-2数据库设计 tags:数据库 基本步骤 步骤: 1. 需求分析阶段 进行数据库设计首先必须准确了解与分析用户需求.需求分析是整个设计过程的基础,是最困难和最耗费时间的一步. 2. 概念结构设计阶段 概念设计是整个数据库设计的关键,它通过对用户需求进行综合.归纳与抽象,行程一个独立于具体数据库管理系统的概念模型. 在概念结构设计阶段行程独立于机器特点,独立于各个关系数据库管理系统产品的概念模式,一般用ER图表示 3. 逻辑结构设计阶段 逻辑结构设计是将概念结构转为某个数据库管理系统所支持的数