一,设计如下图所示电路

外围封装的输入输出信号就D1(输入信号1),D2(输入信号2),CLK(就一个时钟,内部封装我没画,实际上是应该连着),RST(就一个复位),Q(一个输出)五个,

内部封装:我把第一排寄存器命名为R11,R12,R13,第二排寄存器命名为R21,R22,R23,复用器命名为M1,M2,M3,加法器命名为A1,A2,最后还有一个R3。比如说,从寄存器R11到复用器M1的输出线路,我表示为R11_M1。以上表示在图中标出。

输入输出位:输入D1是6位的,所以我们写(5 downto 0);输入D2是4位的;经过复用器,复用器输出是6+4=10位(9 downto 0);加法器A1是11位(10位输入+10位输入=10位输出+1位的进数位=11位);同理加法器A2是12位(11位+10位=11位+1位的进数位=12位);然后R3输入12位输出还是12位。

以下是我的电路结构设计代码

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;entity dat isport (clk : in std_logic;rst : in std_logic;D1 : in std_logic_vector(5 downto 0); --6bitsD2 : in std_logic_vector(3 downto 0); --4bitsq : out std_logic_vector(10 downto 0) --4+6+1=11bits);
end entity;architecture behave of dat issignal R11_R12 : std_logic_vector(5 downto 0); --Outputsignal R12_M2 : std_logic_vector(5 downto 0);signal R21_R22 : std_logic_vector(3 downto 0);signal R22_M2 : std_logic_vector(3 downto 0);signal M1_A1 : std_logic_vector(9 downto 0);signal M2_A1 : std_logic_vector(9 downto 0);signal A1_R3 : std_logic_vector(10 downto 0);beginR1 : process (rst,clk) --Row Register1
beginif rst = '1' thenR11_R12 <= (others => '0');R12_M2 <= (others => '0');elsif rising_edge (clk) thenR11_R12 <= D1;R12_M2 <= R11_R12;end if;
end process;R2 : process (rst,clk) --Row Register2
beginif rst = '1' thenR21_R22 <= (others => '0');R22_M2 <= (others => '0');elsif rising_edge (clk) thenR21_R22 <= D2;R22_M2 <= R21_R22;end if;
end process;M1_A1 <= R11_R12*R21_R22; --MUX1
M2_A1 <= R12_M2*R22_M2; --MUX2A1_R3 <= EXT(M1_A1,11) + EXT(M2_A1,11);--QR3 : process (rst,clk)
begin
if rst = '1' then
q <= (others=> '0'); --Output
elsif rising_edge (clk) then
q <= A1_R3;
end if;
end process;end behave;

以下是我的仿真TB代码

use IEEE.STD_LOGIC_UNSIGNED.ALL;entity tb_DF isend entity;architecture behave of tb_DF issignal D1_sim  : std_logic_vector(5 downto 0);signal D2_sim  : std_logic_vector(3 downto 0);signal clk_sim     : std_logic;signal rst_sim     : std_logic;signal q_sim  : std_logic_vector(11 downto 0);    constant clk_period : time := 20 ns;   component dat isport (clk : in std_logic;rst : in std_logic;D1 : in std_logic_vector(5 downto 0);D2 : in std_logic_vector(3 downto 0);q : out std_logic_vector(11 downto 0));
end component;begindat_inst : dat port map(D1  => D1_sim,clk     => clk_sim,D2  => D2_Sim,rst     => rst_sim,q  => q_sim);clk_proc:processbeginclk_sim <= '1';wait for clk_period/2;clk_sim <= '0'; wait for clk_period/2;end process;rst_proc:process --关于Rst的设定:先让它等于1,50ns后置0beginrst_sim <= '1';wait for 50 ns;rst_sim <= '0';wait;end process;D1_sim <= "000000","000001" after 100 ns,   --"00000001" , "000011" after 500 ns;  --"00000011" after 500 ns;D2_sim <= x"0",x"2" after 150 ns,   --"00000001" , x"4" after 600 ns; --"00000011" after 500 ns;end behave;

运行结果就不截图了,重在搞懂怎么写,怎么表示。

二,现在我们把锁存器的结构加上,再来一道例题,如下图所示。

关于锁存器的结构说明,可以参考这个链接:https://blog.csdn.net/qq_21849797/article/details/78313632

实际上就是,当使能端=1,就把输入值给输出(Q=D);否则的话,就保持原值Q=Q。

外部设定:CLK(还是一个时钟,这是给寄存器的,锁存器不需要时钟,你可以在process的括号中发现不同),7位输入信号D1,4位的输入信号D2,一个复位RST,一个输出Q,还有四个锁存器的四个使能端Lad1,Lad2,Lad3,Lad4.

内部设定:输入,输出的名称和位数我都在图中标出了。

