diff --git a/.pic/Labs/board files/nexys_rf1.jpg b/.pic/Labs/board files/nexys_rf1.jpg deleted file mode 100644 index 3e2c492..0000000 Binary files a/.pic/Labs/board files/nexys_rf1.jpg and /dev/null differ diff --git a/.pic/Labs/board files/nexys_rf2.jpg b/.pic/Labs/board files/nexys_rf2.jpg deleted file mode 100644 index 0e9c72f..0000000 Binary files a/.pic/Labs/board files/nexys_rf2.jpg and /dev/null differ diff --git a/.pic/Labs/board files/nexys_rf3.jpg b/.pic/Labs/board files/nexys_rf3.jpg deleted file mode 100644 index e3008d9..0000000 Binary files a/.pic/Labs/board files/nexys_rf3.jpg and /dev/null differ diff --git a/.pic/Labs/board files/nexys_rf4.jpg b/.pic/Labs/board files/nexys_rf4.jpg deleted file mode 100644 index 66ec03b..0000000 Binary files a/.pic/Labs/board files/nexys_rf4.jpg and /dev/null differ diff --git a/.pic/Labs/board files/nexys_rf5.jpg b/.pic/Labs/board files/nexys_rf5.jpg deleted file mode 100644 index be36bb2..0000000 Binary files a/.pic/Labs/board files/nexys_rf5.jpg and /dev/null differ diff --git a/.pic/Labs/board files/nexys_rf_riscv_control.drawio.svg b/.pic/Labs/board files/nexys_rf_riscv_control.drawio.svg new file mode 100644 index 0000000..59af08a --- /dev/null +++ b/.pic/Labs/board files/nexys_rf_riscv_control.drawio.svg @@ -0,0 +1,4 @@ + + + +
write_data_i
wa
ra2
ra1
rd2
addr_en
we
rd1
\ No newline at end of file diff --git a/.pic/Labs/board files/nexys_rf_riscv_read.drawio.svg b/.pic/Labs/board files/nexys_rf_riscv_read.drawio.svg new file mode 100644 index 0000000..052a018 --- /dev/null +++ b/.pic/Labs/board files/nexys_rf_riscv_read.drawio.svg @@ -0,0 +1,4 @@ + + + +
addr_en
1
0
1
1
1
0
0
0
0
0
ra2
ra1
\ No newline at end of file diff --git a/.pic/Labs/board files/nexys_rf_riscv_structure.drawio.svg b/.pic/Labs/board files/nexys_rf_riscv_structure.drawio.svg new file mode 100644 index 0000000..30c8241 --- /dev/null +++ b/.pic/Labs/board files/nexys_rf_riscv_structure.drawio.svg @@ -0,0 +1,4 @@ + + + +
nexys_rf_riscv
semseg
write_data_i
read_data1_o
write_enable_i
write_addr_i
read_addr2_i
read_addr1_i
rf_riscv
read_data2_o
EN
ADDR

clk_i

clk_i

