【Xilinx FPGA】随笔 - 编码器代码

编码器

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 数字电路课程设计

END

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_千思_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值