编码器
v
//定义时间尺度,1ns表示时间单位,1ps表示时间精度
//时间尺度是仿真里面最大的时间范围(总体时间范围)
//时间精度是仿真里面可以区分的最小时间间隔(类似打点计时器的最小间隔)
`timescale 1ns / 1ps
//关键字module 名称Encoder
module Encoder (
//这里表示有两个端口,一个sw,一个led
sw,
led
);
// 8位输入信号,从0~7表示8位宽度,输入端口
input [7:0] sw;
// 4位输出信号,连接到外部LED,输出
output [3:0] led;
// 使用wire类型定义一个内部信号signal,wire是在模块之间或者模块内部传递信号
wire [7:0] signal;
// 将输入信号sw直接赋值给signal,assign是关键字,表示这是一个连续赋值语句(sw变化,signal随之变化,反应是立刻的)
// 这里实际上就是一个中转变量
assign signal = sw;
// 两个准备输出的 组合变量
// 使用reg类型定义一个3位的内部变量code,用于存储编码值,这里reg表示是一个寄存器变量,,3位,名称code
reg [2:0] code;
// 使用reg类型定义一个有效位valid,表示输入信号是否有效(即是否只有一个位是1)
reg valid;
// 使用组合逻辑always块,因为@(*)表示对任何输入的变化都敏感,组合逻辑,类似switch
// @指定触发条件,语法关键字
// (*)是表示对模块内任何信号都铭感
// @(*) 这两个组合起来才有作用表示对所有信号敏感,@是语法结构
// begin表示always开始,对应下面的end
always @(*) begin
case (signal) // 根据输入信号signal的值进行编码
// 如果signal是8'b00000001,则编码为000,有效位为0(最前面的一位是有效位,这里用于指示信号是否有效,例如前面输入了不止1个1,说明输入了无效数据,则事项default)
8'b00000001: {valid, code} <= 4'b0000;
// 如果signal是8'b00000010,则编码为001,有效位为0
8'b00000010: {valid, code} <= 4'b0001;
// ...
8'b00000100: {valid, code} <= 4'b0010;
8'b00001000: {valid, code} <= 4'b0011;
8'b00010000: {valid, code} <= 4'b0100;
8'b00100000: {valid, code} <= 4'b0101;
8'b01000000: {valid, code} <= 4'b0110;
8'b10000000: {valid, code} <= 4'b0111;
//如果signal不是上述任何一个值(即超过一个位是1),则编码为无效,有效位为1
default: {valid, code} <= 4'b1000;
endcase
end
// 将valid和code组合后的4位值赋给输出LED
assign led = {valid, code};
endmodule
约束文件
# Switches
# set_property 指定引脚的关键字
# PACKAGE_PIN 表示FPGA芯片上物理引脚的位置。例如,V17表示FPGA上编号为V17的物理引脚。
# [get_ports {sw[0]}]:这是get_ports命令,它检索名为sw[0]的端口。方括号[]内的sw[0]表示端口名和位宽索引,这里指的是名为sw的端口的第一个位。
# IOSTANDARD:这是另一个set_property命令中的属性,定义了引脚使用的输入/输出电压标准。LVCMOS33是指低压CMOS标准,电压为3.3V。
# LVCMOS33:这是一个特定的I/O标准,表示该引脚按照低压CMOS 3.3V的标准来配置。
set_property
PACKAGE_PIN V17
[get_ports {sw[0]}]
set_property
IOSTANDARD
LVCMOS33
[get_ports {sw[0]}]
set_property PACKAGE_PIN V16 [get_ports {sw[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sw[1]}]
set_property PACKAGE_PIN W16 [get_ports {sw[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sw[2]}]
set_property PACKAGE_PIN W17 [get_ports {sw[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sw[3]}]
set_property PACKAGE_PIN W15 [get_ports {sw[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sw[4]}]
set_property PACKAGE_PIN V15 [get_ports {sw[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sw[5]}]
set_property PACKAGE_PIN W14 [get_ports {sw[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sw[6]}]
set_property PACKAGE_PIN W13 [get_ports {sw[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sw[7]}]
# LEDs
set_property PACKAGE_PIN U16 [get_ports {led[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]
set_property PACKAGE_PIN E19 [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}]
set_property PACKAGE_PIN U19 [get_ports {led[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[2]}]
set_property PACKAGE_PIN V19 [get_ports {led[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[3]}]
这里通过指定物理引脚将,sw和led相连接,
约束文件用于连接各个器件与物理引脚
而源文件用于编写逻辑设计(连接后具体进行什么样的操作,比如这里就是用来编码,连接后按照编码器的逻辑)
上述文件烧制到板
综合
生成比特流
选择硬件,丢到板里面实践
参考文献
教科书:Xilinx FPGA 数字电路课程设计