一生一芯 预学习阶段 双控开关接入nvboard

准备好双控开关的Verilog程序:

module on_off_switch(
  input a,
  input b,
  output f
);
  assign f = a ^ b;
endmodule

准备约束文件:

在将双控开关接入nvboard的过程中,参照以下GitHub项目的说明文档进行操作:

GitHub - NJU-ProjectN/nvboard: NJU Virtual Board

绑定引脚过程中遇到如下报错:

$ python3 $(NVBOARD_HOME)/scripts/auto_pin_bind.py $(NVBOARD_HOME)/example/switch/constr/top.nxdc $(NVBOARD_HOME)/example/switch/build/auto_bind.cpp

NVBOARD_HOME:未找到命令
NVBOARD_HOME:未找到命令
NVBOARD_HOME:未找到命令
python3: can't open file '/scripts/auto_pin_bind.py': [Errno 2] No such file or directory

经过查询,使用python3时,替换$(NVBOARD_HOME)不能使用 “)” ,而要使用 " } " 。

因此修改为:

$ python3 ${NVBOARD_HOME}/scripts/auto_pin_bind.py ${NVBOARD_HOME}/example/switch/constr/top.nxdc ${NVBOARD_HOME}/example/switch/build/auto_bind.cpp

可以正常运行。且正常保存文件。

Makefile文件可以正常使用源码中的

TOPNAME = top
NXDC_FILES = constr/top.nxdc	#约束文件路径
INC_PATH ?=	#?=的意义是,INC_PATH如果被未被定义,则为?=后的值,如果被定义过,则保持原来的值

VERILATOR = verilator
VERILATOR_CFLAGS += -MMD --build -cc  \
				-O3 --x-assign fast --x-initial fast --noassert

BUILD_DIR = ./build
OBJ_DIR = $(BUILD_DIR)/obj_dir	#OBJ_DIR = ./build/obj_dir
BIN = $(BUILD_DIR)/$(TOPNAME)	#BIN = ./build/top

default: $(BIN)	#终极目标为default,依赖./build/top

$(shell mkdir -p $(BUILD_DIR))

# constraint file
SRC_AUTO_BIND = $(abspath $(BUILD_DIR)/auto_bind.cpp)
$(SRC_AUTO_BIND): $(NXDC_FILES)
	python3 $(NVBOARD_HOME)/scripts/auto_pin_bind.py $^ $@

# project source
VSRCS = $(shell find $(abspath ./vsrc) -name "*.v")
# 在vsrc目录中寻找所有的.v文件,并保存在变量VSRCS中
CSRCS = $(shell find $(abspath ./csrc) -name "*.c" -or -name "*.cc" -or -name "*.cpp")
# 在csrc目录中寻找所有的.c/.cc/.cpp文件,并保存在变量CSRCS中
CSRCS += $(SRC_AUTO_BIND)
# 将auto_bind.cpp文件,追加在变量CSRCS中

# rules for NVBoard
include $(NVBOARD_HOME)/scripts/nvboard.mk
# 包含NVBoard相关Makelile规则

# rules for verilator
INCFLAGS = $(addprefix -I, $(INC_PATH))
CXXFLAGS += $(INCFLAGS) -DTOP_NAME="\"V$(TOPNAME)\""

$(BIN): $(VSRCS) $(CSRCS) $(NVBOARD_ARCHIVE)
	@rm -rf $(OBJ_DIR) # 生成新的对象之前,删除旧的对象文件
	$(VERILATOR) $(VERILATOR_CFLAGS) \
		--top-module $(TOPNAME) $^ \
		$(addprefix -CFLAGS , $(CXXFLAGS)) $(addprefix -LDFLAGS , $(LDFLAGS)) \
		--Mdir $(OBJ_DIR) --exe -o $(abspath $(BIN))

all: default

run: $(BIN)
	@$^

clean:
	rm -rf $(BUILD_DIR)

.PHONY: default all clean run

最后一个是sim.cpp

#include <nvboard.h>
#include <Von_off_switch.h>

static TOP_NAME dut;

void nvboard_bind_all_pins(TOP_NAME* top);


int main() {
  nvboard_bind_all_pins(&dut);
  nvboard_init();

  while(1) {
    nvboard_update();
    dut.eval();
  }
}

犯的错:

一开始没有在while循环中添加 dut.eval();  导致虽然能够出现界面,但是功能无法实现。也就是拨动开关LED不会亮。

dut.eval();时用来实时更新电路状态的调用。

这样就实现了双控开关的接入

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值