1
0
mirror of git://projects.qi-hardware.com/nn-usb-fpga.git synced 2025-01-21 03:01:06 +02:00

Adding write funtions to blink driver sample

This commit is contained in:
Carlos Camargo 2010-05-04 11:17:38 -05:00
parent 07888ac4c4
commit de9acb468b
6 changed files with 79 additions and 142 deletions

View File

@ -61,12 +61,30 @@ static int device_open(struct inode *inode, struct file *file)
return SUCCESS;
}
static ssize_t
device_write(struct file *filp, const char *buff, size_t count, loff_t * off)
{
const char cmd = buff[0];
if(cmd=='Q')
{
printk(KERN_INFO "Q...\n");
gpio_set_value(LED_PIN, 1);
}
else
if(cmd=='S'){
printk(KERN_INFO "S...\n");
gpio_set_value(LED_PIN, 0);
}
return 1;
}
static int device_release(struct inode *inode, struct file *file)
{
is_device_open = 0;
gpio_set_value(LED_PIN, 0);
module_put(THIS_MODULE);
printk( KERN_INFO "Close BLINKER\n" );
@ -76,6 +94,7 @@ static int device_release(struct inode *inode, struct file *file)
struct file_operations fops = {
.open = device_open,
.write = device_write,
.release = device_release,
};

View File

@ -39,6 +39,9 @@ int main(void)
data16++;
*data32 = 0x30303030;
data32++;
*data32 = 0x31313131;
test8 = *data8;
test16 = *data16;

View File

@ -10,7 +10,7 @@ SIM_COMP_SCRIPT = simulation/$(DESIGN)_TB.do
#SIM_INIT_SCRIPT = simulation/$(DESIGN)_init.do
SIMGEN_OPTIONS = -p $(FPGA_ARCH) -lang $(LANGUAGE)
SRC_HDL = plasma.vhd alu.vhd control.vhd mem_ctrl.vhd mult.vhd shifter.vhd bus_mux.vhd ddr_ctrl.vhd mlite_cpu.vhd pc_next.vhd cache.vhd eth_dma.vhd mlite_pack.vhd pipeline.vhd reg_bank.vhd uart.vhd plasma_3e.vhd ram_image.vhd
SRC_HDL = plasma.vhd alu.vhd control.vhd mem_ctrl.vhd mult.vhd shifter.vhd bus_mux.vhd ddr_ctrl.vhd mlite_cpu.vhd pc_next.vhd cache.vhd eth_dma.vhd mlite_pack.vhd pipeline.vhd reg_bank.vhd uart.vhd ram_image.vhd
all: bits
@ -53,8 +53,8 @@ build/project.xst: build/project.src
build/project.ngc: build/project.xst $(SRC)
cd build && xst -ifn project.xst -ofn project.log
build/project.ngd: build/project.ngc $(PINS)
cd build && ngdbuild -p $(DEVICE) project.ngc -uc ../$(PINS)
build/project.ngd: build/project.ngc #$(PINS)
cd build && ngdbuild -p $(DEVICE) project.ngc #-uc ../$(PINS)
build/project.ncd: build/project.ngd
cd build && map -pr b -p $(DEVICE) project

View File

@ -414,21 +414,15 @@ package mlite_pack is
component plasma
generic(memory_type : string := "XILINX_X16"; --"DUAL_PORT_" "ALTERA_LPM";
log_file : string := "UNUSED";
use_cache : std_logic := '0');
log_file : string := "UNUSED");
port(clk : in std_logic;
reset : in std_logic;
uart_write : out std_logic;
uart_read : in std_logic;
address : out std_logic_vector(31 downto 2);
byte_we : out std_logic_vector(3 downto 0);
data_write : out std_logic_vector(31 downto 0);
data_read : in std_logic_vector(31 downto 0);
mem_pause_in : in std_logic;
gpio0_out : out std_logic_vector(31 downto 0);
gpioA_in : in std_logic_vector(31 downto 0));
mem_pause_in : in std_logic
);
end component; --plasma
component ddr_ctrl

View File

