📄 dianziqin.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 + -