]> rtime.felk.cvut.cz Git - fpga/zynq/canbench-sw.git/commitdiff
microzed_apo: 16 bit bus LCD: Implemented basic write logic.
authorPavel Pisa <pisa@cmp.felk.cvut.cz>
Tue, 14 Feb 2017 13:57:28 +0000 (14:57 +0100)
committerPavel Pisa <pisa@cmp.felk.cvut.cz>
Tue, 14 Feb 2017 13:57:28 +0000 (14:57 +0100)
Signed-off-by: Pavel Pisa <pisa@cmp.felk.cvut.cz>
system/ip/display_16bit_cmd_data_bus_1.0/component.xml
system/ip/display_16bit_cmd_data_bus_1.0/hdl/display_16bit_cmd_data_bus_v1_0.vhd
system/ip/display_16bit_cmd_data_bus_1.0/hdl/display_16bit_cmd_data_bus_v1_0_S00_AXI.vhd
system/ip/display_16bit_cmd_data_bus_1.0/hdl/display_16bit_cmd_data_bus_v1_0_io_fsm.vhd [new file with mode: 0644]
system/ip/display_16bit_cmd_data_bus_1.0/tb/Makefile [new file with mode: 0644]
system/ip/display_16bit_cmd_data_bus_1.0/tb/display_16bit_cmd_data_bus_v1_0_tb.vhd [new file with mode: 0644]

index 9426fcf3ebacb831b439cc61317639b32d91737d..230e92e947b629a01fe3e9cd78f665009ba404ca 100644 (file)
         <spirit:parameters>
           <spirit:parameter>
             <spirit:name>viewChecksum</spirit:name>
-            <spirit:value>a45e6952</spirit:value>
+            <spirit:value>99bb521e</spirit:value>
           </spirit:parameter>
         </spirit:parameters>
       </spirit:view>
         <spirit:parameters>
           <spirit:parameter>
             <spirit:name>viewChecksum</spirit:name>
-            <spirit:value>a45e6952</spirit:value>
+            <spirit:value>99bb521e</spirit:value>
           </spirit:parameter>
         </spirit:parameters>
       </spirit:view>
         <spirit:parameters>
           <spirit:parameter>
             <spirit:name>viewChecksum</spirit:name>
-            <spirit:value>48257339</spirit:value>
+            <spirit:value>b09a532b</spirit:value>
           </spirit:parameter>
         </spirit:parameters>
       </spirit:view>
         <spirit:parameters>
           <spirit:parameter>
             <spirit:name>viewChecksum</spirit:name>
-            <spirit:value>45a2f450</spirit:value>
+            <spirit:value>eb6528c9</spirit:value>
           </spirit:parameter>
         </spirit:parameters>
       </spirit:view>
         <spirit:name>hdl/display_16bit_cmd_data_bus_v1_0_S00_AXI.vhd</spirit:name>
         <spirit:fileType>vhdlSource</spirit:fileType>
       </spirit:file>
+      <spirit:file>
+        <spirit:name>hdl/display_16bit_cmd_data_bus_v1_0_io_fsm.vhd</spirit:name>
+        <spirit:fileType>vhdlSource</spirit:fileType>
+      </spirit:file>
       <spirit:file>
         <spirit:name>hdl/display_16bit_cmd_data_bus_v1_0_M00_AXI.vhd</spirit:name>
         <spirit:fileType>vhdlSource</spirit:fileType>
       <spirit:file>
         <spirit:name>hdl/display_16bit_cmd_data_bus_v1_0.vhd</spirit:name>
         <spirit:fileType>vhdlSource</spirit:fileType>
-        <spirit:userFileType>CHECKSUM_2f7b3065</spirit:userFileType>
+        <spirit:userFileType>CHECKSUM_038ef7fd</spirit:userFileType>
       </spirit:file>
     </spirit:fileSet>
     <spirit:fileSet>
         <spirit:name>hdl/display_16bit_cmd_data_bus_v1_0_S00_AXI.vhd</spirit:name>
         <spirit:fileType>vhdlSource</spirit:fileType>
       </spirit:file>
