
本设计有5个模块组成,其中有:方波发生器,三角波发生器,正弦波发生器,阶梯波发生器,4选1选择器。下面是我设计的整个过程:
方波发生器:实质上是一段时间输出0,一段时间输出255的数字信号,当然这有8位的通道输出。
程序设计如下:
--工程名:方波发生器
--功能:产生方波,是通过交替送出全0和全1实现的,每32个时钟翻转一次
--时间:2010-12-17
library ieee
use ieee.std_logic_1164.all
use ieee.std_logic_unsigned.all
use ieee.std_logic_arith.all
entity sqaure is
port(clk,clr:in std_logic
q:out integer range 0 to 255
)
end entity
architecture behav of sqaure is
signal a:bit
begin
process(clk,clr) --计数分频
variable cnt:integer range 0 to 32
begin
if(clr='0') then
a<='0'
elsif clk'event and clk='1' then
if cnt<31 then --进行32分频
cnt:=cnt+1
else
cnt:=0
a<=not a
end if
end if
end process
process(clk,a) --信号输出
begin
if clk'event and clk='1' then
if a='1' then
q<=255
else
q<=0
end if
end if
end process
end behav
三角波发生器:实质上是先输出直线递增的数字信号,随后按照同样的斜率输出递减的数字信号。这样就能实现三角波的发生了。
程序设计如下:
--工程名:三角波信号发生器
--功能:产生的三角波以64个时钟为一个周期,输出q每次加减8。
--时间:2010-12-17
library ieee
use ieee.std_logic_1164.all
use ieee.std_logic_unsigned.all
use ieee.std_logic_arith.all
entity delta1 is
port(clk:in std_logic--时钟信号
rst:in std_logic--复位信号
q:out std_logic_vector(7 downto 0)) --输出信号
end entity
architecture behav of delta1 is
begin
process(clk,rst)
variable tmp:std_logic_vector(7 downto 0)
variable a:std_logic
begin
if(rst='0') then
tmp:="00000000"
elsif clk'event and clk='1' then
if(a='0') then
if(tmp="11111000") then --tmp=248
tmp:="11111111"
a:='1'--信号计数完成,下一次改成递减
else
tmp:=tmp+8--递增
end if
else
if tmp="00000111" then --tmp=7
tmp:="00000000"
a:='0'--信号计数完成,下一次改成递增
else
tmp:=tmp-8--递减
end if
end if
end if
q<=tmp--信号输出
end process
end behav
正弦波发生器:这里我设计了64个状态,就是将一个周期的正弦波分成64分,在然后一份份的数字信号输出就可以了。具体怎么取值,用excel计算就可以了。自己手动计算也可以的哦。
具体程序设计如下:
library ieee
use ieee.std_logic_1164.all
use ieee.std_logic_unsigned.all
use ieee.std_logic_arith.all
entity sin1 is
port(clk,clr:in std_logic
d:out integer range 0 to 255)
end entity
architecture behav of sin1 is
begin
process(clk,clr)
variable tmp:integer range 0 to 63
begin
if clr='0' then
d<=0
elsif clk'event and clk='1' then
if tmp=63 then
tmp:=0
else
tmp:=tmp+1
end if
case tmp is
when 00=>d<=255when 01=>d<=254when 02=>d<=252
when 03=>d<=249when 04=>d<=245when 05=>d<=239
when 06=>d<=233when 07=>d<=225when 08=>d<=217
when 09=>d<=207when 10=>d<=197when 11=>d<=186
when 12=>d<=174when 13=>d<=162when 14=>d<=150
when 15=>d<=137when 16=>d<=124when 17=>d<=112
when 18=>d<=99 when 19=>d<=87when 20=>d<=75
when 21=>d<=64 when 22=>d<=53when 23=>d<=43
when 24=>d<=34 when 25=>d<=26when 26=>d<=19
when 27=>d<=13 when 28=>d<=8 when 29=>d<=4
when 30=>d<=1 when 31=>d<=0 when 32=>d<=0
when 33=>d<=1 when 34=>d<=4 when 35=>d<=8
when 36=>d<=13 when 37=>d<=19when 38=>d<=26
when 39=>d<=34 when 40=>d<=43when 41=>d<=53
when 42=>d<=64 when 43=>d<=75when 44=>d<=87
when 45=>d<=99 when 46=>d<=112when 47=>d<=124
when 48=>d<=137when 49=>d<=150when 50=>d<=162
when 51=>d<=174when 52=>d<=186when 53=>d<=197
when 54=>d<=207when 55=>d<=217when 56=>d<=225
when 57=>d<=233when 58=>d<=239when 59=>d<=245
when 60=>d<=249when 61=>d<=252when 62=>d<=252
when 63=>d<=255
when others=>null
end case
end if
end process
end behav
下面是n分频器的VHDL描述,你只要将两个分频器串联起来就行了。第一个的分频系数为20MHz/10KHz=2000,第二个的分频系数为10KHz/1KHz=10,再将第一个分频器的输出通过一个D触发器构成的2分频器(将q_n输出端反馈至d输入端,输出端q即为输入端clk的2分频)即可。library ieee
use ieee.std_logic_1164.all
use ieee.std_logic_unsigned.all
entity div is
generic(n:integer :=2000)
port (clk:in std_logic
q:out std_logic)
end div
architecture behave of div is
signal count :integer range n-1 downto 0:=n-1
begin
process(clk)
begin
if (clk'event and clk='1' and clk'last_value ='0') then
count<=count-1
if count>=n/2 then
q<='0'
else
q<='1'
end if
if count<=0 then
count<=n-1
end if
end if
end process
end behave
在计数器的基础上加上定时器,也就是说在单位时间内记的数就为频率。计数器输出信号经显示译码器(4511之类)就可以驱动LED。清零信号计数器一般自带。网上会有现成电路的还有另一种方法:
能实现两位显示(00—99)的频率显示,能测正弦波,矩形波的频率; 能信号频率范围0-99hz,这些要求很简单。
正弦波用一个比较器就可以变成方波(矩形波),而且频率现在一般都可以做到1m以上了。
你试试,1楼的大师设计的也听不错的,你也看看
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)