Add a picture for vga and update README.md
This commit is contained in:
parent
fbb53d9142
commit
8006d07f0d
59
README.md
59
README.md
|
@ -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的项目目录下编写makefile,makefile格式如下
|
||||
|
||||
```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代码!
|
||||
|
||||
#### 特技
|
||||
|
||||
|
|
|
@ -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
|
|
@ -0,0 +1,2 @@
|
|||
# 注意
|
||||
emu添加了新的图像rom文件,直接在$NBOARD_HOME运行 `make run` 会找不到该文件,因此需要cd到emu文件夹下
|
File diff suppressed because it is too large
Load Diff
|
@ -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
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
|
||||
// II. Hardware options
|
||||
|
||||
#define CLK_FREQ 50000000
|
||||
#define CLK_FREQ 1000000
|
||||
|
||||
// III. Experimental Function
|
||||
|
||||
|
|
Loading…
Reference in New Issue