+      <spirit:file>
+        <spirit:name>hdl/display_16bit_cmd_data_bus_v1_0_io_fsm.vhd</spirit:name>
+        <spirit:fileType>vhdlSource</spirit:fileType>
+      </spirit:file>
       <spirit:file>
         <spirit:name>hdl/display_16bit_cmd_data_bus_v1_0_M00_AXI.vhd</spirit:name>
         <spirit:fileType>vhdlSource</spirit:fileType>
       <spirit:file>
         <spirit:name>xgui/display_16bit_cmd_data_bus_v1_0.tcl</spirit:name>
         <spirit:fileType>tclSource</spirit:fileType>
-        <spirit:userFileType>CHECKSUM_48257339</spirit:userFileType>
+        <spirit:userFileType>CHECKSUM_b09a532b</spirit:userFileType>
         <spirit:userFileType>XGUI_VERSION_2</spirit:userFileType>
       </spirit:file>
     </spirit:fileSet>
         <xilinx:taxonomy>AXI_Peripheral</xilinx:taxonomy>
       </xilinx:taxonomies>
       <xilinx:displayName>display_16bit_cmd_data_bus_v1.0</xilinx:displayName>
-      <xilinx:coreRevision>2</xilinx:coreRevision>
-      <xilinx:coreCreationDateTime>2017-02-09T09:19:30Z</xilinx:coreCreationDateTime>
+      <xilinx:coreRevision>4</xilinx:coreRevision>
+      <xilinx:coreCreationDateTime>2017-02-14T13:49:08Z</xilinx:coreCreationDateTime>
       <xilinx:tags>
         <xilinx:tag xilinx:name="user.org:user:display_16bit_cmd_data_bus:1.0_ARCHIVE_LOCATION">/home/pi/fpga/zynq/canbech-sw/system/ip/display_16bit_cmd_data_bus_1.0</xilinx:tag>
       </xilinx:tags>
       <xilinx:checksum xilinx:scope="busInterfaces" xilinx:value="4150380b"/>
       <xilinx:checksum xilinx:scope="addressSpaces" xilinx:value="64346dae"/>
       <xilinx:checksum xilinx:scope="memoryMaps" xilinx:value="493665f4"/>
-      <xilinx:checksum xilinx:scope="fileGroups" xilinx:value="dfb456fa"/>
-      <xilinx:checksum xilinx:scope="ports" xilinx:value="61904a51"/>
+      <xilinx:checksum xilinx:scope="fileGroups" xilinx:value="67328ef0"/>
+      <xilinx:checksum xilinx:scope="ports" xilinx:value="b78ab47f"/>
       <xilinx:checksum xilinx:scope="hdlParameters" xilinx:value="07a22c67"/>
       <xilinx:checksum xilinx:scope="parameters" xilinx:value="6eae480a"/>
     </xilinx:packagingInfo>
index 0d76b024ecdc4cf0691af3ae22bb6560d167aa57..0bfe913f3a28fa2885bda88a7466fffcaf0bd462 100644 (file)
@@ -112,7 +112,14 @@ architecture arch_imp of display_16bit_cmd_data_bus_v1_0 is
                S_AXI_RDATA     : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
                S_AXI_RRESP     : out std_logic_vector(1 downto 0);
                S_AXI_RVALID    : out std_logic;
-               S_AXI_RREADY    : in std_logic
+               S_AXI_RREADY    : in std_logic;
+
+               data_out        : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
+               dc_out          : out std_logic;
+
+               trasfer_rq      : out std_logic;
+               trasfer_rq_dbl  : out std_logic;
+               ready_for_rq    : in std_logic
                );
        end component display_16bit_cmd_data_bus_v1_0_S00_AXI;
 