@ -20,14 +20,6 @@
-- 0x20000030 GPIO0 Out Set bits
-- 0x20000040 GPIO0 Out Clear bits
-- 0x20000050 GPIOA In
-- 0x20000060 Counter
-- IRQ bits:
-- 7 GPIO31
-- 6 ^GPIO31
-- 3 Counter(18)
-- 2 ^Counter(18)
-- 1 ^UartWriteBusy
-- 0 UartDataAvailable
---------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
@ -35,21 +27,16 @@ use work.mlite_pack.all;
entity plasma is
generic(memory_type : string := "XILINX_16X"; --"DUAL_PORT_" "ALTERA_LPM";
log_file : string := "UNUSED";
use_cache : std_logic := '0');
log_file : string := "UNUSED");
port(clk : in std_logic;
reset : in std_logic;
uart_write : out std_logic;
uart_read : in std_logic;
address : out std_logic_vector(31 downto 2);
byte_we : out std_logic_vector(3 downto 0);
data_write : out std_logic_vector(31 downto 0);
data_read : in std_logic_vector(31 downto 0);
mem_pause_in : in std_logic;
gpio0_out : out std_logic_vector(31 downto 0);
gpioA_in : in std_logic_vector(31 downto 0));
mem_pause_in : in std_logic
);
end; --entity plasma
architecture logic of plasma is
@ -70,13 +57,11 @@ architecture logic of plasma is
signal enable_uart_read : std_logic;
signal enable_uart_write : std_logic;
signal gpio0_reg : std_logic_vector(31 downto 0);
signal uart_write_busy : std_logic;
signal uart_data_avail : std_logic;
signal irq_mask_reg : std_logic_vector(7 downto 0);
signal irq_status : std_logic_vector(7 downto 0);
signal irq : std_logic;
signal counter_reg : std_logic_vector(31 downto 0);
signal ram_enable : std_logic;
signal ram_byte_we : std_logic_vector(3 downto 0);
@ -84,27 +69,10 @@ architecture logic of plasma is
signal ram_data_w : std_logic_vector(31 downto 0);
signal ram_data_r : std_logic_vector(31 downto 0);
signal cache_check : std_logic;
signal cache_checking : std_logic;
signal cache_miss : std_logic;
signal cache_hit : std_logic;
begin --architecture
write_enable <= '1' when cpu_byte_we /= "0000" else '0';
mem_busy <= mem_pause_in;
cache_hit <= cache_checking and not cache_miss;
cpu_pause <= '0'; --(uart_write_busy and enable_uart and write_enable) or --UART busy
-- cache_miss or --Cache wait
-- (cpu_address(28) and not cache_hit and mem_busy); --DDR or flash
-- gpio0_out(31 downto 29) <= gpio0_reg(31 downto 29);
-- gpio0_out(23 downto 0) <= gpio0_reg(23 downto 0);
enable_misc <= '1' when cpu_address(30 downto 28) = "010" else '0';
enable_uart <= '1' when enable_misc = '1' and cpu_address(7 downto 4) = "0000" else '0';
enable_uart_read <= enable_uart and not write_enable;
enable_uart_write <= enable_uart and write_enable;
cpu_address(1 downto 0) <= "00";
--%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-- PROCESSOR
--%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
u1_cpu: mlite_cpu
generic map (memory_type => memory_type)
PORT MAP (
@ -121,45 +89,35 @@ begin --architecture
data_r => cpu_data_r,
mem_pause => cpu_pause);
opt_cache: if use_cache = '0' generate
cache_check <= '0';
cache_checking <= '0';
cache_miss <= '0';
end generate;
opt_cache2: if use_cache = '1' generate
--Control 4KB unified cache that uses the upper 4KB of the 8KB
--internal RAM. Only lowest 2MB of DDR is cached.
u_cache: cache
generic map (memory_type => memory_type)
PORT MAP (
clk => clk,
reset => reset,
address_next => address_next,
byte_we_next => byte_we_next,
cpu_address => cpu_address(31 downto 2),
mem_busy => mem_busy,
--%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-- ADDRESS DECODER
--%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
write_enable <= '1' when cpu_byte_we /= "0000" else '0';
mem_busy <= mem_pause_in;
cpu_pause <= '0'; --(uart_write_busy and enable_uart and write_enable) or --UART busy
-- (cpu_address(28) and mem_busy); --DDR or flash
enable_uart <= '1' when cpu_address(30 downto 28) = "010" and cpu_address(7 downto 4) = "0000" else '0';
enable_uart_read <= enable_uart and not write_enable;
enable_uart_write <= enable_uart and write_enable;
cpu_address(1 downto 0) <= "00";
ram_enable <= '1' when address_next(30 downto 28) = "000" else '0';
ram_byte_we <= byte_we_next;
ram_address(31 downto 13) <= ZERO(31 downto 13);
ram_address(12 downto 2) <= (address_next(12)) & address_next(11 downto 2);
ram_data_w <= cpu_data_w;
cache_check => cache_check, --Stage1: address_next in first 2MB DDR
cache_checking => cache_checking, --Stage2
cache_miss => cache_miss); --Stage3
end generate; --opt_cache2
misc_proc: process(clk, reset, cpu_address, enable_misc,
ram_data_r, data_read, data_read_uart, cpu_pause,
irq_mask_reg, irq_status, gpio0_reg, write_enable,
cache_checking,
gpioA_in, counter_reg, cpu_data_w)
irq_mask_reg, irq_status, write_enable,
cpu_data_w)
begin
case cpu_address(30 downto 28) is
when "000" => --internal RAM
cpu_data_r <= ram_data_r;
when "001" => --external RAM
if cache_checking = '1' then
cpu_data_r <= ram_data_r; --cache
else
cpu_data_r <= data_read; --DDR
end if;
when "010" => --misc
case cpu_address(6 downto 4) is
when "000" => --uart
@ -168,48 +126,15 @@ begin --architecture
cpu_data_r <= ZERO(31 downto 8) & irq_mask_reg;
when "010" => --irq_status
cpu_data_r <= ZERO(31 downto 8) & irq_status;
when "011" => --gpio0
cpu_data_r <= gpio0_reg;
when "101" => --gpioA
cpu_data_r <= gpioA_in;
when "110" => --counter
cpu_data_r <= counter_reg;
when others =>
cpu_data_r <= gpioA_in;
cpu_data_r <= ZERO(31 downto 8) & data_read_uart;
end case;
when "011" => --flash
cpu_data_r <= data_read;
when others =>
cpu_data_r <= ZERO;
end case;
if reset = '1' then
irq_mask_reg <= ZERO(7 downto 0);
gpio0_reg <= ZERO;
counter_reg <= ZERO;
elsif rising_edge(clk) then
if cpu_pause = '0' then
if enable_misc = '1' and write_enable = '1' then
if cpu_address(6 downto 4) = "001" then
irq_mask_reg <= cpu_data_w(7 downto 0);
elsif cpu_address(6 downto 4) = "011" then
gpio0_reg <= gpio0_reg or cpu_data_w;
elsif cpu_address(6 downto 4) = "100" then
gpio0_reg <= gpio0_reg and not cpu_data_w;
end if;
end if;
end if;
counter_reg <= bv_inc(counter_reg);
end if;
end process;
ram_enable <= '1' when address_next(30 downto 28) = "000" or cache_check = '1' or cache_miss = '1' else '0';
ram_byte_we <= byte_we_next when cache_miss = '0' else "1111";
ram_address(31 downto 13) <= ZERO(31 downto 13);
ram_address(12 downto 2) <= (address_next(12) or cache_check) & address_next(11 downto 2)
when cache_miss = '0' else
'1' & cpu_address(11 downto 2); --Update cache after cache miss
ram_data_w <= cpu_data_w when cache_miss = '0' else data_read;
end process;
u2_ram: ram
generic map (memory_type => memory_type)
@ -235,10 +160,6 @@ begin --architecture
busy_write => uart_write_busy,
data_avail => uart_data_avail);
address <= cpu_address(31 downto 2);
byte_we <= cpu_byte_we;
data_write <= cpu_data_w;
gpio0_out(28 downto 24) <= ZERO(28 downto 24);
end; --architecture logic

