nvboard: seperate real-time pins and non-real-time pins

* only update real-time pins every cycle
This commit is contained in:
Zihao Yu 2022-02-22 17:02:25 +08:00
parent 9340fec201
commit e2127f16b7
4 changed files with 61 additions and 43 deletions

View File

@ -1,4 +1,5 @@
input CLK
input RST
input BTNC
input BTNU
@ -6,8 +7,6 @@ input BTND
input BTNL
input BTNR
input RST
input SW0
input SW1
input SW2
@ -130,34 +129,34 @@ output SEG7F
output SEG7G
output DEC7P
output VGA_CLK
output VGA_VSYNC
output VGA_HSYNC
output VGA_BLANK_N
output VGA_R0
output VGA_R1
output VGA_R2
output VGA_R3
output VGA_R4
output VGA_R5
output VGA_R6
output VGA_R7
output VGA_G0
output VGA_G1
output VGA_G2
output VGA_G3
output VGA_G4
output VGA_G5
output VGA_G6
output VGA_G7
output VGA_B0
output VGA_B1
output VGA_B2
output VGA_B3
output VGA_B4
output VGA_B5
output VGA_B6
output VGA_B7
rt_output VGA_CLK
rt_output VGA_VSYNC
rt_output VGA_HSYNC
rt_output VGA_BLANK_N
rt_output VGA_R0
rt_output VGA_R1
rt_output VGA_R2
rt_output VGA_R3
rt_output VGA_R4
rt_output VGA_R5
rt_output VGA_R6
rt_output VGA_R7
rt_output VGA_G0
rt_output VGA_G1
rt_output VGA_G2
rt_output VGA_G3
rt_output VGA_G4
rt_output VGA_G5
rt_output VGA_G6
rt_output VGA_G7
rt_output VGA_B0
rt_output VGA_B1
rt_output VGA_B2
rt_output VGA_B3
rt_output VGA_B4
rt_output VGA_B5
rt_output VGA_B6
rt_output VGA_B7
input PS2_CLK
input PS2_DAT
rt_input PS2_CLK
rt_input PS2_DAT

View File

@ -5,10 +5,7 @@
#include <vga.h>
#include <keyboard.h>
#define NVBOARD_DIR_input false
#define NVBOARD_DIR_output true
void nvboard_init();
void nvboard_quit();
void nvboard_bind_pin(void *signal, bool is_output, int len, ...);
void nvboard_bind_pin(void *signal, bool is_rt, bool is_output, int len, ...);
void nvboard_update();

View File

@ -10,7 +10,20 @@ def inout_dict(file_path):
line = line.strip(' \n')
line = line.split(' ')
if len(line) == 2:
inout[line[1].replace(' ', '')] = line[0].replace(' ', '')
direction = line[0].replace(' ', '')
is_real_time_str = 'false'
is_output_str = ''
if direction.startswith('rt_'):
is_real_time_str = 'true'
direction = direction[3:]
if direction == "input":
is_output_str = 'false'
elif direction == "output":
is_output_str = 'true'
else:
print("invalid direction")
exit(-1)
inout[line[1].replace(' ', '')] = (is_output_str, is_real_time_str)
line = f.readline()
return inout
@ -54,7 +67,8 @@ def bind_pin(f, inout, signal, pin):
pin = pin.replace(' ', '')
check_pin_valid(inout, pin)
signal_addr = "&top->" + signal
write_dep(bind_f, "nvboard_bind_pin(" + signal_addr + ", " + "NVBOARD_DIR_" + inout[pin] + ", 1, " + pin + ");\n")
strs = inout[pin]
write_dep(bind_f, "nvboard_bind_pin(" + signal_addr + ", " + strs[1] + ", " + strs[0] + ", 1, " + pin + ");\n")
def bind_vec_pins(f, inout, signal, pins):
@ -62,7 +76,8 @@ def bind_vec_pins(f, inout, signal, pins):
pins[idx] = pins[idx].replace(' ', '')
check_pin_valid(inout, pins[idx])
signal_addr = "&top->" + signal
write_dep(bind_f, "nvboard_bind_pin(" + signal_addr + ", " + "NVBOARD_DIR_" + inout[pins[0]] + ", " + str(len(pins)))
strs = inout[pins[0]]
write_dep(bind_f, "nvboard_bind_pin(" + signal_addr + ", " + strs[1] + ", " + strs[0] + ", " + str(len(pins)))
for idx in range(len(pins)):
write_dep(bind_f, ", " + pins[idx])
write_dep(bind_f, ");\n")

View File

@ -35,6 +35,7 @@ typedef struct PinMap {
} PinMap;
static PinMap *pin_map = NULL;
static PinMap *rt_pin_map = NULL; // real-time pins
static SDL_Window *main_window = nullptr;
static SDL_Renderer *main_renderer = nullptr;
@ -85,7 +86,7 @@ static void nvboard_update_output(PinMap *p) {
}
void nvboard_update() {
for (auto p = pin_map; p != NULL; p = p->next) {
for (auto p = rt_pin_map; p != NULL; p = p->next) {
if (p->is_output) nvboard_update_output(p);
else nvboard_update_input(p);
}
@ -96,6 +97,12 @@ void nvboard_update() {
uint64_t now = get_time();
if (now - last > 1000000 / FPS) {
last = now;
for (auto p = pin_map; p != NULL; p = p->next) {
if (p->is_output) nvboard_update_output(p);
else nvboard_update_input(p);
}
SDL_RenderPresent(main_renderer);
int ev = read_event();
if (ev != -1) { update_components(main_renderer); }
@ -142,7 +149,7 @@ void nvboard_quit(){
SDL_Quit();
}
void nvboard_bind_pin(void *signal, bool is_output, int len, ...) {
void nvboard_bind_pin(void *signal, bool is_rt, bool is_output, int len, ...) {
PinMap *p = new PinMap;
p->is_output = is_output;
p->len = len;
@ -162,6 +169,6 @@ void nvboard_bind_pin(void *signal, bool is_output, int len, ...) {
va_end(ap);
p->signal = signal;
p->next = pin_map;
pin_map = p;
if (is_rt) { p->next = rt_pin_map; rt_pin_map = p; }
else { p->next = pin_map; pin_map = p; }
}