尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

nju实验一选择器

nju实验一选择器
📅 发布时间:2026/6/19 0:15:28
nju实验一选择器本次实验将介绍几种常用的多路选择器的设计方法;Verilog语言中的always语句块、if-else语句和case语句的使用等。最后请读者自行设计一个多路选择器,熟悉电路设计的基本流程和Quartus的使用。

实验一选择器

2选1多路选择器

.

├── constr
│ └── top.nxdc
├── csrc
│ └── test_our.cpp
├── Makefile
├── vsrc
│ └── top.v
├── top.v
├── vlt_dump.vcd
├── test_our.cpp
├── obj_dir
└── dump.vcd

├── constr

└── top.nxdc

top = topled (LD15, LD14, LD13, LD12, LD11, LD10, LD9, LD8, LD7, LD6, LD5, LD4, LD3, LD2, LD1, LD0)
rst BTNL

├── csrc

└── test_our.cpp

#include<nvboard.h>
#include<Vtop.h>static TOP_NAME dut;void nvboard_bind_all_pins(TOP_NAME* top);static void single_cycle(){dut.eval();
}int main(){nvboard_bind_all_pins(&dut);nvboard_init();while(1){nvboard_update();single_cycle();}}

1.头文件引入
●Vtop.h:由 Verilator 从 Verilog 文件(top.v)生成,包含仿真模型。
nvboard.h:提供 FPGA 信号的可视化(如按钮、LED、七段数码管等)。
2.全局变量定义
●dut (Device Under Test):表示被测的 Verilog 模块(TOP_NAME 通常是 Vtop,由 Verilator 生成)。
●static 限制作用域仅在当前文件。
3.NVBoard 引脚绑定
作用:将 Verilog 模块的输入/输出信号绑定到 NVBoard 的虚拟外设(按键、LED 等)。
实现:在另一个文件( top.nxdc
)中定义。
4.单时钟周期仿真
●功能:模拟一个完整的时钟周期:
●关键点:
○eval() 是 Verilator 生成的函数,会调用 Vtop___024root___eval 计算信号值。
5.主函数
●流程:
○初始化:
■绑定 Verilog 信号到 NVBoard 的虚拟外设。
■启动 NVBoard 的可视化界面。
○主循环:
■nvboard_update():读取用户输入(如按键按下)并更新 Verilog 输入信号(如 dut.a)。
■single_cycle():执行一个时钟周期的仿真,更新输出信号(如 dut.f 会驱动 LED)。

├── test_our.cpp

#include "verilated.h"
#include "verilated_vcd_c.h"
#include "obj_dir/Vtop.h"VerilatedContext* contextp = NULL;
VerilatedVcdC* tfp = NULL;static Vtop* top;void step_and_dump_wave(){top->eval();contextp->timeInc(1);tfp->dump(contextp->time());
}
void sim_init(){contextp = new VerilatedContext;tfp = new VerilatedVcdC;top = new Vtop;contextp->traceEverOn(true);top->trace(tfp, 0);tfp->open("dump.vcd");
}void sim_exit(){step_and_dump_wave();tfp->close();
}int main() {sim_init();top->s=0; top->a=0; top->b=0;  step_and_dump_wave(); top->b=1;  step_and_dump_wave(); top->a=1; top->b=0;  step_and_dump_wave();   top->b=1;  step_and_dump_wave(); top->s=1; top->a=0; top->b=0;  step_and_dump_wave(); top->b=1;  step_and_dump_wave();top->a=1; top->b=0;  step_and_dump_wave();top->b=1;  step_and_dump_wave();sim_exit();
}

1.头文件引入
●Vtop.h:由 Verilator 从 Verilog 文件(top.v)生成,包含仿真模型。
●verilated_vcd_c.h:提供生成 VCD 波形文件的功能,可用于 GTKWave 等工具查看信号时序。
2.全局变量定义
●contextp:管理仿真时间、调试信息等。
●tfp:用于写入 VCD 波形数据。
●top:Verilog 顶层模块的实例( module top)。
3.仿真初始化 (sim_init)
●功能:
○创建仿真上下文和 VCD 文件对象。
○实例化 Verilog 模块(Vtop)。
○配置信号追踪,生成 dump.vcd 文件。
4.单步仿真和波形记录 (step_and_dump_wave)
●eval():评估 Verilog 模块的逻辑(更新输出信号)。
●timeInc(1):推进仿真时间(单位由用户定义,这里为 1)。
●dump():将信号值写入 VCD 文件。
5.仿真结束处理 (sim_exit)
确保仿真结束时,最后一次信号状态被记录。
6.主函数 (main)
●功能:遍历输入信号 s、a、b 的所有组合(共 8 种情况),观察输出变化。
●每个步骤:
○设置输入信号(如 s=0, a=0, b=0)。
○调用 step_and_dump_wave() 执行仿真并记录波形。

