Digitaalitekniikan jatkokurssi

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.

Alustava kurssikalenteri: http://kirjoitusalusta.fi/hacklab-x-digi-jatko

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.

https://dl.dropboxusercontent.com/u/39562463/fpgaio.zip

Ja muistutuksena vielä, että tällä viikolla kurssi poikkeuksellisesti keskiviikkona.

Kertaamme Tµrpo-prosessorin toteutusta, lisätään i/o-portteja ja testaillaan sitä raudalla.

– M

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ä.

Moi

Turpon saloihin yritän tutustua.

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.

EDIT: Vika taisi löytyä. LUE SEURAAVA VIESTI ENNEN TÄTÄ vuodatusta

EDIT2: Poistettu epämääräinen virheen etsiminen SKPNZ_rd käskystä
Alla on parempi vianhaku ja ratkaisu sille

Vika taisi löytyä.

Käskykannassa taitaa olla väärä opcode käskylle SKPNZ_rd

    initial begin
        led[7:0] = 8'b11110000; // INITIAL versionumero
    end
    
    // Initialize program memory
    initial begin
        for (i = 0; i < 512; i = i + 1) begin
            program_memory[i] =     { NOP   };
        end
		  
		  //Näytä INITIAL versionumeroa, kunnes sw1 tai sw4 käännetty
		  
		  program_memory[1] = {NOP};
		  program_memory[2] = {IN_rd_imm6, R7, 6'd0}; // Lue kytkimet
		  program_memory[3] = {MOVI_rd_imm6, R1, 6'd05}; //ohjelma etenee, kun SW1 || SW4 aktivoitu

// xxxxxxxxxxxxxxxxx RIKKI xxxxxxxxxxxxxxxxxxx
// Ohjelma etenee "riville 7" jos JOKU kytkin käännetty
// Haluttiin etenevän kun 1 TAI 4 käännetty
		  program_memory[4] = {AND_rd_rs_rt, R6, R7, R1}; //R6=R7&R1
		  program_memory[5] = {SKPNZ_rd, R6};
		  program_memory[6] = {JMP_imm9, 9'd1};
		  program_memory[7] = {OUT_rd_imm6, R6, 6'd0}; // sytytetään AND tulos 1 TAI 4
   	  program_memory[8] = {JMP_imm9, 9'd1}; 
		  
//		  SKPNZ_rd: begin
//		      program_counter <= (program_counter + ((registers[opcode7_rd] != 0) ? 2 : 1));
//		  end
// PITÄISIKÖ OLLA OPCODE7_RS
// program_counter <= (program_counter + ((registers[opcode7_rs] != 0) ? 2 : 1));

// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

/*
 xxxxxxxxxxxxxxxxx Tämä toimii xxxxxxxxxxxxxxxxxxx
		  program_memory[4] = {SKPEQ_rd_rs, R7, R1}; // 1 JA 4 pitää olla käännetty
		  program_memory[5] = {JMP_imm9, 9'd1};
		  program_memory[6] = {OUT_rd_imm6, R7, 6'd0}; // sytytetään kytkimillä valitut ledit
   	  program_memory[7] = {JMP_imm9, 9'd1};        
 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
 */		  		  
    end

Siellä oli pari muutakin kohtaa, nyt on korjattu versio tuolla: http://kirjoitusalusta.fi/hacklab-x-digi-jatko-harjoituksia

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 :smile:

// 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ä.

Huomenna tosiaan viettelemme Vappua, eli ei ohjattua koulutusta.

Mutta sitten ensi viikolla torstaina on SATSin rakettikurssi, eli digitaalitekniikkaa harrastamme jo keskiviikkona 6.5.

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.

Tässä sitten käytetään jatkossa signaalien visualisointiin http://wavedrom.com/editor.html (se on interaktiivinen). Ja sitten kun tarvii lisää jippoja niin tuolta löytyy http://wavedrom.com/tutorial.html .

Alkeiskurssia varmaan aloitellaan taas syksyllä uudestaan, tässä hyvä projekti ottaa seurantaan:

– M