Jatkokurssilla aiheena Xilinxin Spartan-3 ja Spartan-6 FPGA-piirit, työkaluina Verilog ja ISE. Labilta löytyy molempien kehityslaudat, mutta jos haluaa oman hankkia, niin miniSpartan6+ with LX 9 tai LX 25.
Ja koska prosessorin toteuttaminen FPGA:lla on yksi typerimmistä tavoista sen hyödyntämiseen, niin se on juuri se mitä kurssilla alamme tekemään. Sen sijaan täysin oman ja yhteensopimattoman prosessoriarkkitehtuurin tekeminen olisi vielä tätäkin typerämpää. Ja se on juuri se mitä tällä kurssilla alamme tekemään.
Mutta ei kannata lannistua, kaikelle tälle on Hyvä Syy, mutta se selviää vasta torstain 12.3. kello 18:00.
Lupasin pistää jakoon viimeksi esittelemäni I/O-porttisysteemin, jossa sinisellä CPLD-laudalla on toteutettu input- ja output-portit. Tätä voi käyttää pelkistetympien FPGA-lautojen kanssa, joissa ei ole omia I/O-laitteita juurikaan. Peruskurssilla käytettyjä näyttömoduuleja pyörii labilla dEEP-laatikossa pari kappaletta. Jonkinlainen USB/TTL-sarjaporttimuunnin tarvitaan myös.
Koska ensi viikolla pääsiäinen painaa päälle, niin pidetään myöskin poikkeuksellisesti kurssi keskiviikkona kuudesta eteenpäin.
Eilenhän Tµrpo-prosessori lähti vilkuttamaan jo ledejä, mutta korjaan vähän käskykantaa vielä kivemmaksi ennen ‘julkaisua’. Otetaan vielä ensi viikko kertauksena kyseisen asian tiimoilta ja tutkitaan että mitä pitäisi tehdä jos halutaan enemmän megahertsejä.
Tämmöstä ominaisuutta en oikein ymmärrä.
JMP_imm9, 9’d0 käskyä ei voi laittaa kohtaan program_memory[0]
Eli yritän tehä alkutervehdystä Turpo ohjelmien alkuun.
Muuttaisin sitä jokaisella kääntämis kerralla
-> laudalta näkee onko oikea ohjelma poltettu
-> onko ohjellma hengissä
Koodi:
initial begin
led[7:0] = 8'b11110000; // INITIAL ledit
end
// Initialize program memory
initial begin
for (i = 0; i < 512; i = i + 1) begin
program_memory[i] = { NOP };
end
/* Tulos: 4LSB lediä loistaa, jos Program Counter alkaa 0. Väärin ??
program_memory[0] = {JMP_imm9, 9'd0}; // INITIAL ledien 4MSB pitäisi loistaa
// Koska hypätään alkuun
program_memory[1] = {MOVI_rd_imm6, R7, 6'd15}; //Nämä 4LSB loistaa
program_memory[2] = {OUT_rd_imm6, R7, 6'd0};
program_memory[3] = {HCF};
*/
/*
// Tulos: Toimii kun ensimmäisenä käsky on NOP
program_memory[0] = {NOP};
program_memory[1] = {JMP_imm9, 9'd1}; // INITIAL 4MSB ledit loistaa
// Koska hypätään alkuun
program_memory[2] = {MOVI_rd_imm6, R7, 6'd15}; //Tänne ei tulla
program_memory[3] = {OUT_rd_imm6, R7, 6'd0};
program_memory[4] = {HCF};
*/
// Tulos: Toimii, jos Program Counter lähtee 1
// Koska luupissa Program Counter alustetaan NOP -> sama testi kuin yllä
program_memory[1] = {JMP_imm9, 9'd1}; // INITIAL ledit loistaa
program_memory[2] = {MOVI_rd_imm6, R7, 6'd15}; // Tänne ei tulla
program_memory[3] = {OUT_rd_imm6, R7, 6'd0};
program_memory[4] = {HCF};
end
Eihän ylläolevassa koodissa ole mitään järkeä. Ensimmäisessä käskyssä hypätään alkuun.
Tein tämän havainnon, kun debukkasin varsinaista ongelmaa. Miten saan ohjelman pysähtymään, kunnes kytkintä käännetään. Odotettaessa näytetään ohjelman versionumeroa.
Siinä on kelloa hidastettu jotta logiikka pysyy mukana. Tämä on luultavasti tämän arkkitehtuuriversion loppupiste, etumerkillinen kertolasku ei enää mahtunut Spartan-3 demolaudan piirille.
Seuraavassa arkkitehtuurissa pilkotaan pitkät kombinaatiot flipareilla jolloin yhden käskyn suorittaminen useamman kellojakson, mutta mahdollistaa taajuuden nostamisen.
Torstaina jatketaan taas normaalin aikataulun puitteissa, eli 18-21.
Ja taas torstaina kurssi normaalisti. Viimeksi tutustuimme binäärilukujen esitysmuotoihin, erityisesti kahden komplementtiesitykseen ja lopussa lyhyesti liukulukuihin.
Tällä viikolla otetaan pientä takapakkia ja kerrataan perusasioita sinisellä CPLD-laudalla, eli mitähän mahtaa tämä tehdä? Ei ole helppo mutta ehkä joku pystyy torstaina demoamaan
// LCTech CPLD XC9572XL-10VQ44 with 50MHz external oscillator
// https://www.dropbox.com/s/ytzcx2nrvcshgau/LCTech_XC9572XL_board.pdf?dl=0
`timescale 1ns / 1ps
`default_nettype none
module main(
input wire clk50MHz,
output reg [7:0] dac
);
reg [12:0] count8kHz = 0;
reg [15:0] t = 0;
always @(posedge clk50MHz) begin
if (count8kHz == 6250 - 1) begin
count8kHz <= 0;
dac <= 10*((t>>7)|t|(t>>6))+((t&(t>>13)|(t>>6))<<2);
t <= t + 1;
end else begin
count8kHz <= count8kHz + 1;
end
end
endmodule
Sitten tämän jälkeen toteutamme 16x16-bittisen liukuhihnoitetun kertolaskuyksikön samaisella CPLD-piirillä. Tai ainakin yritämme sitä.
Tänään aiheena PDP-8 -arkkitehtuuri menneiltä vuosilta. Katsellaan yhdessä ja Antti kertoo tarinoita miten homma aikoinaan toimi ja leikitään emulaattorilla.
Voidaan samalla vähän hahmotella Verilogilla miten kannattaisi tätä arkkitehtuuria totetuttaa.
Ensi viikolla on Hellunitailuja, niin pidetään vapaaviikko.
Torstaina taas jatketaan, aiheena näytönohjaimen tekeminen VGA:lla ja HDMI:llä. Aihealue on sen verran laaja, että tätä sitten varmasti jatketaan vielä seuraavallakin kerralla.
Viimeksi käytiin kuvanmuodostamisen perusteita ja torstaina kurrsin päätöksenä tehdään HDMI:llä samaa.
Lisäksi tutustutaan linear-feedback shift registereihin (LFSR) ja kuinka niillä tehdään pseudorandom generaattori ja käytetään sitä värien ditheröintiin ja vertaillaan tuloksia.