qq_57415822 2022-04-23 20:45 采纳率: 50%
浏览 70
已结题

需要理解8位运算器并其通过波形图验证

在做实验报告,跟着实验报告书做出了8位运算器但看不懂代码和波形图,希望简单解释一下其工作原理和波形图的使用

img

img

img

实验代码如下:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity exp_r_alu is
port(    clk                          :in std_logic;
        sw_bus,r4_bus,r5_bus,alu_bus :in std_logic;
        lddr1,lddr2,ldr4,ldr5        :in std_logic;
        m,cn                         :in std_logic;
        s                            :in std_logic_vector(3 downto 0);
        k                            :in std_logic_vector(7 downto 0);
        d                            :inout std_logic_vector(7 downto 0) );
end exp_r_alu;
architecture rtl of exp_r_alu is
signal dr1,dr2,r4,r5,aluout,bus_reg:std_logic_vector(7 downto 0);
signal sel:std_logic_vector(5 downto 0);
begin
ldreg:process(clk,lddr1,lddr2,ldr4,ldr5,bus_reg)
    begin
    if clk'event and clk='1' then
        if lddr1='1' then dr1<=bus_reg;
        elsif lddr2='1' then dr2<=bus_reg;
        elsif ldr4='1' then r4<=bus_reg;
        elsif ldr5='1' then r5<=bus_reg;
        end if;
    end if;
    end process;
alu:process(m,cn,s,dr1,dr2,sel,aluout)
   begin
   sel<=m & cn & s;
   case sel is
    when "000000" => aluout<=dr1+1;
    when "010000" => aluout<=dr1;
    when "100000" => aluout<=not dr1;
    when "000001" => aluout<=(dr1 or dr2)+1;
    when "010001" => aluout<=dr1 or dr2;
    when "100001" => aluout<=not(dr1 or dr2);
    when "000010" => aluout<=(dr1 or (not dr2))+1;
    when "010010" => aluout<=dr1 or (not dr2);
    when "100010" => aluout<=(not dr1)and dr2;
    when "000011" => aluout<=x"00";
    when "010011" => aluout<=aluout-1;
    when "100011" => aluout<=x"00";
    when "000100" => aluout<=dr1+(dr1 and (not dr2))+1;
    when "010100" => aluout<=dr1+(dr1 and (not dr2));
    when "100100" => aluout<=not (dr1 and dr2);
    when "000101" => aluout<=((dr1 or dr2 or dr1) and dr2) or x"01";
    when "010101" => aluout<=(dr1 or dr2)+(dr1 and(not dr2));
    when "100101" => aluout<=not dr2;
    when "000110" => aluout<=dr1-dr2;
    when "010110" => aluout<=dr1-dr2-1;
    when "100110" => aluout<=dr1 xor dr2;
    when "000111" => aluout<=dr1 and(not dr2);
    when "010111" => aluout<=(dr1 and (not dr2))-1;
    when "100111" => aluout<=dr1 and(not dr2);
    when "001000" => aluout<=dr1+(dr1 and dr2)+1;
    when "011000" => aluout<=dr1+(dr1 and dr2);
    when "101000" => aluout<=(not dr1)or dr2;
    when "001001" => aluout<=dr1+dr2+1;
    when "011001" => aluout<=dr1+dr2;
  
    when "101001" => aluout<=dr1 xnor dr2;
    when "001010" => aluout<=(dr1 or(not dr2))+(dr1 and dr2)+1;
    when "011010" => aluout<=(dr1 or(not dr2))+(dr1 and dr2);
    when "101010" => aluout<=dr2;
    when "001011" => aluout<=dr1 and dr2;
    when "011011" => aluout<=(dr1 and dr2)-1;
    when "101011" => aluout<=dr1 and dr2;
    when "001100" => aluout<=dr1+dr1+1;
    when "011100" => aluout<=dr1 or dr1;
    when "101100" => aluout<=x"01";
    when "001101" => aluout<=(dr1 or dr2)+dr1+1;
    when "011101" => aluout<=(dr1 or dr2)+dr1;
    when "101101" => aluout<=dr1 or(not dr2);
    when "001110" => aluout<=(dr1 or (not dr2))+dr1+1;
    when "011110" => aluout<=(dr1 or (not dr2))+dr1;
    when "101110" => aluout<=dr1 or dr2;
    when "001111" => aluout<=dr1;
    when "011111" => aluout<=dr1-1;
    when "101111" => aluout<=dr1;
    when others   => aluout<=x"ff";