@@ -152,10 +159,48 @@ architecture arch_imp of display_16bit_cmd_data_bus_v1_0 is
                );
        end component display_16bit_cmd_data_bus_v1_0_M00_AXI;
 
+       component display_16bit_cmd_data_bus_v1_0_io_fsm is
+               generic (
+               data_width      : integer       := 32;
+               lcd_io_width    : integer       := 16;
+               lcd_bus_clkdiv  : integer       := 1
+               );
+               port (
+               reset_in        : in std_logic;
+
+               clk_in          : in std_logic;
+               clk_en          : in std_logic;
+
+               lcd_res_n       : out std_logic;
+               lcd_cs_n        : out std_logic;
+               lcd_wr_n        : out std_logic;
+               lcd_rd_n        : out std_logic;
+               lcd_dc          : out std_logic;
+               lcd_data        : inout std_logic_vector(lcd_io_width-1 downto 0);
+
+               data_out        : in std_logic_vector(data_width-1 downto 0);
+               dc_out          : in std_logic;
+
+               trasfer_rq      : in std_logic;
+               trasfer_rq_dbl  : in std_logic;
+               ready_for_rq    : out std_logic
+               );
+       end component;
+
        signal m00_axi_init_axi_txn     : std_logic;
        signal m00_axi_error    : std_logic;
        signal m00_axi_txn_done : std_logic;
 
+       signal fsm_clk : std_logic;
+       signal fsm_rst : std_logic;
+
+       signal  data_out : std_logic_vector(31 downto 0);
+       signal  dc_out : std_logic;
+
+       signal  trasfer_rq : std_logic;
+       signal  trasfer_rq_dbl : std_logic;
+       signal  ready_for_rq : std_logic;
+
 begin
 
 -- Instantiation of Axi Bus Interface S00_AXI
@@ -185,7 +230,14 @@ display_16bit_cmd_data_bus_v1_0_S00_AXI_inst : display_16bit_cmd_data_bus_v1_0_S
                S_AXI_RDATA     => s00_axi_rdata,
                S_AXI_RRESP     => s00_axi_rresp,
                S_AXI_RVALID    => s00_axi_rvalid,
-               S_AXI_RREADY    => s00_axi_rready
+               S_AXI_RREADY    => s00_axi_rready,
+
+               data_out => data_out,
+               dc_out => dc_out,
+
+               trasfer_rq => trasfer_rq,
+               trasfer_rq_dbl => trasfer_rq_dbl,
+               ready_for_rq => ready_for_rq
        );
 
 -- Instantiation of Axi Bus Interface M00_AXI
@@ -224,16 +276,40 @@ display_16bit_cmd_data_bus_v1_0_M00_AXI_inst : display_16bit_cmd_data_bus_v1_0_M
                M_AXI_RREADY    => m00_axi_rready
        );
 
+display_16bit_cmd_data_bus_v1_0_io_fsm_inst: display_16bit_cmd_data_bus_v1_0_io_fsm
+       generic map (
+               data_width     => 32,
+               lcd_io_width   => 16,
+               lcd_bus_clkdiv => 1
+       )
+       port map (
+               reset_in => fsm_rst,
+               clk_in => fsm_clk,
+               clk_en => '1',
+
+               lcd_res_n => lcd_res_n,
+               lcd_cs_n => lcd_cs_n,
+               lcd_wr_n => lcd_wr_n,
+               lcd_rd_n => lcd_rd_n,
+               lcd_dc => lcd_dc,
+               lcd_data => lcd_data,
+
+               data_out => data_out,
+               dc_out => dc_out,
+
+               trasfer_rq => trasfer_rq,
+               trasfer_rq_dbl => trasfer_rq_dbl,
+               ready_for_rq => ready_for_rq
+       );
+
        -- Add user logic here
