Skip to content

Commit

Permalink
Fix/lab5 (#22)
Browse files Browse the repository at this point in the history
  • Loading branch information
Golem211 authored Nov 3, 2024
1 parent d9f8c55 commit 405fb3a
Show file tree
Hide file tree
Showing 25 changed files with 102 additions and 101 deletions.
29 changes: 15 additions & 14 deletions chapters/verilog/memory/drills/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,18 @@

Soluția se află în repo-ul materiei [GitHub](https://github.com/cs-pub-ro/computer-architecture/tree/main/chapters/verilog/memory/drills/tasks).

- Implementați modulul register pornind de la declarația din fișierul register.v. Semnalele oe și we reprezintă Output Enable, respectiv Write Enable.
oe controlează ieșirea registrului. Când oe este high ieșirea este activă având valoarea memorată de registru. Când oe este low ieșirea va fi 0. Acest semnal trebuie să fie asincron: modificarea lui va avea efect imediat asupra ieșirii și nu se va aștepta tranziția semnalului de ceas.
we controlează scrierea în registru. Când we este high registrul va memora valoarea aflată în semnalul de intrare. Când we este low valoarea registrului nu se va modifica, ignorând practic semnalul de intrare. Acest semnal trebuie să fie sincron: modificarea valorii memorate de registru se face doar în momentul tranziției semnalului de ceas.
Semnalul disp_out este folosit pentru afișare/debugging pe display, iar valoarea acestuia trebuie să fie cea memorată de registru în momentul curent. În mod normal acest semnal nu este prezent într-un calculator. Acest semnal nu trebuie să fie afectat de oe, valoarea disponibilă pe disp_out fiind în orice moment egală cu valoarea memorată de registru.
Semnalul de reset rst_n este activ pe low (0).
Hint: Puteți folosi operatorul condiţional.
Parametrizați modulul register astfel încât data de intrare și ieșire din registru să aibă o dimensiune configurabilă.
Hint: Utilizați construcția de limbaj parameter
Pornind de la interfața modulului sequential_multiplier din scheletul de cod, implementați un automat de stări care să folosească instanțe parametrizate ale modulului register pentru a îndeplini următoarele funcționalități:
La activarea semnalului write să se scrie pe câte un registru (parametrizat corespunzător) valorile semnalelor a și b
La activarea semnalului multiply să fie extrase valorile din cele două registre, să se înmulțească și să se adauge pe un al treilea registru.
La activarea semnalului display, semnalul out să primească valoarea aflată pe cel de-al treilea registru.
Prioritatea celor trei semnale este dată de ordinea în care au fost descrise (e.g. dacă write este activ, se ignoră semnalele multiply și display; dacă multiply este activ, se ignoră semnalul display)
- Vi se pune la dispoziție un RAM de tip Block Memory Generator instanțiat în modulul ram_reader. Completați modulul astfel încât să puteți gestiona citirea din memorie de la o adresă am_out în momentul în care semnalul read este activ (1).
-Modulul `Register` reprezinta cun functioneaza un registru real.Semnalele oe și we reprezintă Output Enable, respectiv Write Enable.
- `oe` controlează ieșirea registrului. Când oe este `high` ieșirea este activă având valoarea memorată de registru. Când oe este low ieșirea va fi 0. Acest semnal trebuie să fie asincron: modificarea lui va avea efect imediat asupra ieșirii și nu se va aștepta tranziția semnalului de ceas.
- `we` controlează scrierea în registru. Când we este high registrul va memora valoarea aflată în semnalul de intrare. Când we este low valoarea registrului nu se va modifica, ignorând practic semnalul de intrare. Acest semnal trebuie să fie sincron: modificarea valorii memorate de registru se face doar în momentul tranziției semnalului de ceas.
- Semnalul `disp_out` este folosit pentru afișare/debugging pe display, iar valoarea acestuia trebuie să fie cea memorată de registru în momentul curent. În mod normal acest semnal nu este prezent într-un calculator. Acest semnal nu trebuie să fie afectat de oe, valoarea disponibilă pe disp_out fiind în orice moment egală cu valoarea memorată de registru.
- Semnalul de reset `rst_n` este activ pe low (0).
- Hint: Puteți folosi operatorul condiţional.
- Pornind de la interfața modulului `sequential_multiplier` din scheletul de cod, implementați un automat de stări care să folosească instanțe parametrizate ale modulului `register` pentru a îndeplini următoarele funcționalități:
- La activarea semnalului `write`, valorile semnalelor `a` și `b` sunt scrise în registre parametrizate corespunzător.
- La activarea semnalului `multiply`, valorile din cele două registre sunt extrase, înmulțite și rezultatul adăugat într-un al treilea registru.
- La activarea semnalului `display`, semnalul `out` va primi valoarea aflată în al treilea registru.
- Prioritatea celor trei semnale este dată de ordinea în care au fost descrise:
- Dacă `write` este activ, se ignoră semnalele `multiply` și `display`.
- Dacă `multiply` este activ, se ignoră semnalul `display`.

- Modulul `ram_reader` este o interfață simplă pentru RAM care permite citirea și scrierea în RAM. Utilizează semnalul `i_w_we` pentru a controla operațiile de scriere și semnalul `i_w_oe` pentru a controla operațiile de citire. De asemenea se specifica si adresa de la care sa fie citita/scrisa valoarea cu semnalul `i_w_address`
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
module task2 #(
module ram_reader #(
parameter p_data_width = 8,
parameter p_address_width = 20
)(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
create_project build build_project -part xc7a100tcsg324-1 -force
import_files -force -fileset sources_1 -norecurse ram_reader.v
import_files -force -fileset sim_1 -norecurse test_ram_reader.v
import_files -force -fileset constrs_1 -norecurse ram_reader.xdc
set_property top ram_reader [get_fileset sources_1]
set_property top test_ram_reader [get_fileset sim_1]
update_compile_order -fileset sources_1
update_compile_order -fileset sim_1
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
`timescale 1ns / 1ps
module test_task2;
module test_ram_reader;
localparam l_p_data_width = 8;
localparam l_p_address_width = 10;
//Inputs
Expand All @@ -16,7 +16,7 @@ module test_task2;
integer i,j,k;

//Module initialization
task2 #(.p_data_width(l_p_data_width), .p_address_width(l_p_address_width)) l_m_task2(
ram_reader #(.p_data_width(l_p_data_width), .p_address_width(l_p_address_width)) l_m_ram_reader(
.o_w_out(l_w_out),
.i_w_clk(l_r_clk),
.i_w_address(l_r_address),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
module task0#(
parameter p_data_width = 7
module register#(
parameter p_data_width = 8
)(
output wire [(p_data_width - 1):0] o_w_out,
output wire [(p_data_width - 1):0] o_w_disp_out,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,45 +4,45 @@
## - 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 { CLK100MHZ }]; #IO_L12P_T1_MRCC_35 Sch=clk100mhz
#create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {CLK100MHZ}];
set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { i_w_clk }]; #IO_L12P_T1_MRCC_35 Sch=clk100mhz
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {i_w_clk}];


##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 J15 IOSTANDARD LVCMOS33 } [get_ports { i_w_in[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0]
set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { i_w_in[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1]
set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { i_w_in[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2]
set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { i_w_in[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3]
set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { i_w_in[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4]
set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { i_w_in[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5]
set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { i_w_in[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6]
set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { i_w_in[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7]
set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { i_w_we }]; #IO_L24N_T3_34 Sch=sw[8]
set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { i_w_oe }]; #IO_25_34 Sch=sw[9]
set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { i_w_reset }]; #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]

## 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 { o_w_out[0] }]; #IO_L18P_T2_A24_15 Sch=led[0]
set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { o_w_out[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1]
set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { o_w_out[2] }]; #IO_L17N_T2_A25_15 Sch=led[2]
set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { o_w_out[3] }]; #IO_L8P_T1_D11_14 Sch=led[3]
set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { o_w_out[4] }]; #IO_L7P_T1_D09_14 Sch=led[4]
set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { o_w_out[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5]
set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { o_w_out[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6]
set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { o_w_out[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7]
set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { o_w_disp_out[0] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8]
set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { o_w_disp_out[1] }]; #IO_L14N_T2_SRCC_14 Sch=led[9]
set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { o_w_disp_out[2] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10]
set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { o_w_disp_out[3] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11]
set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { o_w_disp_out[4] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12]
set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { o_w_disp_out[5] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13]
set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { o_w_disp_out[6] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14]
set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { o_w_disp_out[7] }]; #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
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
create_project build build_project -part xc7a100tcsg324-1 -force
import_files -force -fileset sources_1 -norecurse register.v
import_files -force -fileset sim_1 -norecurse test_register.v
import_files -force -fileset constrs_1 -norecurse register.xdc
set_property top register [get_fileset sources_1]
set_property top test_register [get_fileset sim_1]
update_compile_order -fileset sources_1
update_compile_order -fileset sim_1
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
`timescale 1ns / 1ps
module test_task0;
module test_register;
localparam l_p_data_width = 8;
//Inputs
reg l_r_clk;
Expand All @@ -15,7 +15,7 @@ module test_task0;
integer i,j,k;

//Module initialization
task0 #(.p_data_width(l_p_data_width)) l_m_task0(
register #(.p_data_width(l_p_data_width)) l_m_register(
.o_w_out(l_w_out),
.i_w_clk(l_r_clk),
.i_w_reset(l_r_reset),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
module task1 #(
parameter p_data_width = 7
module sequential_multiplier #(
parameter p_data_width = 4
)(
output wire [(2*p_data_width-1):0] o_w_out,
input wire [(p_data_width-1):0] i_w_a,
Expand All @@ -14,7 +14,7 @@ module task1 #(
wire l_w_a_we;
wire l_w_a_oe;
wire [(p_data_width-1):0] l_w_a_out;
task0 #(.p_data_width(p_data_width)) l_m_task0_0 (
register #(.p_data_width(p_data_width)) l_m_register_0 (
.o_w_out(l_w_a_out),
.i_w_clk(i_w_clk),
.i_w_reset(i_w_reset),
Expand All @@ -26,7 +26,7 @@ module task1 #(
wire l_w_b_we;
wire l_w_b_oe;
wire [(p_data_width-1):0] l_w_b_out;
task0 #(.p_data_width(p_data_width)) l_m_task0_1 (
register #(.p_data_width(p_data_width)) l_m_register_1 (
.o_w_out(l_w_b_out),
.i_w_clk(i_w_clk),
.i_w_reset(i_w_reset),
Expand All @@ -41,7 +41,7 @@ module task1 #(
wire [(2*p_data_width-1):0] l_w_c_out;
wire [(2*p_data_width-1):0] l_w_c_in;
assign l_w_c_in = (l_w_a_out * l_w_b_out);
task0 #(.p_data_width(2*p_data_width)) l_m_task0_2 (
register #(.p_data_width(2*p_data_width)) l_m_register_2 (
.o_w_out(l_w_c_out),
.i_w_clk(i_w_clk),
.i_w_reset(i_w_reset),
Expand Down
Loading

0 comments on commit 405fb3a

Please sign in to comment.