搜索
bottom↓
回复: 9

SDRAM_Memory_Controller 参考代码

[复制链接]

出0入0汤圆

发表于 2012-5-7 11:19:09 | 显示全部楼层 |阅读模式
http://hamsterworks.co.nz/mediawiki/index.php/SDRAM_Memory_Controller

This is my design for a memory controller for my Terasic DE0-nano FPGA board, which uses the ISSI IS42S16160B-7 32MB SDRAM chip

Although aimed at 100MHz all of the designs below can be adapted to other clock speeds. The only changes needed are to increase the number of NOPs in the refresh chain to ensure that it takes at least 70ns.

Adapting to a CAS setting of 2 is only a little bit more difficult, as the data is available one cycle earlier. A CAS of 2 can only be used with a clock speed of 100MHz, and will make the biggest difference with the simple FSM where it saves a cycle on every read, or in the most complex where it saves a cycle flipping between reads and writes.

The priority should be first to perform any pending refresh, but priority of performing reads over writes depends on your target application. For example if you are generating a VGA video signal reads should take priority over writes otherwise "tearing" of the picture could occur.

I might not be completely following accepted conventions, but the idea behind the directed graphs in this context are that as you follow the arrows from node to node you will always generate a valid set of commands for the SDRAM. For each clock tick you must follow an arrow, so at 100MHz it takes 10ns to go from node to node, allowing you to partially verify the design on paper.




(Blue circles are data transfers from the SDRAM, red circles are data transfers to the SDRAM)












