Kutyaistók vs. CustomIP

     Kemény meccs volt a mai... 11 órától 20:12-ig, (vagyis több mint 9 órát) azzal foglalkoztam, hogy készítsek egy szorzóáramkört VHDL-ben, s importáljam egy CustomIP-ként a Microblaze processzorhoz. De nem akárhogy. Úgy, hogy csak regisztercímzéssel menjen a beírás és a kiolvasás is. Ergó egyetlen portja sincs... Csak regiszterei.

     Recept a következő. Megírjuk a VHDL állományt a következő (vagy ehhez hasonló) módon:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;


entity mymux is
    Port ( a          : in  STD_LOGIC_VECTOR(31 downto 0);
              b          : in  STD_LOGIc_VECTOR(31 downto 0);
              result          : out STD_LOGIC_VECTOR(31 downto 0);
              clk            : in  STD_LOGIC);
end mymux;

architecture Behavioral of mymux is

begin

    countit: process(clk,a,b) 
        begin    
            if rising_edge(clk) then 
                result<=a*b;
            end if;    
        end process;
end Behavioral;


     Ha ezzel megvagyunk, akkor végignyomkodjuk a Hardware/Create or Import peripheral menüpont alatt előbukkanó ablakokat. Ezután megnyitjuk a júzer_logic.vhd állományt és kiegészítjük a következő részekkel:

architecture IMP of user_logic is

  --USER signal declarations added here, as needed for user logic
  COMPONENT mymux
    Port (    a          : in  STD_LOGIC_VECTOR(31 downto 0);
              b          : in  STD_LOGIc_VECTOR(31 downto 0);
              result     : out STD_LOGIC_VECTOR(31 downto 0);
              clk        : in  STD_LOGIC);
  END COMPONENT;
  signal out_value       :     STD_LOGIC_VECTOR(31 downto 0); 

      Bemásolunk a következő részt ugyanebbe a fájlba, csak egy kicsit lennebb:

  --USER logic implementation added here
  MITTUDOMEN : mymux
        port map
     (
        a                     => slv_reg0,
        b                     => slv_reg1,
        result                => out_value,
        clk                   => Bus2IP_Clk);

     Még egy lépés van hátra ebben az állományban. A kiíratás megbuherálása. Mert na... Mert azt úgy kell. mert hanem nem fog menni, viszont nem ad hibát. Csak idegesít. De nagyon...

 -- implement slave model software accessible register(s) read mux
  SLAVE_REG_READ_PROC : process( slv_reg_read_sel, slv_reg0, slv_reg1, slv_reg2, out_value ) is
  begin

    case slv_reg_read_sel is
      when "100" => slv_ip2bus_data <= slv_reg0;
      when "010" => slv_ip2bus_data <= slv_reg1;
      when "001" => slv_ip2bus_data <= "00000000000000000000000000000000" & out_value;
      when others => slv_ip2bus_data <= (others => '0');
    end case;

  end process SLAVE_REG_READ_PROC;


     Ezután már csak a java van hátra. Rescan User Repositories, majd mux berakni, rákötni az mp_plb buszra és megírni a programot, ami beüzemeli ezeket a prekonfigurált állományokat.  A forráskód, komment nélkül a következő:

#include "xparameters.h"

#include "stdio.h"

#include "xstatus.h"

#include "xuartlite.h"

#include "mux.h"

//====================================================

int main (void) {
unsigned int serial_data,mux_data;

  xil_printf("-- Entering main() --\r\n");
  xil_printf("Write the first number: ");
  serial_data = XUartLite_RecvByte(XPAR_RS232_PORT_BASEADDR);
  MUX_mWriteReg(XPAR_MUX_0_BASEADDR, MUX_SLV_REG0_OFFSET, serial_data);

  xil_printf("Write the second number: ");
  serial_data = XUartLite_RecvByte(XPAR_RS232_PORT_BASEADDR);
  MUX_mWriteReg(XPAR_MUX_0_BASEADDR, MUX_SLV_REG1_OFFSET, serial_data);
  
  mux_data = MUX_mReadReg(XPAR_MUX_0_BASEADDR, MUX_SLV_REG2_OFFSET);

  xil_printf("Mux return value : %d .\n",mux_data);

  xil_printf("-- Exiting main() --\r\n");
   return 0;
}


     Ha ez mind megvolt, akkor a következőt láthatjuk a soros konzol ablakban :


     ASCII "1" = 49, ASCII "2" = 50. S azt már mindenki tudja fejből, hogy 49*50 = 2450. S megint mindenki boldog. Csak szegény szarvas nem...

1 megjegyzés:

Névtelen

Nagyon ügyi vagy öcsike:D Kitartast...

Megjegyzés küldése

Return top