├── vsrc

└── top.v

module my_and(a,b,c);input  a,b;output c;assign c = a & b;
endmodulemodule my_or(a,b,c);input  a,b;output c;assign c = a | b;
endmodulemodule my_not(a,b);input  a;output b;assign b = ~a;
endmodulemodule top(a,b,s,y);input  a,b,s;output y;wire l, r, s_n; // 内部网线声明my_not i1(.a(s), .b(s_n));        // 实例化非门,实现~smy_and i2(.a(s_n), .b(a), .c(l)); // 实例化与门,实现(~s&a)my_and i3(.a(s),   .b(b), .c(r)); // 实例化与门,实现(s&b)my_or  i4(.a(l),   .b(r), .c(y)); // 实例化或门,实现(~s&a)|(s&b)
endmodule

├── top.v

module top(a,b,s,y);input   a,b,s;        // 声明3个wire型输入变量a,b,和s,其宽度为1位。output  y;           // 声明1个wire型输出变量y,其宽度为1位。assign  y = (~s&a)|(s&b);  // 实现电路的逻辑功能。endmodule

波形仿真

(1)编译
verilator -Wall --trace -cc top.v --exe main.cpp
(2)生成可执行文件make -C obj_dir -f Vtop.mk Vtop
(3)生成波形
./obj_dir/Vtop
(4)查看波形
gtkwave dump.vcd

image

接入NVBoard

make
cd build
./top

image

4选1多路选择器

.

├── constr
│ └── top.nxdc
├── csrc
│ └── test_our.cpp
├── Makefile
├── vsrc
│ └── top.v
├── top.v
├── vlt_dump.vcd
├── test_our.cpp
├── obj_dir
└── dump.vcd

├── constr

└── top.nxdc

top=topy (LD0)
s (SW1, SW0)
a (SW5, SW4, SW3, SW2)

├── csrc

└── test_our.cpp

#include<nvboard.h>
#include<Vtop.h>static TOP_NAME dut;void nvboard_bind_all_pins(TOP_NAME* top);static void single_cycle(){dut.eval();
}int main(){nvboard_bind_all_pins(&dut);nvboard_init();while(1){nvboard_update();single_cycle();}}

├── test_our.cpp

#include "verilated.h"
#include "verilated_vcd_c.h"
#include "obj_dir/Vtop.h"VerilatedContext* contextp = NULL;
VerilatedVcdC* tfp = NULL;static Vtop* top;void step_and_dump_wave(){top->eval();contextp->timeInc(1);tfp->dump(contextp->time());
}
void sim_init(){contextp = new VerilatedContext;tfp = new VerilatedVcdC;top = new Vtop;contextp->traceEverOn(true);top->trace(tfp, 0);tfp->open("dump.vcd");
}void sim_exit(){step_and_dump_wave();tfp->close();
}int main() {sim_init();top->s=0b00;  top->a=0b1110;  step_and_dump_wave();top->a=0b0001;  step_and_dump_wave();top->s=0b01;  top->a=0b1101;  step_and_dump_wave();top->a=0b0010;  step_and_dump_wave();top->s=0b10;  top->a=0b1010;  step_and_dump_wave();top->a=0b0100;  step_and_dump_wave();top->s=0b11;  top->a=0b0111;  step_and_dump_wave();top->a=0b1001;  step_and_dump_wave();sim_exit();
}

├── vsrc

└── top.v

module top(a,b,s,y);input   a,b,s;        // 声明3个wire型输入变量a,b,和s,其宽度为1位。output  y;           // 声明1个wire型输出变量y,其宽度为1位。assign  y = (~s&a)|(s&b);  // 实现电路的逻辑功能。endmodule

├── top.v

module top(a,b,s,y);input   a,b,s;        // 声明3个wire型输入变量a,b,和s,其宽度为1位。output  y;           // 声明1个wire型输出变量y,其宽度为1位。assign  y = (~s&a)|(s&b);  // 实现电路的逻辑功能。endmodule

波形仿真

(1)编译
verilator -Wall --trace -cc top.v --exe main.cpp
(2)生成可执行文件make -C obj_dir -f Vtop.mk Vtop
(3)生成波形
./obj_dir/Vtop
(4)查看波形
gtkwave dump.vcd

image

接入NVBoard

make
cd build
./top

image

4选1多路选择器(2位)

.

├── constr
│ └── top.nxdc
├── csrc
│ └── test_our.cpp
├── Makefile
├── vsrc
│ └── top.v
├── top.v
├── vlt_dump.vcd
├── test_our.cpp
├── obj_dir
└── dump.vcd

├── constr

└── top.nxdc

top=topf (LD1, LD0)
y (SW1, SW0)x0 (SW3, SW2)
x1 (SW5, SW4)
x2 (SW7, SW6)
x3 (SW9, SW8)