-    m00_axi_init_axi_txn <= '0';
+       fsm_clk <= s00_axi_aclk;
+       fsm_rst <= not s00_axi_aresetn;
+
+       m00_axi_init_axi_txn <= '0';
 
-    irq_rq_out <= '0';
+       irq_rq_out <= '0';
 
-    lcd_res_n <= '1';
-    lcd_cs_n <= '1';
-    lcd_wr_n <= '1';
-    lcd_rd_n <= '1';
-    lcd_dc   <= '0';
        -- User logic ends
 
 end arch_imp;
index ca8b321d44e3776d4cbea3eec208388825b797e9..182a83c0e4ad55c63520dd6ff0730483b0c31582 100644 (file)
@@ -79,7 +79,14 @@ entity display_16bit_cmd_data_bus_v1_0_S00_AXI is
                S_AXI_RVALID    : out std_logic;
                -- Read ready. This signal indicates that the master can
                -- accept the read data and response information.
-               S_AXI_RREADY    : in std_logic
+               S_AXI_RREADY    : in std_logic;
+
+               data_out        : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
+               dc_out          : out std_logic;
+
+               trasfer_rq      : out std_logic;
+               trasfer_rq_dbl  : out std_logic;
+               ready_for_rq    : in std_logic
        );
 end display_16bit_cmd_data_bus_v1_0_S00_AXI;
 
@@ -193,7 +200,8 @@ begin
            if S_AXI_ARESETN = '0' then
              axi_wready <= '0';
            else
-             if (axi_wready = '0' and S_AXI_WVALID = '1' and S_AXI_AWVALID = '1') then
+             if (axi_wready = '0' and S_AXI_WVALID = '1' and S_AXI_AWVALID = '1'
+                 and ready_for_rq = '1') then
                  -- slave is ready to accept write data when
                  -- there is a valid write address and write data
                  -- on the write address and data bus. This design
@@ -236,7 +244,15 @@ begin
              slv_reg13 <= (others => '0');
              slv_reg14 <= (others => '0');
              slv_reg15 <= (others => '0');
+
+             data_out  <= (others => '0');
+             dc_out    <= '0';
+
+             trasfer_rq <= '0';
+             trasfer_rq_dbl <= '0';
            else
+             trasfer_rq <= '0';
+
              loc_addr := axi_awaddr(ADDR_LSB + OPT_MEM_ADDR_BITS downto ADDR_LSB);
              if (slv_reg_wren = '1') then
                case loc_addr is
@@ -264,6 +280,12 @@ begin
                        slv_reg2(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8);
                      end if;
                    end loop;
+
+                   data_out  <= S_AXI_WDATA;
+                   dc_out    <= '0';
+
+                   trasfer_rq <= '1';
+                   trasfer_rq_dbl <= S_AXI_WSTRB(2);
                  when b"0011" =>
                    for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop
                      if ( S_AXI_WSTRB(byte_index) = '1' ) then
@@ -272,6 +294,12 @@ begin
                        slv_reg3(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8);
                      end if;
                    end loop;
+
+                   data_out  <= S_AXI_WDATA;
+                   dc_out    <= '1';
+
+                   trasfer_rq <= '1';
+                   trasfer_rq_dbl <= S_AXI_WSTRB(2);
                  when b"0100" =>
                    for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop
                      if ( S_AXI_WSTRB(byte_index) = '1' ) then
diff --git a/system/ip/display_16bit_cmd_data_bus_1.0/hdl/display_16bit_cmd_data_bus_v1_0_io_fsm.vhd b/system/ip/display_16bit_cmd_data_bus_1.0/hdl/display_16bit_cmd_data_bus_v1_0_io_fsm.vhd
new file mode 100644 (file)
index 0000000..0a15a7c
--- /dev/null
@@ -0,0 +1,143 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+entity display_16bit_cmd_data_bus_v1_0_io_fsm is
+       generic (
+               data_width      : integer       := 32;
+               lcd_io_width    : integer       := 16;
+               lcd_bus_clkdiv  : integer       := 1
+       );
+       port (
+               reset_in        : in std_logic;
+
+               clk_in          : in std_logic;
+               clk_en          : in std_logic;
+
+               lcd_res_n       : out std_logic;
+               lcd_cs_n        : out std_logic;
+               lcd_wr_n        : out std_logic;
+               lcd_rd_n        : out std_logic;
+               lcd_dc          : out std_logic;
+               lcd_data        : inout std_logic_vector(lcd_io_width-1 downto 0);
+
+               data_out        : in std_logic_vector(data_width-1 downto 0);
+               dc_out          : in std_logic;
+
+               trasfer_rq      : in std_logic;
+               trasfer_rq_dbl  : in std_logic;
+               ready_for_rq    : out std_logic
+       );
+end display_16bit_cmd_data_bus_v1_0_io_fsm;
+
+architecture arch_imp of display_16bit_cmd_data_bus_v1_0_io_fsm is
+
+       type    io_states       is (is_iddle, is_wrini, is_wr0, is_wr1,
+                                   is_wr2, is_wrfin);
+       signal  io_state_r      : io_states;
+       signal  trasfer_rq_dbl_r : std_logic;
+
+       signal  div_cnt         : natural range 0 to lcd_bus_clkdiv-1;
+       signal  data_out_r      : std_logic_vector(data_width-1 downto 0);
+       signal  dc_out_r        : std_logic;
+
+begin
+
+       process is
+       begin
+         wait until rising_edge (clk_in);
+         if ( reset_in = '1' ) then
+           div_cnt   <= lcd_bus_clkdiv-1;
+           ready_for_rq <= '0';
+           io_state_r  <= is_iddle;
+           lcd_res_n   <= '0';
+           lcd_cs_n    <= '1';
+           lcd_wr_n    <= '1';
+           lcd_rd_n    <= '1';
+           lcd_dc      <= '1';
+           lcd_data    <= (others => 'Z');
+         elsif (clk_en = '1') then
+           lcd_res_n  <= '1';
+           if trasfer_rq = '1' and io_state_r = is_iddle then
+             data_out_r  <= data_out;
+             dc_out_r  <= dc_out;
+             trasfer_rq_dbl_r <= trasfer_rq_dbl;
+             io_state_r  <= is_wrini;
+           end if;
+           if (div_cnt /= 0) then
+             div_cnt <= div_cnt - 1;
+           else
+             div_cnt   <= lcd_bus_clkdiv-1;
+             case io_state_r is
+
+             when is_iddle =>
+               if trasfer_rq = '1' then
+                 ready_for_rq <= '0';
+                 io_state_r <= is_wr0;
+                 lcd_data   <= data_out(lcd_io_width-1 downto 0);
+                 lcd_dc     <= dc_out;
+                 lcd_cs_n   <= '0';
+                 lcd_wr_n   <= '1';
+                 lcd_rd_n   <= '1';
+               else
+                 ready_for_rq <= '1';
+                 lcd_data   <= (others => 'Z');
+                 lcd_cs_n   <= '1';
+                 lcd_wr_n   <= '1';
+                 lcd_rd_n   <= '1';
+               end if;
+             when is_wrini =>
+               ready_for_rq <= '0';
+               io_state_r <= is_wr0;
+               lcd_data   <= data_out_r(lcd_io_width-1 downto 0);
+               lcd_dc     <= dc_out_r;
+               lcd_cs_n   <= '0';
+               lcd_wr_n   <= '1';
+               lcd_rd_n   <= '1';
+             when is_wr0 =>
+               ready_for_rq <= '0';
+               io_state_r <= is_wr1;
+               lcd_data   <= data_out_r(lcd_io_width-1 downto 0);
+               lcd_dc     <= dc_out_r;
+               lcd_cs_n   <= '0';
+               lcd_wr_n   <= '0';
+             when is_wr1 =>
+               ready_for_rq <= '0';
+               io_state_r <= is_wr2;
+               lcd_data   <= data_out_r(lcd_io_width-1 downto 0);
+               lcd_dc     <= dc_out_r;
+               lcd_cs_n   <= '0';
+               lcd_wr_n   <= '0';
+             when is_wr2 =>
+               ready_for_rq <= '0';
+               io_state_r <= is_wrfin;
+               lcd_data   <= data_out_r(lcd_io_width-1 downto 0);
+               lcd_dc     <= dc_out_r;
+               lcd_cs_n   <= '0';
+               lcd_wr_n   <= '1';
+             when is_wrfin =>
+               lcd_data   <= data_out_r(lcd_io_width-1 downto 0);
+               lcd_dc     <= dc_out_r;
+               if trasfer_rq_dbl_r = '1' then
+                 ready_for_rq <= '0';
+                 io_state_r <= is_wrini;
+                 data_out_r(lcd_io_width-1 downto 0) <=
+                      data_out_r(2 * lcd_io_width-1 downto lcd_io_width);
+                 trasfer_rq_dbl_r <= '0';
+                 lcd_cs_n   <= '0';
+                 lcd_wr_n   <= '1';
+               else
+                 ready_for_rq <= '1';
+                 io_state_r <= is_iddle;
+                 lcd_data     <= (others => 'Z');
+                 lcd_cs_n   <= '0';
+                 lcd_wr_n   <= '1';
+                 lcd_cs_n   <= '0';
+                 lcd_wr_n   <= '1';
+               end if;
+             end case;
+           end if;
+         end if;
+       end process;
+
+end arch_imp;
diff --git a/system/ip/display_16bit_cmd_data_bus_1.0/tb/Makefile b/system/ip/display_16bit_cmd_data_bus_1.0/tb/Makefile
new file mode 100644 (file)
index 0000000..4f6991d
--- /dev/null
@@ -0,0 +1,45 @@
+GHDL=ghdl
+
+core_DIR=../hdl
+core_SRC=display_16bit_cmd_data_bus_v1_0_io_fsm.vhd
+
+tb_DIR=.
+tb_SRC=display_16bit_cmd_data_bus_v1_0_tb.vhd
+
+MODULES=core tb
+
+TOP_COMPONENT = display_16bit_cmd_data_bus_tb
+
+SRC=$(foreach m, $(MODULES), $($(m)_SRC:%=$($(m)_DIR)/%))
+
+$(warning SRC=$(SRC))
+
+#SRC+=mapo_tb.vhd
+
+CFLAGS += -Wall
+
+GHDLFLAGS+=
+ANALYZEFLAGS+=--std=93c --ieee=synopsys -fexplicit -ggdb
+
+#SIM_FLAGS=--stop-time=1000ns #--ieee-asserts=disable
+
+all:   test-mapo
+
+convert_bin2bits : convert_bin2bits.o
+
+imem.bits : imem.bin convert_bin2bits
+       ./convert_bin2bits $< >$@
+
+# imem.bits
+test-mapo: analyze-all
+       $(GHDL) $(GHDLFLAGS) -m $(ANALYZEFLAGS) $(TOP_COMPONENT)
+       $(GHDL) $(GHDLFLAGS) -r $(TOP_COMPONENT) --stop-time=2000ns --vcd=$@.vcd --wave=$@.ghw
+
+analyze-all: $(SRC)
+       $(GHDL) $(GHDLFLAGS) -a $(ANALYZEFLAGS) $(SRC)
+
+clean:
+       rm -f convert_bin2bits
+       rm -f *.o
+       $(GHDL) --clean
+       $(RM) work-obj93.cf
diff --git a/system/ip/display_16bit_cmd_data_bus_1.0/tb/display_16bit_cmd_data_bus_v1_0_tb.vhd b/system/ip/display_16bit_cmd_data_bus_1.0/tb/display_16bit_cmd_data_bus_v1_0_tb.vhd
new file mode 100644 (file)
index 0000000..f4d87a6
--- /dev/null
@@ -0,0 +1,153 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+entity display_16bit_cmd_data_bus_tb is
+end display_16bit_cmd_data_bus_tb;
+
+architecture arch_imp of display_16bit_cmd_data_bus_tb is
+
+       component display_16bit_cmd_data_bus_v1_0_io_fsm is
+       generic (
+               data_width      : integer       := 32;
+               lcd_io_width    : integer       := 16;
+               lcd_bus_clkdiv  : integer       := 1
+       );
+       port (
+               reset_in        : in std_logic;
+
+               clk_in          : in std_logic;
+               clk_en          : in std_logic;
+
+               lcd_res_n       : out std_logic;
+               lcd_cs_n        : out std_logic;
+               lcd_wr_n        : out std_logic;
+               lcd_rd_n        : out std_logic;
+               lcd_dc          : out std_logic;
+               lcd_data        : inout std_logic_vector(lcd_io_width-1 downto 0);
+
+               data_out        : in std_logic_vector(data_width-1 downto 0);
+               dc_out          : in std_logic;
+
+               trasfer_rq      : in std_logic;
+               trasfer_rq_dbl  : in std_logic;
+               ready_for_rq    : out std_logic
+       );
+       end component;
+
+       constant clk_period : time := 10 ns;
+
+       signal clk : std_logic := '0';
+       signal rst : std_logic := '1';
+
+       signal  lcd_res_n : std_logic;
+       signal  lcd_cs_n : std_logic;
+       signal  lcd_wr_n : std_logic;
+       signal  lcd_rd_n : std_logic;
+       signal  lcd_dc : std_logic;
+       signal  lcd_data : std_logic_vector(15 downto 0);
+
+       signal  data_out : std_logic_vector(31 downto 0);
+       signal  dc_out : std_logic;
+
+       signal  trasfer_rq : std_logic;
+       signal  trasfer_rq_dbl : std_logic;
+       signal  ready_for_rq : std_logic;
+
+begin
+
+       -- Instantiate the Unit Under Test (UUT)
+   uut: display_16bit_cmd_data_bus_v1_0_io_fsm
+       generic map (
+               data_width     => 32,
+               lcd_io_width   => 16,
+               lcd_bus_clkdiv => 1
+       )
+       port map (
+               reset_in => rst,
+               clk_in => clk,
+               clk_en => '1',
+
+               lcd_res_n => lcd_res_n,
+               lcd_cs_n => lcd_cs_n,
+               lcd_wr_n => lcd_wr_n,
+               lcd_rd_n => lcd_rd_n,
+               lcd_dc => lcd_dc,
+               lcd_data => lcd_data,
+
+               data_out => data_out,
+               dc_out => dc_out,
+
+               trasfer_rq => trasfer_rq,
+               trasfer_rq_dbl => trasfer_rq_dbl,
+               ready_for_rq => ready_for_rq
+       );
+
+       data_out <= "10110001111111111011000100000000";
+
+       clk_process :process
+       begin
+               clk <= '1';
+               wait for clk_period/2;
+               clk <= '0';
+               wait for clk_period/2;
+       end process;
+
+       test_process :process
+       begin
+               trasfer_rq <= '0';
+               trasfer_rq_dbl <= '0';
+               dc_out <= '1';
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               rst <= '0';
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               trasfer_rq <= '1';
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               trasfer_rq <= '0';
+               dc_out <= '0';
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               trasfer_rq <= '1';
+               trasfer_rq_dbl <= '1';
+               wait until rising_edge (clk);
+               trasfer_rq <= '0';
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+               wait until rising_edge (clk);
+       end process;
+
+end arch_imp;