本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

 楼主| 发表于 2012-5-7 11:21:58 | 显示全部楼层

  1. -- FSM for a SDRAM controller
  2. --
  3. -- Version 0.1 - Ready to simulate
  4. --
  5. -- Author: Mike Field (hamster@snap.net.nz)
  6. --
  7. -- Feel free to use it however you would like, but
  8. -- just drop me an email to say thanks.
  9. -------------------------------------------------------
  10. library ieee;
  11. use ieee.std_logic_1164.all;
  12. use ieee.std_logic_unsigned.all;

  13. entity sdram_controller is
  14.   port (
  15.     CLOCK_50 : in STD_LOGIC;

  16.    -- Signals to/from the SDRAM chip
  17.     DRAM_ADDR  : out   STD_LOGIC_VECTOR (12 downto 0);
  18.     DRAM_BA    : out   STD_LOGIC_VECTOR (1 downto 0);
  19.     DRAM_CAS_N : out   STD_LOGIC;
  20.     DRAM_CKE   : out   STD_LOGIC;
  21.     DRAM_CLK   : out   STD_LOGIC;
  22.     DRAM_CS_N  : out   STD_LOGIC;
  23.     DRAM_DQ    : inout STD_LOGIC_VECTOR(15 downto 0);
  24.     DRAM_DQM   : out   STD_LOGIC_VECTOR(1 downto 0);
  25.     DRAM_RAS_N : out   STD_LOGIC;
  26.     DRAM_WE_N  : out   STD_LOGIC;

  27.    --- Inputs from rest of the system
  28.     address        : in     STD_LOGIC_VECTOR (23 downto 0);
  29.     req_read       : in     STD_LOGIC;
  30.     req_write      : in     STD_LOGIC;
  31.     data_out       : out     STD_LOGIC_VECTOR (31 downto 0);
  32.     data_out_valid : out     STD_LOGIC;
  33.     data_in        : in     STD_LOGIC_VECTOR (31 downto 0)
  34.   );
  35. end entity;


  36. architecture rtl of sdram_controller is


  37.   type reg is record
  38.     state          : std_logic_vector(8 downto 0);
  39.     address        : std_logic_vector(12 downto 0);
  40.     bank           : std_logic_vector( 1 downto 0);
  41.     init_counter   : std_logic_vector(14 downto 0);
  42.     rf_counter     : std_logic_vector( 9 downto 0);
  43.     rf_pending     : std_logic;
  44.     rd_pending     : std_logic;
  45.     wr_pending     : std_logic;
  46.     act_row        : std_logic_vector(12 downto 0);
  47.     data_out_low   : std_logic_vector(15 downto 0);
  48.     data_out_valid : std_logic;
  49.     dq_masks       : std_logic_vector(1 downto 0);
  50.   end record;

  51.   component sdram_clk_gen
  52.     port
  53.    (
  54.       inclk0 : in  STD_LOGIC;
  55.       c0     : out STD_LOGIC;
  56.       c1     : out STD_LOGIC
  57.     );
  58.   end component;

  59.    -- note to self - this constant should be "(others => '0')" when not simulating!!!
  60.   signal r : reg := ((others => '0'), (others => '0'),
  61.     (others => '0'), "000000000001000", (others => '0'),
  62.     '0', '0', '0', (others => '0'), (others => '0'), '0', (others => '0'));
  63.   signal n : reg;

  64.    -- Vectors for each SDRAM 'command'
  65.    --- CS_N, RAS_N, CAS_N, WE_N
  66.   constant cmd_nop   : std_logic_vector(3 downto 0) := "0111";
  67.   constant cmd_read  : std_logic_vector(3 downto 0) := "0101";   -- Must be sure A10 is low.
  68.   constant cmd_write : std_logic_vector(3 downto 0) := "0100";
  69.   constant cmd_act   : std_logic_vector(3 downto 0) := "0011";
  70.   constant cmd_pre   : std_logic_vector(3 downto 0) := "0010";  -- Must set A10 to '1'.
  71.   constant cmd_ref   : std_logic_vector(3 downto 0) := "0001";
  72.   constant cmd_mrs   : std_logic_vector(3 downto 0) := "0000"; -- Mode register set
  73.    -- State assignments
  74.   constant s_init_nop : std_logic_vector(8 downto 0) := "00000" & cmd_nop;
  75.   constant s_init_pre : std_logic_vector(8 downto 0) := "00000" & cmd_pre;
  76.   constant s_init_ref : std_logic_vector(8 downto 0) := "00000" & cmd_ref;
  77.   constant s_init_mrs : std_logic_vector(8 downto 0) := "00000" & cmd_mrs;

  78.   constant s_idle : std_logic_vector(8 downto 0) := "00001" & cmd_nop;

  79.   constant s_rf0 : std_logic_vector(8 downto 0) := "00010" & cmd_ref;
  80.   constant s_rf1 : std_logic_vector(8 downto 0) := "00011" & cmd_nop;
  81.   constant s_rf2 : std_logic_vector(8 downto 0) := "00100" & cmd_nop;
  82.   constant s_rf3 : std_logic_vector(8 downto 0) := "00101" & cmd_nop;
  83.   constant s_rf4 : std_logic_vector(8 downto 0) := "00110" & cmd_nop;
  84.   constant s_rf5 : std_logic_vector(8 downto 0) := "00111" & cmd_nop;

  85.   constant s_ra0 : std_logic_vector(8 downto 0) := "01000" & cmd_act;
  86.   constant s_ra1 : std_logic_vector(8 downto 0) := "01001" & cmd_nop;
  87.   constant s_ra2 : std_logic_vector(8 downto 0) := "01010" & cmd_nop;

  88.   constant s_dr0 : std_logic_vector(8 downto 0) := "01011" & cmd_pre;
  89.   constant s_dr1 : std_logic_vector(8 downto 0) := "01100" & cmd_nop;

  90.   constant s_wr0 : std_logic_vector(8 downto 0) := "01101" & cmd_write;
  91.   constant s_wr1 : std_logic_vector(8 downto 0) := "01110" & cmd_nop;
  92.   constant s_wr2 : std_logic_vector(8 downto 0) := "01111" & cmd_nop;
  93.   constant s_wr3 : std_logic_vector(8 downto 0) := "10000" & cmd_nop;

  94.   constant s_rd0 : std_logic_vector(8 downto 0) := "10001" & cmd_read;
  95.   constant s_rd1 : std_logic_vector(8 downto 0) := "10010" & cmd_nop;
  96.   constant s_rd2 : std_logic_vector(8 downto 0) := "10011" & cmd_nop;
  97.   constant s_rd3 : std_logic_vector(8 downto 0) := "10100" & cmd_nop;
  98.   constant s_rd4 : std_logic_vector(8 downto 0) := "10101" & cmd_read;
  99.   constant s_rd5 : std_logic_vector(8 downto 0) := "10110" & cmd_nop;
  100.   constant s_rd6 : std_logic_vector(8 downto 0) := "10111" & cmd_nop;
  101.   constant s_rd7 : std_logic_vector(8 downto 0) := "11000" & cmd_nop;
  102.   constant s_rd8 : std_logic_vector(8 downto 0) := "11001" & cmd_nop;
  103.   constant s_rd9 : std_logic_vector(8 downto 0) := "11011" & cmd_nop;

  104.   constant s_drdr0 : std_logic_vector(8 downto 0) := "11101" & cmd_pre;
  105.   constant s_drdr1 : std_logic_vector(8 downto 0) := "11110" & cmd_nop;
  106.   constant s_drdr2 : std_logic_vector(8 downto 0) := "11111" & cmd_nop;

  107.   signal addr_row  : std_logic_vector(12 downto 0);
  108.   signal addr_bank : std_logic_vector(1 downto 0);
  109.   signal addr_col  : std_logic_vector(9 downto 0);

  110.   signal captured : std_logic_vector(15 downto 0);

  111.   signal clock_100             : std_logic;
  112.   signal clock_100_delayed_3ns : std_logic;
  113. begin
  114.    -- Addressing is in 32 bit words - twice that of the DRAM width,
  115.    -- so each burst of four access two system words.
  116.   addr_row  <= address(23 downto 11);
  117.   addr_bank <= address(10 downto 9);
  118.   addr_col  <= address(8 downto  1) & "00";

  119.   sdram_clk_pll : sdram_clk_gen

  120.    -- Generate the 100MHz clock and the same phase shifted by 3ns
  121.   port map
  122.    (
  123.     inclk0 => CLOCK_50,
  124.     c0     => clock_100,
  125.     c1     => clock_100_delayed_3ns
  126.   );

  127.   DRAM_CLK       <= clock_100_delayed_3ns;
  128.   DRAM_CKE       <= '1';
  129.   DRAM_CS_N      <= r.state(3);
  130.   DRAM_RAS_N     <= r.state(2);
  131.   DRAM_CAS_N     <= r.state(1);
  132.   DRAM_WE_N      <= r.state(0);
  133.   DRAM_ADDR      <= r.address;
  134.   DRAM_BA        <= r.bank;
  135.   DATA_OUT       <= captured & r.data_out_low;
  136.   DRAM_DQM       <= r.dq_masks;
  137.   data_out_valid <= r.data_out_valid;

  138.   process (r, address, req_read, req_write, addr_row, addr_bank, addr_col, data_in, captured)
  139.   begin
  140.       -- copy the existing values
  141.     n <= r;
  142.     if req_read = '1' then
  143.       n.rd_pending <= '1';
  144.     end if;

  145.     if req_write = '1' then
  146.       n.wr_pending <= '1';
  147.     end if;

  148.     n.dq_masks <= "11";

  149.       -- first off, do we need to perform a refresh cycle ASAP?
  150.     if r.rf_counter = 770 then -- 781 = 64,000,000ns / 8192 / 10ns
  151.       n.rf_counter <= (others => '0');
  152.       n.rf_pending <= '1';
  153.     else
  154.          -- only start looking for refreshes outside of the initialisation state.
  155.       if not(r.state(8 downto 4) = s_init_nop(8 downto 4)) then
  156.         n.rf_counter <= r.rf_counter + 1;
  157.       end if;
  158.     end if;

  159.       -- Set the data bus into HIZ, high and low bytes masked
  160.     DRAM_DQ <= (others => 'Z');

  161.     n.init_counter <= r.init_counter-1;

  162.       -- Process the FSM
  163.     case r.state(8 downto 4) is
  164.       when s_init_nop(8 downto 4) =>
  165.         n.state          <= s_init_nop;
  166.         n.address        <= (others => '0');
  167.         n.bank           <= (others => '0');
  168.         n.rf_counter     <= (others => '0');
  169.         n.data_out_valid <= '1';

  170.             -- T-130, precharge all banks.
  171.         if r.init_counter = "000000010000010" then
  172.           n.state       <= s_init_pre;
  173.           n.address(10) <= '1';
  174.         end if;

  175.             -- T-127, T-111, T-95, T-79, T-63, T-47, T-31, T-15, the 8 refreshes

  176.         if r.init_counter(14 downto 7) = 0 and r.init_counter(3 downto 0) = 15 then
  177.           n.state <= s_init_ref;
  178.         end if;

  179.             -- T-3, the load mode register
  180.         if r.init_counter = 3 then
  181.           n.state <= s_init_mrs;
  182.                            -- Mode register is as follows:
  183.                            -- resvd   wr_b   OpMd   CAS=3   Seq   bust=4
  184.           n.address <= "000" & "0" & "00" & "011" & "0" & "010";
  185.                            -- resvd
  186.           n.bank <= "00";
  187.         end if;


  188.             -- T-1 The switch to the FSM (first command will be a NOP
  189.         if r.init_counter = 1 then
  190.           n.state <= s_idle;
  191.         end if;

  192.          ------------------------------
  193.          -- The Idle section
  194.          ------------------------------
  195.       when s_idle(8 downto 4) =>
  196.         n.state <= s_idle;

  197.             -- do we have to activate a row?
  198.         if r.rd_pending = '1' or r.wr_pending = '1' then
  199.           n.state   <= s_ra0;
  200.           n.address <= addr_row;
  201.           n.act_row <= addr_row;
  202.         end if;

  203.             -- refreshes take priority over everything
  204.         if r.rf_pending = '1' then
  205.           n.state      <= s_rf0;
  206.           n.rf_pending <= '0';
  207.         end if;
  208.          ------------------------------
  209.          -- Row activation
  210.          -- s_ra2 is also the "idle with active row" state and provides
  211.          -- a resting point between operations on the same row
  212.          ------------------------------
  213.       when s_ra0(8 downto 4) =>
  214.         n.state <= s_ra1;
  215.       when s_ra1(8 downto 4) =>
  216.         n.state <= s_ra2;
  217.       when s_ra2(8 downto 4) =>
  218.             -- we can stay in this state until we have something to do
  219.         n.state <= s_ra2;

  220.             -- If there is a read pending, deactivate the row
  221.         if r.rd_pending = '1' or r.wr_pending = '1' then
  222.           n.state       <= s_dr0;
  223.           n.address(10) <= '1';
  224.         end if;

  225.             -- unless we have a read to perform on the same row? do that instead
  226.         if r.rd_pending = '1' and r.act_row = addr_row then
  227.           n.state      <= s_rd0;
  228.           n.address    <= "000" & addr_col;
  229.           n.bank       <= addr_bank;
  230.           n.dq_masks   <= "00";
  231.           n.rd_pending <= '0';
  232.         end if;

  233.             -- unless we have a write on the same row? writes take priroty over reads
  234.         if r.wr_pending = '1' and r.act_row = addr_row then
  235.           n.state      <= s_wr0;
  236.           n.address    <= "000" & addr_col;
  237.           n.bank       <= addr_bank;
  238.           n.dq_masks   <= "00";
  239.           n.wr_pending <= '0';
  240.         end if;

  241.             -- But refreshes take piority over everything!
  242.         if r.rf_pending = '1' then
  243.           n.state       <= s_dr0;
  244.           n.address(10) <= '1';
  245.         end if;

  246.          ------------------------------------------------------
  247.          -- Deactivate the current row and return to idle state
  248.          ------------------------------------------------------
  249.       when s_dr0(8 downto 4) =>
  250.         n.state <= s_dr1;
  251.       when s_dr1(8 downto 4) =>
  252.         n.state <= s_idle;

  253.          ------------------------------
  254.          -- The Refresh section
  255.          ------------------------------
  256.       when s_rf0(8 downto 4) =>
  257.         n.state <= s_rf1;
  258.       when s_rf1(8 downto 4) =>
  259.         n.state <= s_rf2;
  260.       when s_rf2(8 downto 4) =>
  261.         n.state <= s_rf3;
  262.       when s_rf3(8 downto 4) =>
  263.         n.state <= s_rf4;
  264.       when s_rf4(8 downto 4) =>
  265.         n.state <= s_rf5;
  266.       when s_rf5(8 downto 4) =>
  267.         n.state <= s_idle;
  268.          ------------------------------
  269.          -- The Write section
  270.          ------------------------------
  271.       when s_wr0(8 downto 4) =>
  272.         n.state    <= s_wr1;
  273.         n.address  <= "000" & addr_col;
  274.         n.bank     <= addr_bank;
  275.         DRAM_DQ    <= data_in(15 downto 0);
  276.         n.dq_masks <= "00";
  277.       when s_wr1(8 downto 4) =>
  278.         n.state    <= s_wr2;
  279.         DRAM_DQ    <= data_in(31 downto 16);
  280.         n.dq_masks <= "00";
  281.       when s_wr2(8 downto 4) =>
  282.         DRAM_DQ    <= data_in(15 downto 0);
  283.         n.state    <= s_wr3;
  284.         n.dq_masks <= "00";
  285.       when s_wr3(8 downto 4) =>
  286.             -- Default to the idle+row active state
  287.         n.state    <= s_ra2;
  288.         DRAM_DQ    <= data_in(31 downto 16);
  289.         n.dq_masks <= "11";

  290.             -- If there is a read or write then deactivate the row
  291.         if r.rd_pending = '1' or r.wr_pending = '1' then
  292.           n.state       <= s_dr0;
  293.           n.address(10) <= '1';
  294.         end if;

  295.             -- But if there is a read pending in the same row, do that
  296.         if r.rd_pending = '1' and r.act_row = addr_row then
  297.           n.state      <= s_rd0;
  298.           n.address    <= "000" & addr_col;
  299.           n.bank       <= addr_bank;
  300.           n.dq_masks   <= "00";
  301.           n.rd_pending <= '0';
  302.         end if;

  303.             -- unless there is a write pending in the same row, do that
  304.         if r.wr_pending = '1' and r.act_row = addr_row then
  305.           n.state      <= s_wr0;
  306.           n.address    <= "000" & addr_col;
  307.           n.bank       <= addr_bank;
  308.           n.dq_masks   <= "00";
  309.           n.wr_pending <= '0';
  310.         end if;

  311.             -- But always try and refresh if one is pending!
  312.         if r.rf_pending = '1' then
  313.           n.state       <= s_dr0;
  314.           n.address(10) <= '1';
  315.         end if;

  316.          ------------------------------
  317.          -- The Read section
  318.          ------------------------------
  319.       when s_rd0(8 downto 4) =>
  320.         n.state    <= s_rd1;
  321.         n.dq_masks <= "00";
  322.       when s_rd1(8 downto 4) =>
  323.         n.state    <= s_rd2;
  324.         n.dq_masks <= "00";
  325.       when s_rd2(8 downto 4) =>
  326.         n.state    <= s_rd3;
  327.         n.dq_masks <= "00";
  328.       when s_rd3(8 downto 4) =>
  329.             -- default is to end the read with the row open
  330.         n.state <= s_rd7;

  331.             -- otherwise if there is a read or write prepare to deactivate the row.
  332.             -- (This is overridden if the read/write is to the same page)
  333.         if r.rd_pending = '1' or r.wr_pending = '1' then
  334.           n.state       <= s_drdr0;
  335.           n.address(10) <= '1';
  336.         end if;

  337.             -- override if the write is from the same row
  338.         if r.wr_pending = '1' and r.act_row = addr_row then
  339.           n.state <= s_rd7;
  340.         end if;

  341.             -- override if the read is from the same row
  342.         if r.rd_pending = '1' and r.act_row = addr_row then
  343.           n.state    <= s_rd4;
  344.           n.address  <= "000" & addr_col;
  345.           n.bank     <= addr_bank;
  346.           n.dq_masks <= "00";
  347.         end if;

  348.                -- If a refresh is pending then always deactivate the row
  349.         if r.rf_pending = '1' then
  350.           n.state       <= s_drdr0;
  351.           n.address(10) <= '1';
  352.         end if;
  353.         n.data_out_low   <= captured;
  354.         n.data_out_valid <= '1';
  355.       when s_rd4(8 downto 4) =>
  356.         n.state    <= s_rd5;
  357.         n.dq_masks <= "00";
  358.       when s_rd5(8 downto 4) =>
  359.         n.state          <= s_rd6;
  360.         n.data_out_low   <= captured;
  361.         n.data_out_valid <= '1';
  362.         n.dq_masks       <= "00";
  363.       when s_rd6(8 downto 4) =>
  364.         n.state    <= s_rd3;
  365.         n.dq_masks <= "00";
  366.       when s_rd7(8 downto 4) =>
  367.         n.state          <= s_rd8;
  368.         n.data_out_low   <= captured;
  369.         n.data_out_valid <= '1';
  370.       when s_rd8(8 downto 4) =>
  371.         n.state <= s_rd9;
  372.       when s_rd9(8 downto 4) =>
  373.             -- by default go to the idle-with-row-active state
  374.         n.state          <= s_ra2;
  375.         n.data_out_low   <= captured;
  376.         n.data_out_valid <= '1';

  377.             -- otherwise if there is a read or write prepare to deactivate the row.
  378.             -- (This is overridden if the read/write is to the same row)
  379.         if r.rd_pending = '1' or r.wr_pending = '1' then
  380.           n.state       <= s_dr0;
  381.           n.address(10) <= '1';
  382.         end if;

  383.             -- this is to catch if a read has turned up since the choices at state s_dr3
  384.         if r.rd_pending = '1' and r.act_row = addr_row then
  385.           n.state      <= s_rd0;
  386.           n.address    <= "000" & addr_col;
  387.           n.bank       <= addr_bank;
  388.           n.dq_masks   <= "00";
  389.           n.rd_pending <= '0';
  390.         end if;

  391.             -- this is to catch if a read has turned up since the choices at state s_dr3
  392.         if r.wr_pending = '1' and r.act_row = addr_row then
  393.           n.state      <= s_wr0;
  394.           n.address    <= "000" & addr_col;
  395.           n.bank       <= addr_bank;
  396.           n.dq_masks   <= "00";
  397.           n.wr_pending <= '0';
  398.         end if;

  399.         if r.rf_pending = '1' then
  400.           n.state       <= s_dr0;
  401.           n.address(10) <= '1';
  402.         end if;

  403.          ------------------------------
  404.          -- The Deactivate row during read section
  405.          ------------------------------
  406.       when s_drdr0(8 downto 4) =>
  407.         n.state <= s_drdr1;
  408.       when s_drdr1(8 downto 4) =>
  409.         n.state          <= s_drdr2;
  410.         n.data_out_low   <= captured;
  411.         n.data_out_valid <= '1';
  412.       when s_drdr2(8 downto 4) =>
  413.         n.state <= s_idle;

  414.         if r.rf_pending = '1' then
  415.           n.state <= s_rf0;
  416.         end if;

  417.         if r.rd_pending = '1' or r.wr_pending = '1' then
  418.           n.state   <= s_ra0;
  419.           n.address <= addr_row;
  420.           n.act_row <= addr_row;
  421.           n.bank    <= addr_bank;
  422.         end if;

  423.       when others =>
  424.         n.state <= s_init_nop;
  425.     end case;
  426.   end process;

  427.    --- The clock driven logic
  428.   process (clock_100, n)
  429.   begin
  430.     if clock_100'event and clock_100 = '1' then
  431.       r <= n;
  432.     end if;
  433.   end process;

  434.   process (clock_100_delayed_3ns, dram_dq)
  435.   begin
  436.     if clock_100_delayed_3ns'event and clock_100_delayed_3ns = '1' then
  437.       captured <= dram_dq;
  438.     end if;
  439.   end process;

  440. end rtl;

复制代码

出0入0汤圆

发表于 2012-5-7 11:27:10 来自手机 | 显示全部楼层
谢楼主分享

出0入0汤圆

发表于 2012-5-30 15:05:52 | 显示全部楼层
....学习了。。。谢谢

出0入0汤圆

发表于 2012-5-30 19:47:04 | 显示全部楼层
mark!!!!!!!!!!!!

出0入0汤圆

发表于 2012-6-1 22:48:59 | 显示全部楼层
mark,

出0入0汤圆

发表于 2013-5-8 10:01:39 | 显示全部楼层
正要学,就来了。

出0入0汤圆

发表于 2013-8-8 15:59:35 | 显示全部楼层
正好在学习,MARK一下                  

出0入0汤圆

发表于 2013-8-9 13:40:17 | 显示全部楼层
mark            

出0入0汤圆

发表于 2014-5-9 10:20:29 | 显示全部楼层
正在学习中
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 17:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表