请看结构代码:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;entity dat isport (clk : in std_logic;rst : in std_logic;D1 : in std_logic_vector(6 downto 0); --7bitsD2 : in std_logic_vector(4 downto 0); --5bitsq : out std_logic_vector(13 downto 0); --14bitslad1: in std_logic; --Latch enable1, ENV=1,Q=D;Others Q=Q老师说Others不用写lad2: in std_logic; --Latch enable2lad3: in std_logic; --Latch enable3lad4: in std_logic --Latch enable4);
end entity;architecture behave of dat is --all outout line are heresignal L1_L4 : std_logic_vector(6 downto 0); --Latch Outputsignal L2_L4 : std_logic_vector(6 downto 0);signal L3_L4 : std_logic_vector(6 downto 0);signal L4_M1 : std_logic_vector(6 downto 0); signal L4_M2 : std_logic_vector(6 downto 0); signal L4_M3 : std_logic_vector(6 downto 0); signal R11_R12 : std_logic_vector(4 downto 0); --Register Outputsignal R12_R13 : std_logic_vector(4 downto 0);signal R13_M3 : std_logic_vector(4 downto 0);signal M1_A1 : std_logic_vector(11 downto 0); --Mul Outputsignal M2_A1 : std_logic_vector(11 downto 0);signal M3_A2 : std_logic_vector(11 downto 0);signal A1_A2 : std_logic_vector(12 downto 0); --ADD Outputsignal A2_R2 : std_logic_vector(13 downto 0);begin
--一共是四个名字L1,L2,L3,L4,但是6个独立的输出,所以6个Process,从左到右,从上到下命名
L1: process (D1,lad1) --Latch1
begin if(lad1 ='1') then L1_L4<=D1; end if;end process;L2: process (D1,lad2) --Latch2
begin if(lad2 ='1') then L2_L4<=D1; end if;end process;L3: process (D1,lad3) --Latch3
begin if(lad3 ='1') then L3_L4<=D1; end if;end process;L4: process (L1_L4,lad4) --Latch4
begin if(lad4 ='1') then L4_M1<=L1_L4; end if;end process;L5: process (L2_L4,lad4) --Latch5
begin if(lad4 ='1') then L4_M2<=L2_L4; end if;end process;L6: process (L3_L4,lad4) --Latch6
begin if(lad4 ='1') then L4_M3<=L3_L4; end if;end process;R1 : process (rst,clk) --Row Register1
beginif rst = '1' then  --OutputR11_R12 <= (others => '0');R12_R13 <= (others => '0');R13_M3 <= (others => '0');elsif rising_edge (clk) then --上升沿触发R11_R12 <= D2;R12_R13 <= R11_R12;R13_M3 <= R12_R13;end if;
end process;M1_A1 <= L4_M1*R11_R12; --MUX1
M2_A1 <= R12_R13*L4_M2; --MUX2
M3_A2 <= R13_M3*L4_M3; --MUX3A1_A2 <= EXT(M1_A1,13) + EXT(M2_A1,13);--ADD1
A2_R2 <= EXT(A1_A2,14) + EXT(M3_A2,14);--ADD2R2 : process (rst,clk)
begin
if rst = '1' then
q <= (others=> '0'); --Output
elsif rising_edge (clk) then --Input
q <= A2_R2;
end if;
end process;end behave;

这是TB代码:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;entity tb_DF isend entity;architecture behave of tb_DF issignal D1_sim  : std_logic_vector(6 downto 0);signal D2_sim  : std_logic_vector(4 downto 0);signal clk_sim     : std_logic;signal rst_sim     : std_logic;signal lad1_sim     : std_logic;signal lad2_sim     : std_logic;signal lad3_sim     : std_logic;signal lad4_sim     : std_logic;signal q_sim  : std_logic_vector(13 downto 0);   constant clk_period : time := 20 ns;   component dat isport (clk : in std_logic;rst : in std_logic;D1 : in std_logic_vector(6 downto 0); --7bitsD2 : in std_logic_vector(4 downto 0); --5bitsq : out std_logic_vector(13 downto 0); --14bitslad1: in std_logic; --Latch enable1, ENV=1,Q=D;Others Q=Q老师说Others不用写lad2: in std_logic; --Latch enable2lad3: in std_logic; --Latch enable3lad4: in std_logic --Latch enable4);
end component;begindat_inst : dat port map(D1  => D1_sim,clk => clk_sim,D2  => D2_Sim,rst => rst_sim,q   => q_sim,lad1=> lad1_sim,lad2=> lad2_sim,lad3=> lad3_sim,lad4=> lad4_sim);clk_proc:processbeginclk_sim <= '1';wait for clk_period/2;clk_sim <= '0'; wait for clk_period/2;end process;rst_proc:process --关于Rst的设定:先让它等于1,50ns后置0beginrst_sim <= '1';wait for 50 ns;rst_sim <= '0';wait;end process;lad_proc:process --关于lad的设定:先让它等于0, 50ns后置,挨个置1beginlad1_sim <= '0';lad2_sim <= '0';lad3_sim <= '0';lad4_sim <= '0';wait for 50 ns;lad1_sim <= '1';wait for 50 ns;lad2_sim <= '1';wait for 50 ns;lad3_sim <= '1';wait for 50 ns;lad4_sim <= '1';wait;end process;D1_sim <= "0000000","0000001" after 100 ns,    "0000011" after 500 ns;  D2_sim <= "00000","00001" after 100 ns,    "00011" after 500 ns; end behave;

