从零开始的FPGA
实验 1:桶形移位寄存器设计笔记
一、 硬件定义:ENTITY(外壳引脚)
在 VHDL 中,ENTITY 描述了电路的外部接口,相当于定义了芯片的引脚。
-
端口说明
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 灯显示移位结果。 -
关键语法:STD_LOGIC_VECTOR
STD_LOGIC: 代表单根导线,传输标准逻辑电平信号(如 '0' 或 '1')。
VECTOR: 意为“向量”,即排线,用于处理多位并行数据。
(7 DOWNTO 0): 采用“大端序”,左侧第 7 位为最高位(MSB),右侧第 0 位为最低位(LSB)。
二、 电路逻辑:ARCHITECTURE(内核连线)
采用级联移位设计,通过三级结构组合出最终的移位距离。
-
级联三关
第一级 (1st Shifter): 检查shift(0)。若为 '1',数据左移 1 位,空出的位补 '0'。结果存入临时变量temp1。
第二级 (2nd Shifter): 检查shift(1)。若为 '1',将temp1的结果再左移 2 位。结果存入temp2。
第三级 (3rd Shifter): 检查shift(2)。若为 '1',将temp2的结果再左移 4 位。最终结果输出到引脚outp。 -
核心语法: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(逻辑验证)
仿真是在不下载到板子的情况下,通过波形图验证电路逻辑是否正确。
- 仿真步骤
生成网表: 执行菜单 Processing -> Generate Functional Simulation Netlist。
导入节点: 在波形编辑器中导入 inp、shift、outp 信号。
设置激励: 给 inp 赋一个特征值。在时间轴上改变 shift 的二进制值,观察输出 outp 的跳变。
- 结果分析

直通检查: 当 shift 为 000 时,outp 应与 inp 完全相同。
位移检查: 当 shift 为 001(二进制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(逻辑验证)
结果分析



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

浙公网安备 33010602011771号