5. vaja: sistem s pomnilnikom
|
|
Izdelali bomo sistem za prikaz slike iz notranjega pomnilnika BRAM. Sistem bo vseboval IP sinhronizacijsko komponento, komponento za branje pomnilnika in komponento za prikaz sličice.
|
Izdelava komponente za branje pomnilnika
1. Izdelava novega projekta
- v orodju Vivado naredi nov projekt z imenom VGAram in izberi razvojno ploščo Zedboard
- klikni Add Sources in ustvari novo VHDL datoteko z imenom VGAram ter definiraj priključke:
Port ( clk : in STD_LOGIC;
rstb : in STD_LOGIC;
rgb_i: in STD_LOGIC_VECTOR(7 downto 0);
tx_i, ty_i: in STD_LOGIC_VECTOR(8 downto 0);
en_i: in STD_LOGIC;
rgb_o: out STD_LOGIC_VECTOR(7 downto 0);
tx_o, ty_o: out STD_LOGIC_VECTOR(8 downto 0);
en_o: out STD_LOGIC;
BRAM_enb : out STD_LOGIC;
BRAM_doutb : out STD_LOGIC_VECTOR (31 downto 0);
BRAM_dinb : in STD_LOGIC_VECTOR (31 downto 0);
BRAM_web : out STD_LOGIC_VECTOR (3 downto 0);
BRAM_addrb : out STD_LOGIC_VECTOR (31 downto 0);
BRAM_clkb : out STD_LOGIC;
BRAM_rstb : out STD_LOGIC
);
- Nastavi kontrolne signale za BRAM:
BRAM_enb <= '1';
BRAM_doutb <= (others => '0');
BRAM_web <= (others => '0');
BRAM_addrb <= "00000000000000" & ty_i & tx_i;
BRAM_rstb <= not rstb;
BRAM_clkb <= clk;
- Naredi sinhroni proces v katerem ob pogoju en_i='1' beremo 32 bitni podatek iz BRAM_dinb in ga pošljemo na izhod rgb_o:
- pri tx_i(1:0)="01" naj bo na izhodu BRAM_dinb(7:0)
- pri tx_i(1:0)="10" naj bo na izhodu BRAM_dinb(15:8)
- pri tx_i(1:0)="11" naj bo na izhodu BRAM_dinb(23:16)
- sicer pa naj bo na izhodu BRAM_dinb(31:24)
- Napiši še prireditvene stavke za izhodni koordinati in veljaven izhod, ki so kar enake vhodnim vrednostim zakasnjenim za en urni cikel.
2. Izdelava komponente IP
- Iz menija Tools izberi Create and Package IP, nato pa pustimo privzeto Package your current project in Finish. Izberi IP Ports and Interfaces
z miško izberi vse signale BRAM_ in z desnim klikom izberi Add Bus interface. Nastavi: Interface Definition, Advanced, bram, vpiši ime: BRAM in izberi Master, V zavihku Port Mapping pa poveži signale med seboj: EN na BRAM_enb, DOUT na BRAM_dinb (DOUT in DIN sta zamenjana !)… Izberi signal na levi, poišči in izberi ustrezen sigbal na desni, nato pa klikni Map Ports.
Uporaba komponente v sistemu
- Odpri projekt iz prejšnje laboratorijske vaje ali pa uporabi pripravljeno ogrodje projekta: sistem3.zip
- Odpri blokovni diagram in dodaj novo IP komponento (Add IP) z imenom AXI BRAM Controller, odpri nastavitve in spremeni Number of BRAM interfaces: 1.
Z Run Connection Automation naredi povezavo komponente z AXI vmesnikom.
- Dodaj v blokovni diagram IP z imenom Block Memory Generator ter nastavi Memory Type: True Dual Port RAM
V diagramu poveži BRAM_PORTA novega bloka na BRAM_PORTA krmilnika axi_bram_ctrl_0.
- Dodaj še lastni komponenti VGAm in VRAram ter naredi povezave:
- Nad blokovnim diagramom izberi zavihek Address Editor, kjer je za pomnilniški krmilnik axi_bram_ctrl_0 rezervirano 4K naslovnega prostora. Spremeni Range tako, da bo na voljo 256K naslovov:
- Shrani blokovni diagram, če je potrebno naredi VHDL wrapper in prevedi sistem: Run Implementation, Generate Bitstream, File > Export > Export Hardware
Aplikacija
- Vrednosti, ki jih procesor zapiše v blokovni pomnilnik od naslova XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR naprej, se prikažejo kot točke na sliki.
Primer kode za izris ravne črte od (0, 100) do (100, 100):
#include "xparameters.h"
int main()
{
int y=100,x;
char *p;
for (x=0; x<100; x++) {
p= (char *)XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR+x+512*y;
*p = 255;
}