Важная информация

User Tag List

Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 19 из 19

Тема: AY-3-8910 in FPGA

  1. #11
    Master Аватар для syd
    Регистрация
    21.11.2006
    Адрес
    Киев
    Сообщений
    618
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    7
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Бага в T80 . Инструкция OUTD не уменьшала HL. Теперь все ок.
    Speccy2007 v1.06
    Speccy2010 v1.00

  2. #12
    Moderator
    Регистрация
    25.11.2007
    Адрес
    Симферополь
    Сообщений
    2,164
    Спасибо Благодарностей отдано 
    1
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    покажи демо платку хоть
    Amiga 1200+Blizzard 1260 72 Mb+Mtek 68030,Compozit 128, Leningrad 2,
    Atari STE 1040,ZX Spectrum +2,Pentagon 48, Speccy2007 - 2 , ATAS 256k.
    ZX Evo 4Mb- в строю.
    Speccy2010 v1
    Специалист (пока готовлюсь к восстановлению).
    Это все мое!
    Родное!
    Все люблю на свете я! Это родина моя!

  3. #13
    Member
    Регистрация
    13.02.2010
    Адрес
    г. Харьков
    Сообщений
    127
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А нельзя ли выложить примеры

  4. #14
    Guru Аватар для Vslav
    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    755
    Поблагодарили
    353 сообщений
    Mentioned
    86 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Прикольно, а ЦАП в AY-3-8910 очень похож на 7-битный:



    Желтыми линиями обозначены каналы транзисторов, подключены параллельно. Длиннее канал - больше сопротивление.

  5. #15
    Guru Аватар для HardWareMan
    Регистрация
    26.02.2011
    Адрес
    г. Павлодар, Казахстан
    Сообщений
    4,404
    Спасибо Благодарностей отдано 
    319
    Спасибо Благодарностей получено 
    598
    Поблагодарили
    444 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Так у него весовой ЦАП? Я думал там резисторный (где-то видел картинку с 16тью сопротивлениями и дешифратором 4-к-16).

  6. #16
    Guru Аватар для Vslav
    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    755
    Поблагодарили
    353 сообщений
    Mentioned
    86 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от HardWareMan Посмотреть сообщение
    Так у него весовой ЦАП? Я думал там резисторный (где-то видел картинку с 16тью сопротивлениями и дешифратором 4-к-16).
    Оказалось что вот те квадратики слева - это еще 8 транзисторов с разными сопротивлениями каналов. Итого - 15 штук на канал. Получается 16 уровней (16-ый - когда все транзисторы закрыты, внешний резистор утягивает значение на "землю"), что соответствует 4-битному значению. А жаль, так красиво все на картинке сначала было

  7. #16
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  8. #17
    Guru Аватар для HardWareMan
    Регистрация
    26.02.2011
    Адрес
    г. Павлодар, Казахстан
    Сообщений
    4,404
    Спасибо Благодарностей отдано 
    319
    Спасибо Благодарностей получено 
    598
    Поблагодарили
    444 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ну вот, я так и думал. Старшие разряды толще потому как ток выше, это и понятно. А те 8 это младшие. Стало быть тут все так же 4-к-16.

  9. #18
    Veteran Аватар для Tronix
    Регистрация
    16.09.2010
    Адрес
    г. Москва
    Сообщений
    1,933
    Спасибо Благодарностей отдано 
    78
    Спасибо Благодарностей получено 
    231
    Поблагодарили
    115 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А в EPM7064 влезет, хотя еще лучше в 3032 -))
    А по теме - выложите плиз исходники, все ссылки битые.

  10. #19
    Veteran Аватар для zebest
    Регистрация
    11.01.2008
    Адрес
    Ладошкино
    Сообщений
    1,673
    Записей в дневнике
    4
    Спасибо Благодарностей отдано 
    322
    Спасибо Благодарностей получено 
    221
    Поблагодарили
    174 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    Exclamation

    Цитата Сообщение от Tronix Посмотреть сообщение
    все ссылки битые.

    Скрытый текст

    Код:
    ay-8910.v
    
    // ports are not identical to the actual AY chip - no need for that.
    // Also the parallel ports are not very useful, so they are not connected
    
    
    
    
    module ay8910(rst_n,clk,clk_en,asel,wr_n,cs_n,di,do,A,B,C);
        input rst_n;
        input clk;        // 28 MHz clock from the system
        input clk_en;    // 1.7 (?) clock to run the sound timing
        input asel;
        input wr_n;
        input cs_n;
        input [7:0] di;
        output [7:0] do;
        output [7:0] A;
        output [7:0] B;
        output [7:0] C;
    
    
    
    
    /////////////////////////////////////////////////////////////////////////////
    // Write Register
    /////////////////////////////////////////////////////////////////////////////
    
    
    reg [3:0] addr;
    
    
    // registers
    reg [11:0] period_a,period_b,period_c;
    reg [4:0] period_n;
    reg [7:0] reg_en;
    reg [4:0] vol_a,vol_b,vol_c;
    reg [15:0] period_e;
    reg [3:0] shape_e;
    reg [7:0] pa_r,pb_r;
    
    
    wire pb_od = reg_en[7];
    wire pa_od = reg_en[6];
    wire na  = reg_en[5];
    wire nb  = reg_en[4];
    wire nc  = reg_en[3];
    wire ena = reg_en[2];
    wire enb = reg_en[1];
    wire enc = reg_en[0];
    
    
    always @(posedge clk)
    if(~rst_n) begin 
           vol_a          <= 0;
           vol_b          <= 0;
           vol_c          <= 0;
    end else
    
    
    if(~wr_n  && ~cs_n) begin
       if(asel)
        begin
          // address write
          addr <= di[3:0];
        end else begin
          // register write
          case(addr)
           0:period_a[ 7:0] <= di;
           1:period_a[11:8] <= di[3:0];
           2:period_b[ 7:0] <= di;
           3:period_b[11:8] <= di[3:0];
           4:period_c[ 7:0] <= di;
           5:period_c[11:8] <= di[3:0];
           6:period_n[ 4:0] <= di[4:0];
           7:reg_en         <= di;
           8:vol_a          <= di[4:0];
           9:vol_b          <= di[4:0];
          10:vol_c          <= di[4:0];
          11:period_e[7:0]  <= di;
          12:period_e[15:8] <= di;
          13:shape_e        <= di[3:0];
          14:pa_r        <= di;
          15:pb_r        <= di;
          endcase
        end
    end
    
    
    /////////////////////////////////////////////////////////////////////////////
    // Read Register
    /////////////////////////////////////////////////////////////////////////////
    assign do = addr==4'h0 ? period_a[7:0] :
                addr==4'h1 ? {4'h0,period_a[11:0]} :
                addr==4'h2 ? period_b[7:0] :
                addr==4'h3 ? {4'h0,period_b[11:0]} :
                addr==4'h4 ? period_c[7:0] :
                addr==4'h5 ? {4'h0,period_c[11:0]} :
                addr==4'h6 ? {3'h0,period_n} :
                addr==4'h7 ? reg_en :
                addr==4'h8 ? {3'h0,vol_a} :
                addr==4'h9 ? {3'h0,vol_b} :
                addr==4'ha ? {3'h0,vol_c} :
                addr==4'hb ? period_e[7:0] :
                addr==4'hc ? period_e[15:8] :
                addr==4'hd ? {4'h0,shape_e} : 8'hff;
                
    
    
    /////////////////////////////////////////////////////////////////////////////
    // PSG
    /////////////////////////////////////////////////////////////////////////////
    
    
    //
    // toneA 12bit | 12bit
    // toneB 12bit | 12bit
    // toneC 12bit | 12bit
    // env   15bit | 15bit
    //
    reg [2:0] pris;
    reg [11:0] cnt_a,cnt_b,cnt_c;
    
    
    reg out_a,out_b,out_c;
    
    
    always @(posedge clk)
    if(clk_en) begin
      pris <= pris + 1;
      if(pris==0)
      begin
        // tone generator
        cnt_a <= cnt_a + 1;
        if(cnt_a==period_a)
        begin
          out_a <= ~out_a;
          cnt_a <= 0;
        end
        cnt_b <= cnt_b + 1;
        if(cnt_b==period_b)
        begin
          out_b <= ~out_b;
          cnt_b <= 0;
        end
        cnt_c <= cnt_c + 1;
        if(cnt_c==period_c)
        begin
          out_c <= ~out_c;
          cnt_c <= 0;
        end
      end
    end
    
    
    /////////////////////////////////////////////////////////////////////////////
    // envelope generator
    /////////////////////////////////////////////////////////////////////////////
    reg [15:0] env_cnt;
    reg [3:0] env_phase;
    reg env_start;
    reg env_en;
    reg env_inv;
    
    
    // write eshape
    wire env_clr = (addr==13) & ~cs_n & ~wr_n;
    
    
    // bit3 = turn reset , 0=on , 1=off
    // bit2 = start , 0=up , 1=down(inv)
    // bit1 = turn invert, 0=tggle , 1=fix
    // bit0 = turn repeat, 0=off, 1=on
    
    
    wire next_no_reset  = shape_e[3];
    wire start_no_inv   = shape_e[2];
    wire next_toggle    = shape_e[1];
    wire next_repeat    = shape_e[0];
    
    
    // envelope volume output
    wire [3:0] vol_e = env_phase ^ {4{env_inv}};
    
    
    //
    always @(posedge clk or posedge env_clr)
    begin
      if(env_clr) env_start <= 1'b1;
      else  if(clk_en) env_start <= 1'b0;
    end
    
    
    always @(posedge clk or negedge rst_n)
    begin
      if(~rst_n)
      begin
        env_en    <= 1'b0;
      end else 
          if(clk_en)begin
    
    
        // start trigger
        if(env_start)
        begin
          env_cnt   <= 0;
          env_phase <= 0;
          env_inv   <= ~start_no_inv;
          env_en    <= 1'b1;
        end
    
    
        // count
        if(pris==0 && env_en)
        begin
          // phase up
          env_cnt <= env_cnt + 1;
          if(env_cnt==period_e)
          begin
            env_cnt <= 0;
            env_phase <= env_phase+1;
            // turn over
            if(env_phase==15)
            begin
              if(~next_no_reset)
              begin
               env_inv <= (env_inv ^ next_toggle) & next_no_reset;
               env_en  <= next_repeat & next_no_reset;
              end
            end
          end
        end
      end
    end
    
    
    /////////////////////////////////////////////////////////////////////////////
    // noise generator
    /////////////////////////////////////////////////////////////////////////////
    reg [16:0] shift_n;
    reg [4:0] cnt_n;
    
    
    always @(posedge clk or negedge rst_n)
    begin
      if(~rst_n)
      begin
        shift_n <= 17'b00000000000000001;
      end else if((pris==0) &&(clk_en))
      begin
        cnt_n <= cnt_n +1;
        if(cnt_n == period_n)
        begin
          cnt_n <= 0;
          shift_n <= {shift_n[0]^shift_n[3],shift_n[16:1]};
        end
      end
    end
    
    
    wire out_n = shift_n[0];
    
    
    /////////////////////////////////////////////////////////////////////////////
    // volume table 3db / step
    /////////////////////////////////////////////////////////////////////////////
    function [7:0] vol_tbl;
    input [4:0] vol;
    input [3:0] vole;
    input out;
    begin
      if(~out)
         vol_tbl = 0;
      else case(vol[4]?vole:vol[3:0])
      15:vol_tbl = 255;
      14:vol_tbl = 180;
      13:vol_tbl = 127;
      12:vol_tbl = 90;
      11:vol_tbl = 64;
      10:vol_tbl = 45;
       9:vol_tbl = 32;
       8:vol_tbl = 22;
       7:vol_tbl = 16;
       6:vol_tbl = 11;
       5:vol_tbl = 8;
       4:vol_tbl = 5;
       3:vol_tbl = 4;
       2:vol_tbl = 3;
       1:vol_tbl = 2;
       0:vol_tbl = 0; //1;
      endcase
    end
    endfunction
    
    
    /////////////////////////////////////////////////////////////////////////////
    // output
    /////////////////////////////////////////////////////////////////////////////
    assign A = vol_tbl(vol_a,vol_e,(out_a | ena) & (out_n | na) );
    assign B = vol_tbl(vol_b,vol_e,(out_b | enb) & (out_n | nb) );
    assign C = vol_tbl(vol_c,vol_e,(out_c | enc) & (out_n | nc) );
    
    
    
    
    
    
    endmodule
    [свернуть]
    Profi v3.2 -=- Speccy2010,r2

Страница 2 из 2 ПерваяПервая 12

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Dendy on FPGA?
    от Ewgeny7 в разделе Nintendo
    Ответов: 29
    Последнее: 04.11.2009, 17:55
  2. Sega на FPGA
    от AlexBel в разделе SEGA
    Ответов: 4
    Последнее: 03.03.2009, 02:20
  3. ATARI 2600 on FPGA
    от vano в разделе Atari
    Ответов: 1
    Последнее: 27.12.2008, 15:03
  4. NES на FPGA
    от AlexBel в разделе Nintendo
    Ответов: 7
    Последнее: 05.12.2008, 16:44
  5. Atari ST(E) на FPGA...
    от ILoveSpeccy в разделе Atari
    Ответов: 6
    Последнее: 26.08.2008, 20:55

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •