从零开始的FPGA

实验 1:桶形移位寄存器设计笔记

一、 硬件定义:ENTITY(外壳引脚)

在 VHDL 中,ENTITY 描述了电路的外部接口,相当于定义了芯片的引脚。

  1. 端口说明
    inp (IN STD_LOGIC_VECTOR(7 DOWNTO 0)): 8位原始输入信号,对应开发板上的 8 个拨码开关。
    shift (IN STD_LOGIC_VECTOR(2 DOWNTO 0)): 3位移位控制信号,通过二进制组合可表示 0 ~ 7 位的位移。
    outp (OUT STD_LOGIC_VECTOR(7 DOWNTO 0)): 8位输出信号,连接至 8 个 LED 灯显示移位结果。

  2. 关键语法:STD_LOGIC_VECTOR
    STD_LOGIC: 代表单根导线,传输标准逻辑电平信号(如 '0' 或 '1')。
    VECTOR: 意为“向量”,即排线,用于处理多位并行数据。
    (7 DOWNTO 0): 采用“大端序”,左侧第 7 位为最高位(MSB),右侧第 0 位为最低位(LSB)。


二、 电路逻辑:ARCHITECTURE(内核连线)

采用级联移位设计,通过三级结构组合出最终的移位距离。

  1. 级联三关
    第一级 (1st Shifter): 检查 shift(0)。若为 '1',数据左移 1 位,空出的位补 '0'。结果存入临时变量 temp1
    第二级 (2nd Shifter): 检查 shift(1)。若为 '1',将 temp1 的结果再左移 2 位。结果存入 temp2
    第三级 (3rd Shifter): 检查 shift(2)。若为 '1',将 temp2 的结果再左移 4 位。最终结果输出到引脚 outp

  2. 核心语法:VARIABLE(变量)
    声明位置: 必须声明在 PROCESS 关键字与 BEGIN 之间(如 temp1, temp2)。
    特性: 赋值使用 :=,在进程(Process)内立即生效,非常适合存储级联过程中的中间逻辑结果。


三、 完整实验代码实现

LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY ex1 IS
PORT (
    inp: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
    shift: IN STD_LOGIC_VECTOR(2 DOWNTO 0);
    outp: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END ex1;

ARCHITECTURE behavior OF ex1 IS
BEGIN
    PROCESS (inp, shift)
        VARIABLE temp1: STD_LOGIC_VECTOR(7 DOWNTO 0);
        VARIABLE temp2: STD_LOGIC_VECTOR(7 DOWNTO 0);
    BEGIN
        ---- 第一级:移1位 ----
        IF (shift(0) = '0') THEN
            temp1 := inp;
        ELSE
            temp1(0) := '0';
            FOR i IN 1 TO 7 LOOP
                temp1(i) := inp(i-1);
            END LOOP;
        END IF;

        ---- 第二级:移2位 ----
        IF (shift(1) = '0') THEN
            temp2 := temp1;
        ELSE
            FOR i IN 0 TO 1 LOOP
                temp2(i) := '0';
            END LOOP;
            FOR i IN 2 TO 7 LOOP
                temp2(i) := temp1(i-2);
            END LOOP;
        END IF;

        ---- 第三级:移4位 ----
        IF (shift(2) = '0') THEN
            outp <= temp2;
        ELSE
            FOR i IN 0 TO 3 LOOP
                outp(i) <= '0';
            END LOOP;
            FOR i IN 4 TO 7 LOOP
                outp(i) <= temp2(i-4);
            END LOOP;
        END IF;
    END PROCESS;
END behavior;

四、 功能仿真:VWF(逻辑验证)

仿真是在不下载到板子的情况下,通过波形图验证电路逻辑是否正确。

  1. 仿真步骤

生成网表: 执行菜单 Processing -> Generate Functional Simulation Netlist
导入节点: 在波形编辑器中导入 inpshiftoutp 信号。
设置激励: 给 inp 赋一个特征值。在时间轴上改变 shift 的二进制值,观察输出 outp 的跳变。

  1. 结果分析
    image

直通检查: 当 shift000 时,outp 应与 inp 完全相同。
位移检查: 当 shift001(二进制1)时,outp 的波形应显示数据向高位移动了 1 位。
补零检查: 观察波形低位,确认移位后空出的部分是否如代码所写正确变为了低电平('0')。

实验 2:桶形移位寄存器设计笔记

一、 硬件定义:ENTITY(外壳引脚)

在 VHDL 中,ENTITY 描述了电路的外部接口,相当于定义了芯片的引脚。

1. 端口与参数说明
n (GENERIC(n: INTEGER := 7)): 泛型参数,用来设定输入数据的最高位编号。这里默认设定为 7,即总共处理 8 位数据。
a, b (IN SIGNED(n DOWNTO 0)): 8 位有符号数原始输入信号,分别对应开发板上的两组拨码开关(输入 a 对应 SW[17:10],输入 b 对应 SW[7:0])。
x1, x2, x3 (OUT STD_LOGIC): 3 位独立输出信号,连接至开发板上的红色 LED 灯以显示比较结果(x1 亮代表 a>b,x2 亮代表 a=b,x3 亮代表 a<b)。

2. 关键语法解析
GENERIC: 意为“泛型”,用于定义模块内部的通用常量(通常用来定义位宽)。这样写的好处是代码具有可重用性,后续只需修改 n 的值,就能轻松把8位比较器变成16位或32位比较器。
SIGNED: 意为“有符号数”向量。它不仅是排线,还赋予了数据数学意义:系统在处理时,会自动将最左侧的最高位(第 7 位)视为符号位(以补码形式表示正负)来参与数值的真实大小比较。注意:使用此类型前必须引入 ieee.std_logic_arith.all 程序包。
STD_LOGIC: 代表单根导线,传输标准逻辑电平信号(如 '0' 熄灭 或 '1' 点亮),在这里用作标志位的输出。
(n DOWNTO 0): 采用“大端序”,以 (7 DOWNTO 0) 为例,左侧第 7 位为最高位(MSB,在这里也是符号位),右侧第 0 位为最低位(LSB)。


二、 电路逻辑:ARCHITECTURE(内核连线)


三、 完整实验代码实现

--- std_logic_arith.all是有符号数)数据类型以及大小比较运算符
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
--------------------------------
entity ex21 is
	generic(
		n: integer := 7
	);
	port(
		a,b: in signed(n downto 0);
		x1,x2,x3: out std_logic
	);
end ex21;
----------------------------------
architecture signed of ex21 is

begin
	x1<='0'when a<b else'1';
	x2<='0'when a=b else'1';
	x3<='0'when a>b else'1';
end signed;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;


entity ex22 is
	generic(n: integer := 7);
	port(
			a,b: in unsigned (n downto 0);
			x1,x2,x3: out std_logic
	);
end ex22;

architecture unsigneda of ex22 is

begin
	x1<='0'when a<b else'1';
	x2<='0'when a=b else'1';
	x3<='0'when a>b else'1';
end unsigneda;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;

entity ex23 is
generic( n : integer := 7);
port(
a,b : in std_logic_vector (n downto 0);
x1,x2,x3 : out std_logic
);
end ex23;

architecture unsignedb of ex23 is

begin

	x1<='0'when a<b else'1';
	x2<='0'when a=b else'1';
	x3<='0'when a>b else'1';
	
end unsignedb;

四、 功能仿真:VWF(逻辑验证)

结果分析
image
image
image

直通检查: 当 shift000 时,outp 应与 inp 完全相同。
位移检查: 当 shift001(二进制1)时,outp 的波形应显示数据向高位移动了 1 位。
补零检查: 观察波形低位,确认移位后空出的部分是否如代码所写正确变为了低电平('0')。

posted @ 2026-05-15 16:21  无敌烤肉大王  阅读(10)  评论(0)    收藏  举报