end case;
end process;
bus_reg<=k      when sw_bus='0'  else
         r4     when r4_bus='0'  else
         r5     when r5_bus='0'  else
         aluout  when alu_bus='0' else 
        d;
d<=bus_reg when (sw_bus='0' or r4_bus='0' or r5_bus='0' or alu_bus='0') else
   (others=>'Z');    
end rtl;

波形图如下:

img

我想要达到的结果

因为写报告需要改动波形图并且给予改动后变化的解释,所以需要理解波形图个个元件的含义,希望能简单解释一下波形图每一行的含义,然后我自己改动一下,解释代码如果太长可以只解释波形图,

  • 写回答

3条回答 默认 最新

  • 歇歇 2022-04-24 20:46
    关注

    EP2C5T144C8N是一款Cyclone II FPGA, 8in速度等级144引脚TQFP封装. 该器件采用TSMC 90nm low-k介电常数工艺制造, 300mm晶圆, 确保快速可用性与低成本. 通过减少硅片面积, Cyclone II器件可以支持复杂的单芯片数字系统, 其成本可与ASIC相媲美. 它可提供相比90nm FPGA高60%的性能与一半的功耗. Cyclone II FPGA的低成本与优秀的优化特性, 使其成为广泛应用的理想解决方案. Cyclone II器件支持Nios II嵌入式处理器, 允许用户实施定制的嵌入式处理解决方案.
    文档:
    https://www.farnell.com/datasheets/2331889.pdf
    ————————————
    8位全加器可由2个4位的全加器串联组成,因此,先由一个半加器构成一个全加器,再由4个1位全加器构成一个4位全加器并封装成元器件。加法器间的进位可以串行方式实现,即将低位加法器的进位输出cout与相临的高位加法器的最低进位输入信号cin相接最高位的输出即为两数之和。最后一个Cout输出进位,D8显示。

    img


    时序仿真
      1、建立波形文件。为此设计建立一个波形测试文件。选择File项及其New,再选择右侧New窗中的vector Waveform file项,打开波形编辑窗。

      2、输入信号节点。在波形编辑窗的左方双击鼠标,在出现的窗口中选择Node finder,在弹出的窗口中首先点击List键,这时左窗口将列出该项设计所以利用中间的“=》”键将需要观察的信号选到右栏中。

      3设定仿真时间宽度。选择edit项及其End TIme选项,在End TIme选择窗中选择适当的仿真时间域,本次实验由于是八位的全加器,为避免延迟太大不利于显示,可将End TIme 设置为50ms,以便有足够长的观察时间和便于分析的波形仿真波形图。

      4、波形文件存盘。选择File项及其Save as选项,按OK键即可。存盘窗中波形文件名是默认的(这里是adder.scf所以直接存盘即可。

      5、运行仿真器。点击processing中的Start simulaTIon选项,如图是仿真运算完成后的时序波形。注意,刚进入如图所示的窗口时,应该将最下方的滑标拖向最左侧,以便可观察到初始波形。
    仿真波形图

    img


    分组后的波形图

    img


     1.首先为此工程建立一个放置与此工程相关的所有文件的文件夹,认为工作库(Work Library)。本项设计我的文件夹取名为8位全加器。
      2. 选FileNew,在弹的New对话框中选择Device Design Files 页的原理图文件编辑输入项Block diagram\Schematic File,画半加器原理图。 3. 另存自己的工程,将已设计好的图文件命名为:h_adder.bdf,并保存在此文件夹内。编译通过之后,将该半加器封装入库待设计1位全加器的时候调用。

    img

     4. 利用封装后的半加器画1位的全加器,并封装成元器件。

    img


     5. 利用封装后的1位全加器,将4个1位全加器串行,画4位的全加器,并封装成元器件。

    img


     6. 将2个4位全加器元器件串行,按照实验原理设计8位全加器。

      7.运行并调试成功。

      8. 锁引脚,

      9. 连接USB。

    img

    按START运行。

      VHDL源程序
      4位二进制并行加法器的源程序ADDER4B.VHD --ADDER4B.VHD LIBRARY IEEE;

      USE IEEE.STD_LOGIC_1164.ALL;

      USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY ADDER4B IS

      PORT(C4: IN STD_LOGIC;

      A4: IN STD_LOGIC_VECTOR(3 DOWNTO 0); B4: IN STD_LOGIC_VECTOR(3 DOWNTO 0);

      S4: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); CO4: OUT STD_LOGIC); END ENTITY ADDER4B;

      ARCHITECTURE ART OF ADDER4B IS

      SIGNAL S5: STD_LOGIC_VECTOR(4 DOWNTO 0); SIGNAL A5, B5: STD_LOGIC_VECTOR(4 DOWNTO 0); BEGIN

      A5《=‘0’& A4; B5《=‘0’& B4; S5《=A5+B5+C4;

      S4《=S5(3 DOWNTO 0); CO4《=S5(4);

      END ARCHITECTURE ART; --ADDER8B.VHD LIBRARY IEEE;

      USE IEEE.STD_LOGIC_1164.ALL;

      USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY ADDER8B IS

      PORT(C8:IN STD_LOGIC;

      A8:IN STD_LOGIC_VECTOR(7 DOWNTO 0); B8:IN STD_LOGIC_VECTOR(7 DOWNTO 0); S8:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); CO8:OUT STD_LOGIC); END ENTITY ADDER8B;

      ARCHITECTURE ART OF ADDER8B IS COMPONENT ADDER4B IS PORT(C4:IN STD_LOGIC;

      A4:IN STD_LOGIC_VECTOR(3 DOWNTO 0); B4:IN STD_LOGIC_VECTOR(3 DOWNTO 0); S4:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); CO4:OUT STD_LOGIC); END COMPONENT ADDER4B; SIGNAL SC:STD_LOGIC; BEGIN

      U1:ADDER4B

      PORT MAP(C4=》C8,A4=》A8(3 DOWNTO 0),B4=》B8(3 DOWNTO 0), S4=》S8(3 DOWNTO 0),CO4=》SC); U2:ADDER4B

      PORT MAP(C4=》SC,A4=》A8(7 DOWNTO 4),B4=》B8(7 DOWNTO 4), S4=》S8(7 DOWNTO 4),CO4=》CO8); END ARCHITECTURE ART;

      在程序调试和仿真时,我们要使用自底向上的方法进行,也就是对于含有多个模块的设计,我们要先从底层模块进行调试和仿真,再进行更高层次模块的调试和仿真,最后进行顶层模块的调试与仿真。下图分别使用Quartus II 8.0对ADDER4B和ADDER8B进行时序仿真的结果。
    ADDER4B的时序仿真结果

    img


     ADDER8B的时序仿真结果

    img

    评论

报告相同问题?

问题事件

  • 系统已结题 5月1日
  • 赞助了问题酬金5元 4月24日
  • 创建了问题 4月23日

悬赏问题

  • ¥15 请问为什么我配置IPsec后PC1 ping不通 PC2,抓包出来数据包也并没有被加密
  • ¥200 求博主教我搞定neo4j简易问答系统,有偿
  • ¥15 nginx的使用与作用
  • ¥100 关于#VijeoCitect#的问题,如何解决?(标签-ar|关键词-数据类型)
  • ¥15 一个矿井排水监控系统的plc梯形图,求各程序段都是什么意思
  • ¥15 ensp路由器启动不了一直报#
  • ¥50 安卓10如何在没有root权限的情况下设置开机自动启动指定app?
  • ¥15 ats2837 spi2从机的代码
  • ¥200 wsl2 vllm qwen1.5部署问题
  • ¥100 有偿求数字经济对经贸的影响机制的一个数学模型,弄不出来已经快要碎掉了