这是仿真图:

VHDL例子说明Register寄存器,Multiplexer复用器,Add加法器,Latch锁存器相关推荐

  1. NASM: Register 寄存器

    NASM: Register 寄存器 文章目录 NASM: Register 寄存器 简介 参考 正文 寄存器分类 数据寄存器:`AX`.`BX`.`CX`.`DX` 高位 H 和低位 L:`AH`. ...

  2. C语言 --- Register 寄存器变量解析

    Register 寄存器变量 定义 register声明告诉编译器,它所申明的变量在程序中使用频率较高.其思想是:将register变量到寄存器中,这样可以使程序更小.执行速度更快.但是编译器可以忽略 ...

  3. register寄存器变量

    对register寄存器变量的总结如下: 1.寄存器变量可以用来优化加速c语言程序 2.声名只需在类型前多加register 即可,eg register int quick; (quick 就是一个 ...

  4. 锁存器 D触发器 寄存器区别 详细区别解释 Latch D Flipflop register

    1. 锁存器 定义: 对脉冲电平敏感,在时钟脉冲的电平作用下改变状态. 优点: 面积小.锁存器比FF快,所以用在地址锁存是很合适的,不过一定要保证所有的latch信号源的质量,锁存器在CPU设计中很常 ...

  5. [register]-TCR(Translation Control Register)寄存器详解

    快速链接: .

  6. 锁存器(latch)、触发器(flip-flop)、寄存器(register)的区别

    文章整理于网络: (一) 触发器:flipflop,锁存器:latch,寄存器:register锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值,尽当锁存器处于使能状态 ...

  7. 汇编:寄存器/register,基础概念

    文章目录 cpu register hard register general register 整数寄存器 SSE 寄存器 register file 伪寄存器 如果想将所有的信息放到一篇里,会发现 ...

  8. 锁存器(latch),触发器(flip-flop),寄存器(register)

    锁存器(Latch):锁存器是电平触发的存储单元,数据存储的动作(状态转换)取决于输入时钟(或者使能)信号的电平值,即当锁存器处于使能状态时,输出才会随着数据输入发生变化. 典型结构:SR-Latch ...

  9. 寄存器、cache、内存、硬盘之间的千丝万缕

    零.前言 首先看一下计算机的存储体系(Memory hierarchy)金字塔. 其次我们看看一个计算机的存储体系. 一.Register 寄存器是 CPU 的内部组成单元,是 CPU 运算时取指令和 ...

最新文章

  1. C语言---二分法搜索
  2. 特斯拉2021全年交付近百万辆,同比暴涨87%,马斯克:了不起!
  3. “金星生命论”乌龙事件新进展:那只是二氧化硫而已
  4. 【练习】c++用链栈实现计算器
  5. 让product description 成为mandatory field
  6. React Native之组件(Component)生命周期学习笔记
  7. sql跨表查询_跨表更新,看到自己写的SQL像个憨憨
  8. java post 请求体构建_java – 从HttpServletRequest获取POST请求体
  9. 【开发经验】在Flutter中使用dart的单例模式
  10. java 复杂表达式计算_我的计算器. 用java实现的. 可以支持复杂表达式
  11. 国内首款 FPGA 云服务器,性能是通用 CPU 服务器 30 倍以上
  12. 潘多拉固件设置ipv6_Phicomm-k2+pandorabox固件+PPPOE拨号+IPV6
  13. 从零开始学android:认识Android
  14. 深圳CPDA数据分析认证:数据分析知识很难学么?
  15. 使用JMeter进行简单的app接口测试
  16. 陈丹琦组最新力作:仅需dropout两次的对比学习框架
  17. 随笔20220506
  18. 【随笔】第一批走进大学的“00后”群体——纪念2015级西安交大少年班
  19. 去IOE是什么意思?
  20. ubuntu系统外连接两个显示器设置

热门文章

  1. curl检查端口_curl命令(测试连接命令)
  2. 孙鑫 java web_javaweb(code) 孙鑫老师的java web 开发详解的源代码 - 下载 - 搜珍网
  3. sql 字符串转数组_T-SQL象数组一样处理字符串、分割字符串
  4. 纯javescript制作随机生成象数块小案例
  5. mos管 rl_如何减小温度对MOS管阈值电压的影响?
  6. 毛姆《月亮与六便士》
  7. Git 基础 - 撤消操作
  8. MATLAB | 绘图复刻(九) | 泰勒图及组合泰勒图
  9. 在NVIDIA JetBot Nano小车上更新WIFI驱动
  10. MySQL繁忙度查询_mysql 慢查询优化