View File

@ -45,11 +45,11 @@ INIT_00 => X"afafafafafafafafafafafafafafafaf2308000c241400ac273c243c243c273c",
INIT_01 => X"8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f230c008c8c3caf00af00af2340afaf",
INIT_02 => X"acacacac0003373cac038cac8cac8cac8c243c40034040033423038f038f8f8f",
INIT_03 => X"000300ac0300000034038c8c8c8c8c8c8c8c8c8c8c8c3403acacacacacacacac",
INIT_04 => X"913434ada5342434343ca5a5242434a134a1242434a034a024243434a024343c",
INIT_05 => X"240800100080afafaf270003ac001030008c343c0003ac8c34943c908d349434",
INIT_06 => X"2400afafafaf272703008f8f8f00140082000c2682000c241400100082260c00",
INIT_07 => X"8f8c3c10000caf2730038c343c240827038f8f8f8f0216260c2424142c300224",
INIT_08 => X"00000000000000000000000000000024038c0014ac00248c3c24243c3c270300",
INIT_04 => X"ad343434343c3ca5a5242434a534a1242434a134a0242434a034a0242434343c",
INIT_05 => X"0080afafaf270003ac001030008c343c0003ac8c34943c908d349434913434ad",
INIT_06 => X"afaf272703008f8f8f00140082000c2682000c241400100082260c0024080010",
INIT_07 => X"000caf2730038c343c240827038f8f8f8f0216260c2424142c3002242400afaf",
INIT_08 => X"000000000000000000000024038c0014ac00248c3c24243c3c2703008f8c3c10",
INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",
INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",
INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",
@ -122,11 +122,11 @@ INIT_00 => X"b8afaeadacabaaa9a8a7a6a5a4a3a2a1bd000000a560a4a0bd1d8404a5059c1c",
INIT_01 => X"b9b8afaeadacabaaa9a8a7a6a5a4a3a2a1a50086c6c406bb00bb00ba5a1abfb9",
INIT_02 => X"9392919000405a1a06e0a606a606a606a6a50584e0029b401bbd60bb60bbbabf",
INIT_03 => X"00e000c4e0000085a2e09f9d9c9e979695949392919002e09f9d9c9e97969594",
INIT_04 => X"868283a26342038b8d02422302038a828903020388e28cc302038786a2028504",
INIT_05 => X"110080400082b1bfb0bd00e0a40040420062a30500e0a2a342860262a6844785",
INIT_06 => X"1080bfb0b1b2bdbde000b0b1bf00400002400010020000045100400002100040",
INIT_07 => X"bf6203400000bfbd42e06263030400bde0b0b1b2bf1211100064644062431211",
INIT_08 => X"00000000000000040000802400800042e0a20083404584820563440302bde000",
INIT_04 => X"8263428c8e0302634203028b238aa2030289038de2030288c387a20302868504",
INIT_05 => X"0082b1bfb0bd00e0a40040420062a30500e0a2a342860262c6844785a68382c3",
INIT_06 => X"b1b2bdbde000b0b1bf0040000240001002000004510040000210004011008040",
INIT_07 => X"0000bfbd42e06263030400bde0b0b1b2bf12111000646440624312111080bfb0",
INIT_08 => X"000000040000802400800042e0a20083404584820563440302bde000bf620340",
INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",
INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",
INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",
@ -199,11 +199,11 @@ INIT_00 => X"00000000000000000000000000000000ff00000000ff18000600060004008400",
INIT_01 => X"000000000000000000000000000000000000002000002000d800d800ff700000",
INIT_02 => X"0000000000000010000000000000000000010060006060000000000000000000",
INIT_03 => X"0000000000201000000000000000000000000000000000000000000000000000",
INIT_04 => X"0020100000302220303000002120200020000000100010000000101000001020",
INIT_05 => X"000080000000000000ff00000010ff000000002010000000aa00aa0000200030",
INIT_06 => X"009000000000ff00001000000000ff000020000000000000ff00000000000020",
INIT_07 => X"000020ff000000ff0000000020000000000000000010ffff00000000000010ff",
INIT_08 => X"00000000000000200000002028000000000000ff001000001004040000000000",
INIT_04 => X"0031303030313000002221200020002000200010000000100010000000101020",
INIT_05 => X"0000000000ff00000010ff000000002010000000aa00aa000020003000102000",
INIT_06 => X"0000ff00001000000000ff000020000000000000ff0000000000002000008000",
INIT_07 => X"000000ff0000000020000000000000000010ffff00000000000010ff00900000",
INIT_08 => X"000000200000002028000000000000ff001000001004040000000000000020ff",
INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",
INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",
INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",
@ -272,15 +272,15 @@ INIT_3F => X"0000000000000000000000000000000000000000000000000000000000000000")
RAMB16_S9_inst3 : RAMB16_S9
generic map (
INIT_00 => X"4c4844403c3834302c2824201c181410980e008004fd2a005800700064006001",
INIT_01 => X"504c4844403c3834302c2824201c18141000f12410200060125c1058fc005450",
INIT_00 => X"4c4844403c3834302c2824201c181410980e008004fd2a006800800074007001",
INIT_01 => X"504c4844403c3834302c2824201c18141000f52410200060125c1058fc005450",
INIT_02 => X"0c08040000083c0048080c440840043c006000000800000801681360115c5854",
INIT_03 => X"00080c000810121900082c2824201c1814100c08040000082c2824201c181410",
INIT_04 => X"0006080000302204003000002120020000001413030004001211020100100000",
INIT_05 => X"0ac721160000141810e000080021fc020000200021080000aa00aa0000080004",
INIT_06 => X"1c211c101418e020082110141800f5000021ac010000ac0df8000d000001ac21",
INIT_07 => X"100000fd00f310e8010800200049ac20081014181c06f8fcac5730020a0f06fc",
INIT_08 => X"00000000000000001010200000207084080000fb002104000064440000180800",
INIT_04 => X"0031300004313000002221040002002014000004001312030002001110010000",
INIT_05 => X"0000141810e000080021fc020000200021080000aa00aa000008000800080600",
INIT_06 => X"1418e020082110141800f5000021b0010000b00df8000d000001b0210acb2116",
INIT_07 => X"00f710e8010800200049b020081014181c06f8fcb05730020a0f06fc1c211c10",
INIT_08 => X"000000001010200000207084080000fb002104000074540000180800100000fd",
INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",
INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",
INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",