Add a picture for vga and update README.md

This commit is contained in:
201220107-贺柄毓 2022-01-26 23:01:47 +08:00
parent fbb53d9142
commit 8006d07f0d
6 changed files with 327755 additions and 27 deletions

View File

@ -35,7 +35,7 @@
├── event.cpp
├── main.cpp
├── render.cpp
└── update.cpp -> $NBOARD_HOME/emu/update.cpp
└── uvga.cpp
```
#### 安装教程
@ -45,10 +45,28 @@
#### 使用说明
##### 使用Verilator
##### 编写makefie
使用Veriloator把Verilog转换成C++。
比如新建verilog文件`top.v`
你可以在任意运行在NVBOARD的项目目录下编写makefilemakefile格式如下
```makefile
# 需要手动指定项目目录
DIR = .
## 默认项目源码在项目目录的src文件夹下可手动指定
### SRC_DIR ?= $(DIR)/src
## 参与verilator编译的文件默认为$(SRC_DIR)下的所有*.v, *.c, *.cc, *.cpp文件可手动指定
### SRCS ?= $(shell find $(SRC_DIR) -name "*.v" -or -name "*.c" -or -name "*.cc" -or -name "*.cpp")
# 需要指定顶层模块名称
TOPNAME = top
# 需要在最后将NVBOARD的makefile包含进来
-include $(NBOARD_HOME)/Makefile
```
##### 编写项目文件
```
//top.v
@ -63,22 +81,16 @@ module top (
endmodule
```
这是一个简单的计数器。我们可以执行以下命令:
```
verilator -Wall -cc -build top.v
```
生成nboard需要的头文件`Vtop.h`)、静态链接库文件(`Vtop__ALL.a`、makefile文件`Vtop_classes.mk`)。
这是一个简单的计数器。你可以将其放入$SRC_DIR文件夹中
##### 编写两个辅助函数
接下来,你需要在`update.cpp`里编写两个辅助函数`update_input()`和`update_output()`
接下来你需要在src文件中新建一个c++代码文件(如`update.cpp`)。
在`emu`下有一个`update.cpp`的示例。
可以看到`input_map`和`output_map`,这两个`std::map`就是nboard和verilog通信的渠道。
当你在虚拟FPGA上改变输入比如按下`btnc`)的时候,
NVBOARD会在输入有了变化或时钟边沿处调用`dut_update()`当你在虚拟FPGA上改变输入比如按下`btnc`)的时候,
`input_map`里面对应的键值会随之更新,
接下来nvboard就会调用`update_input()`
你需要把`input_map`里面的键值赋值给模块的引脚,
@ -88,19 +100,20 @@ verilator -Wall -cc -build top.v
你也需要把模块的输出存入`output_map`
nvboard会把模块的输出同步到GUI上。
##### 让nvboard知道模块的名称
新建`topname.h`在这里把verilator生成的头文件包含进来再加一条宏定义
```
#define TOP_NAME Vtop
```
在`update.cpp`里,你需要编写以下内容
- 创建一个顶层模块对象`dut`
- 你需要手动编写辅助函数`dut_update()`,其行为如下:
1. 从`input_map`中更新顶层模块输入
2. 执行模块模拟过程`dut.eval();`
3. 像`output_map`中更新顶层模块输出
##### 体验虚拟FPGA
把头文件(`Vtop.h`)、静态链接库文件(`Vtop__ALL.a`、makefile文件`Vtop_classes.mk`)、辅助更新函数(`update.cpp`)、在`$NBOARD_HOME`下执行`make TOPNAME=top run`即可体验虚拟FPGA。
要改变某个按键或开关的状态,可以使用键盘快捷键,也可以用鼠标单击。
最后,你只需要在项目目录下执行
```shell
make run
```
命令即可在NVBOARD上模拟运行你自己的verilog代码
#### 特技

View File

@ -1,4 +1,13 @@
# 需要手动指定项目目录
DIR = .
## 默认项目源码在项目目录的src文件夹下可手动指定
### SRC_DIR ?= $(DIR)/src
## 参与verilator编译的文件默认为$(SRC_DIR)下的所有*.v, *.c, *.cc, *.cpp文件可手动指定
### SRCS ?= $(shell find $(SRC_DIR) -name "*.v" -or -name "*.c" -or -name "*.cc" -or -name "*.cpp")
# 需要指定顶层模块名称
TOPNAME = top
# 需要在最后将NVBOARD的makefile包含进来
-include $(NBOARD_HOME)/Makefile

2
emu/src/README.md Normal file
View File

@ -0,0 +1,2 @@
# 注意
emu添加了新的图像rom文件直接在$NBOARD_HOME运行 `make run` 会找不到该文件因此需要cd到emu文件夹下

327681
emu/src/picture.hex Executable file

File diff suppressed because it is too large Load Diff

View File

@ -19,14 +19,16 @@ test test1(
assign VGA_CLK = clk;
wire [9:0] h_addr;
wire [9:0] v_addr;
wire [23:0] vga_data;
vga_ctrl my_vga_ctrl(
.pclk(clk),
.reset(1'b0),
.vga_data(24'hff00ff),
/*
.vga_data(vga_data),
.h_addr(h_addr),
.v_addr(v_addr),
*/
.hsync(VGA_HSYNC),
.vsync(VGA_VSYNC),
.valid(VGA_BLANK_N),
@ -35,5 +37,26 @@ vga_ctrl my_vga_ctrl(
.vga_b(VGA_B)
);
vmem my_vmem(
.h_addr(h_addr),
.v_addr(v_addr[8:0]),
.vga_data(vga_data)
);
endmodule
module vmem (
input [9:0] h_addr,
input [8:0] v_addr,
output [23:0] vga_data
);
reg [23:0] vga_mem [524287:0];
initial begin
$readmemh("src/picture.hex", vga_mem);
end
assign vga_data = vga_mem[{h_addr, v_addr}];
endmodule

View File

@ -22,7 +22,7 @@
// II. Hardware options
#define CLK_FREQ 50000000
#define CLK_FREQ 1000000
// III. Experimental Function