-
问题已解决!问题出在程序设计中的某个判断条件出现越界。。。
-
我终于找到问题所在了!原因就是定义变量的问题。
我把分频系数定义为variable,并放到分频进程里面,仿真结果正确。
但是由于信号与硬件中的连线相对应,但是variable变量在硬件中没有直接的对应物。
如果把程序下到硬件上变量还有效吗,会不会又出现 输出时钟 没了的现象?
以下是修改后的程序:
entity sa_clk is
port(
clk : in std_logic; ------输入50MHz时钟
sa_n: in integer range 0 to 512; ---- 输入一周期内采样次数
f : in integer range 20 to 200000 :=20; ----输入正弦波频率
sa_clk : out std_logic -------------输出采样时钟
);
end sa_clk;
architecture behavor of sa_clk is
signal count : integer :=0;
signal sa_clk_f:integer:=10240;
begin
process(clk,f)
variable n: integer :=4883;
variable ftmp: integer :=20;
begin
ftmp:=f;
sa_clk_fn-1) then
count
-
夏老师,我找到问题所在的地方了,但是我不明白为什么只要频率一改变,输出的 采样时钟 就停止工作了。以下是采样时钟的代码,夏老师您能看下哪里出错了吗?
entity sa_clk is
port(
clk : in std_logic; ------输入50MHz时钟
sa_n: in integer range 0 to 512; ---- 输入一周期内采样次数
f : in integer range 20 to 200000 :=20; ----输入正弦波频率
sa_clk : out std_logic -------------输出采样时钟
);
end sa_clk;
architecture behavor of sa_clk is
signal count : integer :=0;
signal n: integer:=4883;
signal sa_clk_f:integer:=10240;
begin
process(f)
begin
sa_clk_f
-
夏老师,我就是这个思想的,只是波形rom部分没写出来。主要问题是,调节频率,也就是调节采样时钟频率的时候经常出现输出波形的截止现象,我们检查了外部 数模转换、滤波器等硬件电路发现没问题,我们觉得是程序的问题,但是我找不到问题,纠结了好久了!
-
我最近在设计一个正弦波发生器的过程中,出现了很诡异的问题。频率稍微上调多点,输出波形就截止。采取fpga的de0开发板,方案如下:
1. 输入正弦波频率f(可调节频率) ——> 频率处理以及显示(元件1) ——> 输出整形(integer)频率 f
2. 输入频率 ——> 选择一个周期内对正弦波的采样次数 sa_times(元件2) ——> 输出sa_times
3. f 和 sa_times 以及 50MHz晶振时钟 同时输入 ——> 分频(元件3)(n=f * sa_times , count=50M / n)——> 输出采样时钟(即采样频率为sa_times*f)
4 .输入采样时钟和sa_times ——> 扫描正弦函数表,分离出正弦波频率(元件4) ——> 输出按正弦变化的8位二进制序列
按此方案编程,外接数模转换以及滤波电路等输至示波器内,外部硬件电路经过检测毫无问题。而且能产生精确度极高,很漂亮的波形。
但当我们调节频率时,在初始化频率的基础上,
当我们把频率往上调时,调到初始化频率的数倍(3~4倍)以上后,输出波形总是突然截止,只能通过重新载入程序(重启开关)的方式回复波形。
而当我们初始化频率设置在任何频率时,都能得到对应频率的初始化波形。这是为何?是不是程序有问题?本人已纠结数周,求求大神解救!!!
附部分vhdl代码:(可读性非常好!)
元件1:频率预置(preset)f
entity preset is
port(
clk: in std_logic;
botton2:in std_logic;
en_switch:in std_logic_vector(5 downto 0); ------------限于DE0板,采用开关使能,按钮计数的方式调频
......
f: out integer
);
end preset
architecture behavor of preset is
-----------------------------内部信号-------------------------------------
-----------------------------频率位BCD码-----------------------------
signal tmp0: std_logic_vector(3 downto 0):=(others =>'0'); -----------频率个位
signal tmp1: std_logic_vector(3 downto 0):=(others =>'0');
signal tmp2: std_logic_vector(3 downto 0):=(others =>'0');
signal tmp3: std_logic_vector(3 downto 0):=(others =>'0');
signal tmp4: std_logic_vector(3 downto 0):=(others =>'0');
signal tmp5: std_logic_vector(3 downto 0):=(others =>'0');--------------频率百千位
signal ftmp: integer range 20 to 200000 = 20;
----------------------------------------------------------------------------------
begin
--------------------------预置频率进程---------------------------------
process(botton2)
begin
if falling_edge(botton2) then
----------------------------------------------------------------
if tmp0="1001" and en_switch(0)='1' then
tmp0
-
直接求出输出关于输入的逻辑表达方程,并采用卡诺图化简得最简式
在vhdl直接一句话实现,从而同时实现了硬件以及软件的高效运算。
-
对于一般使用者来说,pld跟fpga没什么区别。
当然细究起来也是有区别的:
cpld 门资源较多,触发器资源较少,适合完成各种算法以及组合逻辑;fpga在这方面恰恰相反。
编程上,fpga比cpld灵活,使用更方便。
小规模宜用cpld,大规模用fpga等。。。
对于你上面的电路来说,计数器需要触发器资源较多,宜用fpga;加法器需要门电路较多,宜用cpld。