⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dianziqin.txt

📁 用汇编语言写的电子琴代码
💻 TXT
字号:
module organ(SW,S,CLK,SPEAK);
      input CLK;
      input [7:1] S;
      input [3:1] SW;
      ouput SPEAK;
      reg[19:0] COUNTER,COUNTER_END;
      reg[7:1] S_REG;
      always@(posedge CLK)
      begin
           COUNTER=COUNTER+1;
           if((COUNTER==COUNTER_END)&(!COUNTER_END==20'hffff0)))
           begin
           COUNTER=20'h00000;
           SPEAK_REG=!SPEAK_REG;
           end
           else if(COUNTER_END==20'hffff0)SPEAK_REG=0;
           end
        always@(S)
        begin
        S_REG=-S;
        if(SW==3'b001)
        case(S_REG)
        //7'b0000001:COUNTER_END=20'h528F;//低音1的分频系数值
        //7'b0000010:COUNTER_END=20'h498D;//低音2的分频系数值
        //7'b0000100:COUNTER_END=20'h4187;//低音3的分频系数值
        //7'b0001000:COUNTER_END=20'h3DD9;//低音4的分频系数值
        7'b0010000:COUNTER_END=20'h3730;//低音5的分频系数值
        7'b0100000:COUNTER_END=20'h3117;//低音6的分频系数值
        7'b1000000:COUNTER_END=20'h2BBC;//低音7的分频系数值
        default:COUNTER_END=20'hffff0;
        endcase
        else if(SW==3'b010)
        case(S_REG)
        7'b0000001:COUNTER_END=20'h2947;//中音1的分频系数值
        7'b0000010:COUNTER_END=20'h24C6;//中音2的分频系数值
        7'b0000100:COUNTER_END=20'h20C3;//中音3的分频系数值
        7'b0001000:COUNTER_END=20'h1EEC;//中音4的分频系数值
        7'b0010000:COUNTER_END=20'h1B8D;//中音5的分频系数值
        7'b0100000:COUNTER_END=20'h188B;//中音6的分频系数值
        7'b1000000:COUNTER_END=20'h15DE;//中音7的分频系数值
        default:COUNTER_END=20'hffff0;
        endcase
        else if(SW==3'b100)
        case(S_REG)
        7'b0000001:COUNTER_END=20'h14A3;//高音1的分频系数值
        7'b0000010:COUNTER_END=20'h1263;//高音2的分频系数值
        7'b0000100:COUNTER_END=20'h1061;//高音3的分频系数值
        7'b0001000:COUNTER_END=20'hF76; //高音4的分频系数值
        7'b0010000:COUNTER_END=20'hDC6; //高音5的分频系数值
        7'b0100000:COUNTER_END=20'hC45; //高音6的分频系数值
        7'b1000000:COUNTER_END=20'hAEF; //高音7的分频系数值
        default:COUNTER_END=20'hffff0;
        endcase 
        else if((SW==0)|SW==3)|(SW==5)|SW==6)|(SW==7))
        else
        COUNTER_END=20'hffff0;
        assign SPEAK=SPEAK_REG;
        end module

//简谱表:音 名   频   率   分频系数  音 名   频率    分频系数
//        低音1  261.63     528F      中音5  783.99     188D
//        低音2  293.67     498D      中音6  880.00     188B
//        低音3  329.63     4187      中音7  987.76     15DE
//        低音4  349.23     3DD9      高音1  1046.50    14A3
//        低音5  391.39     3730      高音2  1174.66    1263
//        低音6  440.00     3117      高音3  1318.51    1061
//        低音7  493.88     2BBC      高音4  1396.92    F76
//        中音1  523.25     2947      高音5  1567.98    DC6
//        中音2  587.33     24C6      高音6  1760.00    C45  
//        中音3  659.25     20C3      高音7  1975.22    AEF
//        中音4  698.46     1EEC 
// 拨位开关控制低音、中音、高音    
// 如果:SW3SW2SW1=001(二进制),那么为低音
// 如果:SW3SW2SW1=010(二进制),那么为中音     
// 如果:SW3SW2SW1=100(二进制),那么为高音 
//其他,蜂鸣器不发音
//  按钮SN(N=1.2.3.4.5.6.7)按下,就发对应音名N,低音只有5.6.7有效


pin lv ji
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;             --打开需要的资源库
entity freq is
 port  (xclk,clk:    in std_logic;
  A0,B0,C0,D0,A1,B1,C1,D1:out std_logic;
  A2,B2,C2,D2,A3,B3,C3,D3:out std_logic);    --端口说明
 end;
 architecture exemple of freq is 
 signal   countb:std_logic_vector(3 downto 0);--产生计数器的清零信号
                                              --和计数允许的信号的计数器
 signal count0: std_logic_vector(3 downto 0);
 signal count1: std_logic_vector(3 downto 0);  
 signal count2: std_logic_vector(3 downto 0);
 signal count3: std_logic_vector(3 downto 0);--千位计数器
 signal   en,clr,m0,m1,m2:std_logic;            --m0,m1,m2分别为计数器之间产生进位信号
 
 begin 
  P1:process(xclk,en,clr)                    --当信号xclk,en,clr发生变化时,启动该进程个位                                                  计数器的时钟信号测xclk
  
 begin
    if(clr='0') then
      count0<="0000";  m0<='0';
      elsif((en='1') and rising_edge(xclk)) then       --输入信号xclk上升沿计数
      if(count0="1001") then
      count0<="0000"; m0<='0';                         --m0在计数器由9为0,m0又1变为0,启动进程P2
      else 
      count<=count+'1';m0<='1'
    end if;
   end if;
  end process P1;
  P2:process(en,clr,m0)                                 --10进制计数器的时钟信号直接来自于个位计数器的输出信号m0
  begin
     if(clr='0')then
      count1<="0000"; m1<='0';
      elsif((en='1')and falling_edge(m0)) then         --m0得下降沿,十位计数加1
      if(count1="1001") then
      count1<="0000"; m1<='0';
      else
      count1<=count1+'1'; m1<='1';
      end if;
    end if;
  end process P2;
  P3:process(en,clr,m1)
  begin 
     if(clr='0')then
      count2<="0000"; m2<='0';
      elsif((en='1')and falling_edge(m1)) then
      if(count2="1001")then 
      count2<="0000";m2<='1';
      else 
      count2<=cout2+'1';  m2<='1';    
      end if;
    end if;
  end process P3;
  P4:process(en,clr,m2)
  begin 
     if(clr='0')then
        count3<="0000";
     elsif((en='1')and  falling_edge(m2)) then 
        if(count3="1001")then 
        count3<="0000";
        else
        count3<=count3+'1';
        end if;
      end if;
  end process P4;
  P5:process(clk)
  begin
  if(rising_edge(clk))then                        --计数器countb分频clk信号,产生1秒信号的控制信号en
       countb<=countb+'1';
       else
       countb<=countb;
       end if; 
       if(countb="0111") then 
       clr<='0';                                   --信号clr=0,所有计数器清0
      else
       clr<='1';
      end if;
      if(countb>"0111")then
        en<='1';                                  -信号en=1时,计数器计数
      else
          en<='0';                                --信号en=0时,计数器计停止计数      
      end if;
      end process P5;
      A0<=count0(0);B0<=count0(1);C0<=count0(2);D0<=count0(3);
      A1<=count1(0);B1<=count1(1);C1<=count1(2);D1<=count1(3);
      A2<=count2(0);B2<=count2(1);C2<=count2(2);D2<=count2(3);
      A3<=count3(0);B3<=count3(1);C3<=count3(2);D3<=count3(3);
      end example;



 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -