Příspěvek na blogu Codean Labs rozebírá zranitelnost CVE-2024-4367 v PDF.js, tj. mj. prohlížeči PDF souborů ve Firefoxu. Při otevření útočníkem připraveného pdf souboru může být spuštěn libovolný kód v JavaScriptu. Vyřešeno ve Firefoxu 126.
Lazygit byl vydán ve verzi 0.42.0. Jedná se o TUI (Text User Interface) nadstavbu nad gitem.
K open source herní konzole Picopad přibyla (𝕏) vylepšená verze Picopad Pro s větším displejem, lepšími tlačítky a větší baterii. Na YouTube lze zhlédnout přednášku Picopad - open source herní konzole z LinuxDays 2023.
Byla vydána (𝕏) nová major verze 17 softwarového nástroje s webovým rozhraním umožňujícího spolupráci na zdrojových kódech GitLab (Wikipedie). Představení nových vlastností i s náhledy a videi v oficiálním oznámení.
Sovereign Tech Fund, tj. program financování otevřeného softwaru německým ministerstvem hospodářství a ochrany klimatu, podpoří vývoj FFmpeg částkou 157 580 eur. V listopadu loňského roku podpořil GNOME částkou 1 milion eur.
24. září 2024 budou zveřejněny zdrojové kódy přehrávače Winamp.
Google Chrome 125 byl prohlášen za stabilní. Nejnovější stabilní verze 125.0.6422.60 přináší řadu oprav a vylepšení (YouTube). Podrobný přehled v poznámkách k vydání. Opraveno bylo 9 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.
Textový editor Neovim byl vydán ve verzi 0.10 (𝕏). Přehled novinek v příspěvku na blogu a v poznámkách k vydání.
Byla vydána nová verze 6.3 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Přehled změn v příslušném seznamu. Tor Browser byl povýšen na verzi 13.0.15.
Dnes ve 12:00 byla spuštěna první aukce domén .CZ. Zatím největší zájem je o dro.cz, kachnicka.cz, octavie.cz, uvycepu.cz a vnady.cz [𝕏].
Všechny naše dosavadní obvody měly jeden společný rys. Neobsahovaly žádný paměťový prvek, takže hodnoty na výstupu byly závislé pouze na vstupních signálech. Takovéto obvody nazýváme kombinační. Skládají se pouze z logických členů (AND, OR, NOT, ...) a neobsahují zpětné vazby. Naproti tomu obvody, které obsahují paměťové prvky, se nazývají sekvenční. Jejich výstup není určen pouze vstupními signály, ale i vnitřním stavem obvodu (stavem jednotlivých paměťových prvků).
Jak jsme již naznačili minule (Jak se píše procesor - 3 (Procesy)),
jako paměťový prvek budeme využívat pouze registr (tzn. nebudeme tvořit
zpětné vazby v logice). Podívejme se, jak můžeme registr vytvořit pomocí
VHDL. Využijeme k tomu entitu example_2
podobnou entitě z
minulého dílu s tím rozdílem, že obsahuje navíc dva vstupní signály -
RESET
a CLK
.
ENTITY example_2 IS PORT ( CLK, RESET: in std_logic; I1, I2: in std_logic; O: out std_logic ); END example_2; ARCHITECTURE arch_3 OF example_2 IS BEGIN p_1: process (RESET, CLK) begin if (RESET = '1') then -- asynchronni reset O <= '0'; elsif (CLK'event and CLK = '1') then -- reakce na vz. hranu O <= I1 and I2; end if; end process; END arch_3;
Do procesu jsme vložili dvě sekce. Jednu reagující na reset a jednu na vzestupnou hranu hodin. VHDL zápis konkrétně znamená:
RESET '1'
, spusť první sekci
příkazů (to odpovídá činnosti asynchronního resetu v registru - nastavení
implicitních hodnot po startu systému).elsif
) spusť druhou sekci příkazů, ale
pouze v případě, že došlo ke změně signálu CLK
a tento signál
má hodnotu '1'
(odpovídá náběžné hraně). Jinak řečeno, přiřaď
do výstupního signálu určenou logickou funkci, ale pouze v okamžiku
náběžné hrany hodin. Proto tento zápis vloží na konec cesty každého
výstupního signálu registr.Náš příklad bude tedy vypadat takto:
Podmíněný příkaz tvořící registr (if RESET... elsif
CLK...
) je dobré brát pokud možno dogmaticky. Dnešní
programovatelné obvody důrazně dělí obvod na logiku a registry a každý
zásah do této části VHDL kódu může tuto strukturu narušit. Programovatelné
obvody také mají dedikované hodinové rozvody, proto, pokud si nejsme
jisti, je dobré používat v celém obvodu pouze jeden signál
CLK
.
Nyní známe takřka všechno, co je třeba k napsání procesoru ve VHDL. Navrhněme proto další entitu - sadu registrů. Zvolme jednoduchou variantu sady čtyř osmibitových registrů, kde jedinou funkcí bude zápis do registrů a čtení z nich.
ENTITY register_set IS PORT ( CLK, RESET: in std_logic; I: in std_logic_vector(7 downto 0); O: out std_logic_vector(7 downto 0); ADDR: in std_logic_vector(1 downto 0); WR: in std_logic ); END register_set; ARCHITECTURE behavioral OF register_set IS signal R1, R2, R3, R4: std_logic_vector(7 downto 0); BEGIN p_1: process (RESET, CLK) begin if (RESET = '1') then -- asynchronni reset R1 <= (others => '0'); R2 <= (others => '0'); R3 <= (others => '0'); R4 <= (others => '0'); elsif (CLK'event and CLK = '1') then -- reakce na vz. hranu if WR = '1' then if A = "00" then R1 <= I; elsif A = "01" then R2 <= I; elsif A = "10" then R3 <= I; else R4 <= I; end if; end if; end if; end process; O <= R1 when A = "00" else R2 when A = "01" else R3 when A = "10" else R4; END behavioral;
V entitě definujeme vstupní a výstupní signály. CLK
a
RESET
jsou důležité pro synchronizaci registrů.
I
a O
jsou vstupní a výstupní datové sběrnice,
A
vybírá jeden ze čtyř registrů. Pomocí signálu
WR
zapisujeme do jednotlivých registrů. Signál pro čtení
není třeba, na výstupní sběrnici je vždy hodnota aktivního registru.
V deklarační části architektury si definujeme čtyři pomocné osmibitové
signály, pomocí kterých vytvoříme vlastní registry. Hlavní část těla
architektury tvoří proces, který implikuje vytvoření registrů a realizuje
zápis. Kód nám říká, že v případě aktivního signálu WR
má být
přiřazena hodnota sběrnice I
do jednoho ze signálů
R1
- R4
. Toto přiřazení se má provést pouze v
okamžiku náběžné hrany signálu CLK
. Pro syntezátor to tedy
znamená vytvoření čtyř osmibitových registrů se vstupem I
,
výstupem R1
- R4
a povolovacím signálem (chip
enable, CEx
) tvořeným ze signálů WR
a
A
.
Výstup O
je tvořen pomocí signálu WHEN
. V
tomto případě to bude multiplexor, který vybírá výstup jednoho z registrů
v závislosti na adrese A
.
Na obrázku je znázorněno zjednodušené schéma pro 2 registry:
Nástroje: Tisk bez diskuse
Tiskni Sdílej:
začína to konečne vyzerať, že sa s tým dá niečo robiť... nenapíšete čitateľom nabudúce ukážkový 64bitový procesor? :)))
A teraz Vážne! Chcel som sa spýtať, či je existujú postupy na optimalizáciu hotových návrhov? Možno niekdo potrebuje usporiť a radšej by použil viacero lacnejších odvodov, ako pár drahšich.
LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_arith.ALL; ENTITY registers IS GENERIC ( data_w : natural := 8; addr_w : natural := 2; num_regs : natural := 4 ); PORT ( res : IN std_logic; clk : IN std_logic; wr_en : IN std_logic; addr : IN std_logic_vector(addr_w-1 DOWNTO 0); data_in : IN std_logic_vector(data_w-1 DOWNTO 0); data_out : OUT std_logic_vector(data_w-1 DOWNTO 0) ); END registers; ARCHITECTURE rtl OF registers IS SUBTYPE reg_t IS std_logic_vector(data_w-1 DOWNTO 0); TYPE reg_arr_t IS ARRAY (num_regs-1 DOWNTO 0) OF reg_t; SIGNAL rg_ar_reg : reg_arr_t; SIGNAL rg_ar_cmb : reg_arr_t; SIGNAL rg_wr_cmb : std_logic_vector(num_regs-1 DOWNTO 0); SIGNAL rg_sel_cmb : std_logic_vector(num_regs-1 DOWNTO 0); BEGIN gen_reg_array: FOR i IN 0 TO num_regs-1 GENERATE ---- -- Registers Array ---- rg_ar_reg_proc: PROCESS (res, clk) BEGIN IF (res = '1') THEN rg_ar_reg(i) <= (OTHERS => '0'); ELSIF (clk'EVENT AND clk ='1') THEN rg_ar_reg(i) <= rg_ar_cmb(i); END IF; END PROCESS rg_ar_reg_proc; ---- -- Register selection ---- sel_reg_cmb_proc: PROCESS (addr, wr_en) VARIABLE sel_v : std_logic_vector(num_regs-1 DOWNTO 0); BEGIN sel_v := (OTHERS => '0'); sel_v(conv_integer(unsigned(addr))) := '1'; rg_sel_cmb <= sel_v; END PROCESS sel_reg_cmb_proc; ---- -- Registers array next ---- rg_ar_cmb_proc: PROCESS (data_in, rg_ar_reg, rg_sel_cmb, wr_en) BEGIN IF (rg_wr_cmb(i)= '1' AND wr_en='1') THEN rg_ar_cmb(i) <= data_in; ELSE rg_ar_cmb(i) <= rg_ar_reg(i); END IF; END PROCESS rg_ar_cmb_proc; END GENERATE gen_reg_array; ---- -- Data output selection ---- data_sel_cmb_proc: PROCESS (rg_ar_reg, addr) VARIABLE addr_v : natural; BEGIN addr_v := conv_integer(unsigned(addr)); data_out <= rg_ar_reg(addr_v); END PROCESS; END rtl;I tady je co vylepsovat. Napriklad registrovat vystup. Vasi poznamku o hokeji v casovani jsem nejak nepochopil. Co pipeline??? Jinak v tom Vasem kodu je chyba a nejde zkompilovat ("ADDR"!="A").