├── csrc

└── test_our.cpp

#include<nvboard.h>
#include<Vtop.h>static TOP_NAME dut;void nvboard_bind_all_pins(TOP_NAME* top);static void single_cycle(){dut.eval();
}int main(){nvboard_bind_all_pins(&dut);nvboard_init();while(1){nvboard_update();single_cycle();}}

├── test_our.cpp

#include "verilated.h"
#include "verilated_vcd_c.h"
#include "obj_dir/Vtop.h"VerilatedContext* contextp = NULL;
VerilatedVcdC* tfp = NULL;static Vtop* top;void step_and_dump_wave(){top->eval();contextp->timeInc(1);tfp->dump(contextp->time());
}
void sim_init(){contextp = new VerilatedContext;tfp = new VerilatedVcdC;top = new Vtop;contextp->traceEverOn(true);top->trace(tfp, 0);tfp->open("dump.vcd");
}void sim_exit(){step_and_dump_wave();tfp->close();
}int main() {sim_init();top->y=0b00;  top->x0=0b11; top->x1=0b01; top->x2=0b00;  top->x3=0b10; step_and_dump_wave();top->x0=0b10; top->x1=0b01; top->x2=0b01;  top->x3=0b00; step_and_dump_wave();top->y=0b01;  top->x0=0b11; top->x1=0b01; top->x2=0b00;  top->x3=0b10; step_and_dump_wave();top->x0=0b10; top->x1=0b01; top->x2=0b01;  top->x3=0b00; step_and_dump_wave();top->y=0b10;  top->x0=0b11; top->x1=0b01; top->x2=0b00;  top->x3=0b10; step_and_dump_wave();top->x0=0b10; top->x1=0b01; top->x2=0b01;  top->x3=0b00; step_and_dump_wave();top->y=0b11;  top->x0=0b11; top->x1=0b01; top->x2=0b00;  top->x3=0b10; step_and_dump_wave();top->x0=0b10; top->x1=0b01; top->x2=0b01;  top->x3=0b00; step_and_dump_wave();sim_exit();
}

├── vsrc

└── top.v

module top(x0, x1, x2, x3, y, f);input  [1:0] x0; input  [1:0] x1; input  [1:0] x2; input  [1:0] x3; input  [1:0] y;  // 声明一个wire型输入变量s,其变量宽度是2位的。output reg [1:0] f;   // 声明一个2位reg型的输出变量y。always @ (*)case (y)2'b00: f = x0;2'b01: f = x1;2'b10: f = x2;2'b11: f = x3;default: f = 2'b00;endcaseendmodule
module top(a,b,s,y);input   a,b,s;        // 声明3个wire型输入变量a,b,和s,其宽度为1位。output  y;           // 声明1个wire型输出变量y,其宽度为1位。assign  y = (~s&a)|(s&b);  // 实现电路的逻辑功能。endmodule

├── top.v

module top(x0, x1, x2, x3, y, f);input  [1:0] x0; input  [1:0] x1; input  [1:0] x2; input  [1:0] x3; input  [1:0] y;  // 声明一个wire型输入变量s,其变量宽度是2位的。output reg [1:0] f;   // 声明一个2位reg型的输出变量y。always @ (*)case (y)2'b00: f = x0;2'b01: f = x1;2'b10: f = x2;2'b11: f = x3;default: f = 2'b00;endcaseendmodule
module top(a,b,s,y);input   a,b,s;        // 声明3个wire型输入变量a,b,和s,其宽度为1位。output  y;           // 声明1个wire型输出变量y,其宽度为1位。assign  y = (~s&a)|(s&b);  // 实现电路的逻辑功能。endmodule

波形仿真

(1)编译
verilator -Wall --trace -cc top.v --exe main.cpp
(2)生成可执行文件make -C obj_dir -f Vtop.mk Vtop
(3)生成波形
./obj_dir/Vtop
(4)查看波形
gtkwave dump.vcd

image

接入NVBoard

make
cd build
./top

image

相关新闻

  • AI浪潮下的新动向:协作、法律与未来工作
  • Day36:2025年10月26日,星期天,休息。
  • 成都合成树脂瓦使用寿命影响因素?成都佳英耀旺告诉你

最新新闻

  • 2026福田区搬家公司Top5榜单:服务范围全街道,适配本地人强推正规搬运公司 - 从来都是英雄出少年
  • 联邦学习如何重构心理App的临床可信度
  • 5步实战OpenCore Legacy Patcher:让老旧Mac焕发新生的完整指南
  • 终极ESP-Drone开源飞控教程:从零构建你的第一架智能无人机
  • 学充电桩维修有前途吗 - 湖南阳光技术
  • MC68VZ328 BGA焊接可靠性:为何官方推荐HASL而非ENIG表面处理?

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号