rd1
rd2
16
/
read_addr2_i
[9:5]
5
/
[4:0]
5
/
[9:5]
5
/
[14:10]
16
/
rd2
rd1
16
/
[15:0]
write_addr_i
[4:0]
[14:0]
15
/
15
/
/
5
5
/
/
5
read_addr1_i
[14:10]
/
16
[15:0]
\ No newline at end of file diff --git a/.pic/Labs/board files/nexys_rf_riscv_write_addr_5.drawio.svg b/.pic/Labs/board files/nexys_rf_riscv_write_addr_5.drawio.svg new file mode 100644 index 0000000..139d98d --- /dev/null +++ b/.pic/Labs/board files/nexys_rf_riscv_write_addr_5.drawio.svg @@ -0,0 +1,4 @@ + + + +
addr_en
1
1
0
\ No newline at end of file diff --git a/.pic/Labs/board files/nexys_rf_riscv_write_addr_6.drawio.svg b/.pic/Labs/board files/nexys_rf_riscv_write_addr_6.drawio.svg new file mode 100644 index 0000000..90ee94f --- /dev/null +++ b/.pic/Labs/board files/nexys_rf_riscv_write_addr_6.drawio.svg @@ -0,0 +1,4 @@ + + + +
addr_en
1
0
1
\ No newline at end of file diff --git a/.pic/Labs/board files/nexys_rf_riscv_write_data_1234.drawio.svg b/.pic/Labs/board files/nexys_rf_riscv_write_data_1234.drawio.svg new file mode 100644 index 0000000..5f6ffdf --- /dev/null +++ b/.pic/Labs/board files/nexys_rf_riscv_write_data_1234.drawio.svg @@ -0,0 +1,4 @@ + + + +
0
0
1
1
0
0
0
1
0
0
1
0
0
0
we
1
0
\ No newline at end of file diff --git a/.pic/Labs/board files/nexys_rf_riscv_write_data_5678.drawio.svg b/.pic/Labs/board files/nexys_rf_riscv_write_data_5678.drawio.svg new file mode 100644 index 0000000..5e2332e --- /dev/null +++ b/.pic/Labs/board files/nexys_rf_riscv_write_data_5678.drawio.svg @@ -0,0 +1,4 @@ + + + +
0
1
1
1
1
0
0
1
1
0
1
0
1
0
we
0
0
\ No newline at end of file diff --git a/Labs/03. Register file and memory/board files/README.md b/Labs/03. Register file and memory/board files/README.md index f4d6edf..ce89047 100644 --- a/Labs/03. Register file and memory/board files/README.md +++ b/Labs/03. Register file and memory/board files/README.md @@ -1,39 +1,101 @@ # Проверка работы регистрового файла на ПЛИС -Если вы не понимаете, что лежит в этой папке, или если надо вспомнить, как прошить ПЛИС, можно воспользоваться [`этой инструкцией`](../../../Vivado%20Basics/How%20to%20program%20an%20fpga%20board.md) +После того, как вы проверили на моделировании регистровый файл, вам необходимо проверить его работу на прототипе в ПЛИС. -Для работы с регистровым файлом, необходимо выставлять сигналы адресов и данных. -У платы недостаточно переключателей, для такого количества входов регистрового файла, поэтому подача сигналов на вход происходит в несколько этапов. -Сперва можно ввести один из адресов регистрового файла (`A1`/`A2`/`A3`). Ввод осуществляется через `SW[4:0]`. Для того, чтобы выставить введенный адрес на какой-то из входов адреса, необходимо нажать одну из следующих кнопок: +Инструкция по реализации прототипа описана [здесь](../../../Vivado%20Basics/How%20to%20program%20an%20fpga%20board.md). -1. `BTNL` чтобы выставить значение с `SW[4:0]` на `A1` -2. `BTNC` чтобы выставить значение с `SW[4:0]` на `A2` -3. `BTNR` чтобы выставить значение с `SW[4:0]` на `A3` +На _рис. 1_ представлена схема прототипа в ПЛИС. -(расположение кнопок смотри на изображениях ниже). +![../../../.pic/Labs/board%20files/nexys_rf_riscv_structure.drawio.svg](../../../.pic/Labs/board%20files/nexys_rf_riscv_structure.drawio.svg) -После выставления адресов, переключатели можно использовать в качестве ввода первых шестнадцате бит данных. Для записи введенных данных по адресу `A3` используется кнопка `BTND`, для чтения данных по адресам `A1`, `A2` (с выводом результатов чтения на семисегментные индикаторы) используется кнопка `BTNU`. +_Рисунок 1. Структурная схема модуля `nexys_rf_riscv`._ -Управление регистровым файлом. +## Описание используемой периферии -![../../../.pic/Labs/board%20files/nexys_rf1.jpg](../../../.pic/Labs/board%20files/nexys_rf1.jpg) +Периферия показана на _рис. 2_. -Ниже показан пример последовательности действий для работы с платой. +![../../../.pic/Labs/board%20files/nexys_rf_riscv_control.drawio.svg](../../../.pic/Labs/board%20files/nexys_rf_riscv_control.drawio.svg) -Установка значения `5'b10101` на входы `A1`,`A2`,`A3`. +_Рисунок 2. Периферия, доступная прототипу._ -![../../../.pic/Labs/board%20files/nexys_rf2.jpg](../../../.pic/Labs/board%20files/nexys_rf2.jpg) +- ### Переключатели и кнопки. -Запись информации по адресу А3. + Для работы с регистровым файлом необходимо выставлять сигналы адресов и данных. + У платы недостаточно переключателей для такого количества входов регистрового файла, поэтому адреса и данные задаются одним источником ввода: -![../../../.pic/Labs/board%20files/nexys_rf3.jpg](../../../.pic/Labs/board%20files/nexys_rf3.jpg) + 1. Ввод **адресов** (`read_addr1_i`/`read_addr2_i`/`write_addr_i`) регистрового файла осуществляется через переключатели `SW[14:0]`. Соответствие следующее: -Чтение по адресам А1 и А2. + - `SW[ 4: 0]` — `write_addr_i` + - `SW[ 9: 5]` — `read_addr2_i` + - `SW[14:10]` — `read_addr1_i` -![../../../.pic/Labs/board%20files/nexys_rf4.jpg](../../../.pic/Labs/board%20files/nexys_rf4.jpg) + Для того чтобы выставить введенные адреса на входные порты регистрового файла, необходимо нажать кнопку `BTND` (`addr_en` на _рис. 2_). Таким образом, происходит запоминание адресов в элемент памяти. + 1. Ввод **данных** (`write_data_i`) регистрового файла осуществляется через переключатели `SW[15:0]`. Таким образом, можно выставить только младшие 16 бит данных. Для записи введенных данных по адресу `write_addr_i` используется кнопка `BTNR` (`we` на _рис. 2_). +- ### Светодиоды -Для того чтобы считать информацию по любому адресу, достаточно установить желаемый адрес на один из портов чтения и нажать на кнопку чтения. + Светодиоды `LED[14:0]` отображают адреса (`read_addr1_i`/`read_addr2_i`/`write_addr_i`), которые выставлены в данный момент на порты регистрового файла: -![../../../.pic/Labs/board%20files/nexys_rf5.jpg](../../../.pic/Labs/board%20files/nexys_rf5.jpg) + - `LED[ 4: 0]` — `write_addr_i` + - `LED[ 9: 5]` — `read_addr2_i` + - `LED[14:10]` — `read_addr1_i` -Попробуйте записать информацию в нулевой регистр, затем по другим адресам, после чего считайте записанную информацию и убедитесь, что она соответствует той, которую вы записывали (с учетом особенностей регистрового файла RISC-V). +- ### Семисегментные индикаторы + + На левом блоке семисегментных индикаторов (индикаторы 7-4) отображется значение младших 16-ти бит порта `read_data1_o`, а на правом блоке семисегментных индикаторов (индикаторы 3-0) отображается значение младших 16-ти бит порта `read_data2_o`. + + Числа отображаются в **шестнадцатеричном** формате. + +## Выполнение операций с регистровым файлом на прототипе + +Доступные операции: запись, чтение. + +- ### Запись + + Рассмотрим последовательность действий, которые надо осуществить для записи в регистровый файл, на примере. + + 1. Запишем значение `0x1234` в регистр `5`. + + 1. Сразу после прошивки, как видно по негорящим светодиодам, на портах регистрового файла выставлены нулевые адреса. Нам нужно изменить адрес записи, поэтому выставим на переключателях значение `5` и нажмем кнопку `BTND` (см. _рис. 3_). + + ![../../../.pic/Labs/board%20files/nexys_rf_riscv_write_addr_5.drawio.svg](../../../.pic/Labs/board%20files/nexys_rf_riscv_write_addr_5.drawio.svg) + + _Рисунок 3. Выставление адреса `5` на порт `write_addr_i` регистрового файла._ + + Обратите внимание: на светодиодах сразу после нажатия кнопки отображается адрес `5`. + 1. Чтобы записать данные в указанный (пятый) регистр, выставим на переключателях значение `0x1234` и нажмем кнопку `BTNR` (см. _рис. 4_). + + ![../../../.pic/Labs/board%20files/nexys_rf_riscv_write_data_1234.drawio.svg](../../../.pic/Labs/board%20files/nexys_rf_riscv_write_data_1234.drawio.svg) + + _Рисунок 4. Запись `0x1234` в регистр `5`._ + + 1. Запишем значение `0x5678` в регистр `6`. + + 1. Выставим на блок переключателей, отвечающих за порт записи, значение `6` и нажмем кнопку `BTND` (см. _рис. 5_). + + ![../../../.pic/Labs/board%20files/nexys_rf_riscv_write_addr_6.drawio.svg](../../../.pic/Labs/board%20files/nexys_rf_riscv_write_addr_6.drawio.svg) + + _Рисунок 5. Выставление адреса `6` на порт `write_addr_i` регистрового файла._ + + Обратите внимание: на светодиодах сразу после нажатия кнопки отображается адрес `6`. + 1. Чтобы записать данные в указанный (шестой) регистр, выставим на переключателях значение `0x5678` и нажмем кнопку `BTNR` (см. _рис. 6_). + + ![../../../.pic/Labs/board%20files/nexys_rf_riscv_write_data_5678.drawio.svg](../../../.pic/Labs/board%20files/nexys_rf_riscv_write_data_5678.drawio.svg) + + _Рисунок 6. Запись `0x5678` в регистр `6`._ + +- ### Чтение + + Рассмотрим последовательность действий, которые надо осуществить для чтения из регистрового файла, на примере. Прочитаем из регистров `5` и `6` заранее записанные значения `0x1234` и `0x5678` соответственно и выведем его на оба блока семисегментных индикаторов 7-0 и 3-0. + + Выставим значение `5` и `6` на блоки переключателей `ra1` и `ra2` (см. _рис. 2_) соответственно, и нажмем кнопку `BTND`, чтобы обновить адрес значением с переключателей (см. _рис. 7_). + + ![../../../.pic/Labs/board%20files/nexys_rf_riscv_read.drawio.svg](../../../.pic/Labs/board%20files/nexys_rf_riscv_read.drawio.svg) + + _Рисунок 7. Чтение из регистров `5` и `6`._ + + Обратите внимание на то, что для чтения достаточно выставить нужный адрес на порт регистрового файла, и содержимое регистра оказывается считанным. + +> [!NOTE] +> Кнопка сброса `CPU_RESETN` не сбрасывает содержимое регистрового файла, т.к. сигнал сброса не заведен в модуль регистрового файла, а модуль `nexys_rf_riscv` самостоятельно его не сбрасывает. Для сброса можно осуществить перепрошивку ПЛИС. + +Попробуйте записать информацию в нулевой регистр, затем по другим адресам. После чего считайте записанную информацию и убедитесь, что она соответствует той, которую вы записывали (с учетом особенностей регистрового файла RISC-V). diff --git a/Labs/03. Register file and memory/board files/nexys_a7_100t.xdc b/Labs/03. Register file and memory/board files/nexys_a7_100t.xdc index a27cb13..63b6e46 100644 --- a/Labs/03. Register file and memory/board files/nexys_a7_100t.xdc +++ b/Labs/03. Register file and memory/board files/nexys_a7_100t.xdc @@ -4,79 +4,79 @@ ## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project # Clock signal -set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { CLK100 }]; #IO_L12P_T1_MRCC_35 Sch=clk100mhz -create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {CLK100}]; +set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk_i }]; #IO_L12P_T1_MRCC_35 Sch=clk100mhz +create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {clk_i}]; #Switches -set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { SW[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] -set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { SW[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] -set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { SW[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] -set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { SW[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] -set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { SW[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] -set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { SW[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] -set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { SW[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] -set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { SW[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] -set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { SW[8] }]; #IO_L24N_T3_34 Sch=sw[8] -set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { SW[9] }]; #IO_25_34 Sch=sw[9] -set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { SW[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] -set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { SW[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] -set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { SW[12] }]; #IO_L24P_T3_35 Sch=sw[12] -set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { SW[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] -set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { SW[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] -set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { SW[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] +set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { sw_i[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] +set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { sw_i[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] +set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { sw_i[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] +set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { sw_i[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] +set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { sw_i[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] +set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { sw_i[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] +set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { sw_i[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] +set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { sw_i[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] +set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { sw_i[8] }]; #IO_L24N_T3_34 Sch=sw[8] +set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { sw_i[9] }]; #IO_25_34 Sch=sw[9] +set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { sw_i[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] +set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { sw_i[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] +set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { sw_i[12] }]; #IO_L24P_T3_35 Sch=sw[12] +set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { sw_i[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] +set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { sw_i[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] +set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { sw_i[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] ### LEDs -set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { LED[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] -set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { LED[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] -set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { LED[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] -set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { LED[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] -set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { LED[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] -set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { LED[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] -set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { LED[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] -set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { LED[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] -set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { LED[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] -set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { LED[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] -set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { LED[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] -set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { LED[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] -set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { LED[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] -set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { LED[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] -set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { LED[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] -set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { LED[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] +set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { led_o[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] +set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { led_o[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] +set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { led_o[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] +set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { led_o[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] +set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { led_o[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] +set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { led_o[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] +set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { led_o[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] +set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led_o[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] +set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { led_o[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] +set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led_o[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] +set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led_o[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] +set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { led_o[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] +set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { led_o[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] +set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led_o[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] +set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { led_o[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] +set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { led_o[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] ## RGB LEDs -set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { LED16_B }]; #IO_L5P_T0_D06_14 Sch=led16_b -set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { LED16_G }]; #IO_L10P_T1_D14_14 Sch=led16_g -set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { LED16_R }]; #IO_L11P_T1_SRCC_14 Sch=led16_r -set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { LED17_B }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b -set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { LED17_G }]; #IO_0_14 Sch=led17_g -set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { LED17_R }]; #IO_L11N_T1_SRCC_14 Sch=led17_r +#set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { LED16_B }]; #IO_L5P_T0_D06_14 Sch=led16_b +#set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { LED16_G }]; #IO_L10P_T1_D14_14 Sch=led16_g +#set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { LED16_R }]; #IO_L11P_T1_SRCC_14 Sch=led16_r +#set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { LED17_B }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b +#set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { LED17_G }]; #IO_0_14 Sch=led17_g +#set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { LED17_R }]; #IO_L11N_T1_SRCC_14 Sch=led17_r ##7 segment display -set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { CA }]; #IO_L24N_T3_A00_D16_14 Sch=ca -set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { CB }]; #IO_25_14 Sch=cb -set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { CC }]; #IO_25_15 Sch=cc -set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { CD }]; #IO_L17P_T2_A26_15 Sch=cd -set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { CE }]; #IO_L13P_T2_MRCC_14 Sch=ce -set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { CF }]; #IO_L19P_T3_A10_D26_14 Sch=cf -set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { CG }]; #IO_L4P_T0_D04_14 Sch=cg -set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { DP }]; #IO_L19N_T3_A21_VREF_15 Sch=dp -set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { AN[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] -set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { AN[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] -set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { AN[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] -set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { AN[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] -set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { AN[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] -set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { AN[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] -set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { AN[6] }]; #IO_L23P_T3_35 Sch=an[6] -set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { AN[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] +set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { ca_o }]; #IO_L24N_T3_A00_D16_14 Sch=ca +set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { cb_o }]; #IO_25_14 Sch=cb +set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { cc_o }]; #IO_25_15 Sch=cc +set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { cd_o }]; #IO_L17P_T2_A26_15 Sch=cd +set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { ce_o }]; #IO_L13P_T2_MRCC_14 Sch=ce +set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { cf_o }]; #IO_L19P_T3_A10_D26_14 Sch=cf +set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { cg_o }]; #IO_L4P_T0_D04_14 Sch=cg +set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { dp_o }]; #IO_L19N_T3_A21_VREF_15 Sch=dp +set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { an_o[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] +set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { an_o[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] +set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { an_o[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] +set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { an_o[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] +set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { an_o[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] +set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { an_o[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] +set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { an_o[6] }]; #IO_L23P_T3_35 Sch=an[6] +set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { an_o[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] ##Buttons -set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn -set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { BTNC }]; #IO_L9P_T1_DQS_14 Sch=btnc -set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { BTNU }]; #IO_L4N_T0_D05_14 Sch=btnu -set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { BTNL }]; #IO_L12P_T1_MRCC_14 Sch=btnl -set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { BTNR }]; #IO_L10N_T1_D15_14 Sch=btnr -set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { BTND }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd +set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { arstn_i }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn +#set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { BTNC }]; #IO_L9P_T1_DQS_14 Sch=btnc +#set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { BTNU }]; #IO_L4N_T0_D05_14 Sch=btnu +#set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { BTNL }]; #IO_L12P_T1_MRCC_14 Sch=btnl +set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { btnr_i }]; #IO_L10N_T1_D15_14 Sch=btnr +set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { btnd_i }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd ##Pmod Headers @@ -208,4 +208,4 @@ set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { BTND } #set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] #set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] #set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] -#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { QSPI_CSN }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn \ No newline at end of file +#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { QSPI_CSN }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn diff --git a/Labs/03. Register file and memory/board files/nexys_rf_riscv.sv b/Labs/03. Register file and memory/board files/nexys_rf_riscv.sv index 5505fe4..02b494c 100644 --- a/Labs/03. Register file and memory/board files/nexys_rf_riscv.sv +++ b/Labs/03. Register file and memory/board files/nexys_rf_riscv.sv @@ -2,147 +2,143 @@ * Project Name : Architectures of Processor Systems (APS) lab work * Organization : National Research University of Electronic Technology (MIET) * Department : Institute of Microdevices and Control Systems -* Author(s) : Nikita Bulavin -* Email(s) : nekkit6@edu.miet.ru +* Author(s) : Alexander Kharlamov +* Email(s) : sasha_xarlamov@org.miet.ru See https://github.com/MPSU/APS/blob/master/LICENSE file for licensing details. * ------------------------------------------------------------------------------ */ module nexys_rf_riscv( - input CLK100, - input resetn, - input BTND, BTNU, BTNL, BTNR, BTNC, - input [15:0] SW, - output [15:0] LED, - output CA, CB, CC, CD, CE, CF, CG, DP, - output [7:0] AN, - output LED16_B, LED16_G, LED16_R, LED17_B, LED17_G, LED17_R - ); - -wire [31:0] WD3; -wire WE; -wire [31:0] RD1; -wire [31:0] RD2; - -localparam pwm = 1000; -reg [9:0] counter; -reg [3:0] semseg; -reg [7:0] ANreg; -reg CAr, CBr, CCr, CDr, CEr, CFr, CGr, DPr; -reg [15:0] LEDr; - -reg [4:0] a1; -reg [4:0] a2; -reg [4:0] a3; -reg [31:0] rd1; -reg [31:0] rd2; - -rf_riscv DUT -( - .clk_i (CLK100 ), - .read_addr1_i (a1 ), - .read_addr2_i (a2 ), - .write_addr_i (a3 ), - .write_data_i (WD3 ), - .write_enable_i (WE ), - .read_data1_o (RD1 ), - .read_data2_o (RD2 ) + input logic clk_i, + input logic arstn_i, + input logic [15:0] sw_i, + input logic btnd_i, + input logic btnr_i, + output logic [15:0] led_o, + output logic ca_o, + output logic cb_o, + output logic cc_o, + output logic cd_o, + output logic ce_o, + output logic cf_o, + output logic cg_o, + output logic dp_o, + output logic [ 7:0] an_o ); -assign LED = {1'b0, a1, a2, a3}; -assign AN[7:0] = ANreg[7:0]; -assign {CA, CB, CC, CD, CE, CF, CG, DP} = {CAr, CBr, CCr, CDr, CEr, CFr, CGr, DPr}; -assign LED16_G = BTNC | BTNR; -assign LED17_G = BTNL | BTNR; -assign {LED16_R, LED17_R} = {2{BTND}}; -assign {LED16_B, LED17_B} = {2{BTNU}}; + logic [ 4:0] ra1; + logic [ 4:0] ra2; + logic [ 4:0] wa; + logic [31:0] wd; + logic we; + logic [7:0][3:0] rd1; + logic [7:0][3:0] rd2; -assign WD3 = 32'b0 | SW[15:0]; -assign WE = BTND; + rf_riscv rf_riscv ( + .clk_i (clk_i), + .read_addr1_i (ra1 ), + .read_addr2_i (ra2 ), + .write_addr_i (wa ), + .write_data_i (wd ), + .write_enable_i (we ), + .read_data1_o (rd1 ), + .read_data2_o (rd2 ) + ); + function automatic logic [6:0] hex2semseg(input logic [3:0] hex); + unique case (hex) + 4'h0: return 7'b0000001; + 4'h1: return 7'b1001111; + 4'h2: return 7'b0010010; + 4'h3: return 7'b0000110; + 4'h4: return 7'b1001100; + 4'h5: return 7'b0100100; + 4'h6: return 7'b0100000; + 4'h7: return 7'b0001111; + 4'h8: return 7'b0000000; + 4'h9: return 7'b0000100; + 4'hA: return 7'b0001000; + 4'hB: return 7'b1100000; + 4'hC: return 7'b0110001; + 4'hD: return 7'b1000010; + 4'hE: return 7'b0110000; + 4'hF: return 7'b0111000; + endcase + endfunction -always @(posedge CLK100) begin - if (!resetn) begin - counter <= 'b0; - ANreg[7:0] <= 8'b11111111; - {CAr, CBr, CCr, CDr, CEr, CFr, CGr, DPr} <= 8'b11111111; - {a1, a2, a3} <= 'b0; - {rd1, rd2} <= 'b0; - end - else begin - if (counter < pwm) counter = counter + 'b1; - else begin - counter = 'b0; - ANreg[1] <= ANreg[0]; - ANreg[2] <= ANreg[1]; - ANreg[3] <= ANreg[2]; - ANreg[4] <= ANreg[3]; - ANreg[5] <= ANreg[4]; - ANreg[6] <= ANreg[5]; - ANreg[7] <= ANreg[6]; - ANreg[0] <= !(ANreg[6:0] == 7'b1111111); - end - a1 <= BTNL? SW[4:0]: a1; - a2 <= BTNC? SW[4:0]: a2; - a3 <= BTNR? SW[4:0]: a3; - - rd1 <= BTNU? RD1: rd1; - rd2 <= BTNU? RD2: rd2; - - case (1'b0) - ANreg[0]: begin - semseg <= (rd2) % 5'h10; - //DPr <= 1'b1; - end - ANreg[1]: begin - semseg <= (rd2 / 'h10) % 5'h10; - //DPr <= 1'b1; - end - ANreg[2]: begin - semseg <= (rd2 / 'h100) % 5'h10; - //DPr <= 1'b1; - end - ANreg[3]: begin - semseg <= (rd2 / 'h1000) % 5'h10; - //DPr <= 1'b1; - end - ANreg[4]: begin - semseg <= (rd1) % 5'h10; - //DPr <= 1'b1; - end - ANreg[5]: begin - semseg <= (rd1 / 'h10) % 5'h10; - //DPr <= 1'b1; - end - ANreg[6]: begin - semseg <= (rd1 / 'h100) % 5'h10; - //DPr <= 1'b1; - end - ANreg[7]: begin - semseg <= (rd1 / 'h1000) % 5'h10; - //DPr <= 1'b1; - end - endcase - case (semseg) - 4'h0: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000001; - 4'h1: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1001111; - 4'h2: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0010010; - 4'h3: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000110; - 4'h4: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1001100; - 4'h5: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100100; - 4'h6: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100000; - 4'h7: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001111; - 4'h8: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000000; - 4'h9: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000100; - 4'hA: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001000; - 4'hB: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1100000; - 4'hC: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110001; - 4'hD: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1000010; - 4'hE: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110000; - 4'hF: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0111000; - default: {CAr,CBr,CCr,CDr, CEr, CFr, CGr} <= 7'b0111111; - endcase - end + localparam int COUNTER_WIDTH = 10; + logic [COUNTER_WIDTH-1:0] counter_next; + logic [COUNTER_WIDTH-1:0] counter_ff; + assign counter_next = counter_ff + COUNTER_WIDTH'('b1); + always_ff @(posedge clk_i or negedge arstn_i) begin + if (!arstn_i) counter_ff <= '0; + else counter_ff <= counter_next; end + logic [7:0] an_ff; + logic [7:0] an_next; + logic an_en; + assign an_next = {an_ff[$left(an_ff)-1:0], an_ff[$left(an_ff)]}; + assign an_en = ~|counter_ff; + always_ff @(posedge clk_i or negedge arstn_i) begin + if (!arstn_i) an_ff <= ~8'b1; + else if (an_en) an_ff <= an_next; + end + + localparam bit [6:0] BLANK = 7'b1111111; + + logic [6:0] semseg; + always_comb begin + semseg = BLANK; + + unique case (1'b0) + an_ff[0]: semseg = hex2semseg(rd2[0]); + an_ff[1]: semseg = hex2semseg(rd2[1]); + an_ff[2]: semseg = hex2semseg(rd2[2]); + an_ff[3]: semseg = hex2semseg(rd2[3]); + an_ff[4]: semseg = hex2semseg(rd1[0]); + an_ff[5]: semseg = hex2semseg(rd1[1]); + an_ff[6]: semseg = hex2semseg(rd1[2]); + an_ff[7]: semseg = hex2semseg(rd1[3]); + endcase + end + + logic [2:0][4:0] addresses_next; + assign addresses_next = sw_i[14:0]; + logic [4:0] wa_ff; + logic [4:0] ra1_ff; + logic [4:0] ra2_ff; + logic [4:0] wa_next; + assign wa_next = addresses_next[0]; + logic [4:0] ra1_next; + assign ra1_next = addresses_next[2]; + logic [4:0] ra2_next; + assign ra2_next = addresses_next[1]; + logic addresses_en; + assign addresses_en = btnd_i; + always_ff @(posedge clk_i or negedge arstn_i) begin + if (!arstn_i) begin + wa_ff <= '0; + ra1_ff <= '0; + ra2_ff <= '0; + end else if (addresses_en) begin + wa_ff <= wa_next; + ra1_ff <= ra1_next; + ra2_ff <= ra2_next; + end + end + assign wa = wa_ff; + assign ra1 = ra1_ff; + assign ra2 = ra2_ff; + + assign wd = {16'b0, sw_i}; + assign we = btnr_i; + + assign {ca_o, cb_o, cc_o, cd_o, ce_o, cf_o, cg_o} = semseg; + assign dp_o = 1'b1; + + assign led_o = {1'b0, ra1, ra2, wa};; + + assign an_o = an_ff; + endmodule