【问题标题】:i'm generating a sine wave using the lut我正在使用 lut 生成正弦波
【发布时间】:2014-06-29 16:16:11
【问题描述】:
Port ( 
           data_out : out integer range -128 to 127
type ramtype is array (0 downto 29) of integer range -128 to 127;
signal ram : ramtype;
signal sine_wave : ramtype :=(0,16,31,45,58,67,74,77,77,74,67,58,45,31,16,0,
-16,-31,-45,-58,-67,-74,-77,-77,-74,-67,-58,-45,-31,-16);

signal clk :STD_LOGIC;
variable count : integer := 0;
variable inc : integer := 0; 
constant period :time := 10 ms;   -- 100 hz clk frequency 
begin
 process(clk)
 begin
    if rising_edge (clk) then

LINE:53 公司 结束循环;

    end if;

结束进程;

第 61 行:进程(inc)
开始

    clk <= not clk after period/2;

 end process;

第 53 行:使用 := 分配给变量 inc 第 61 行:灵敏度列表只能有静态信号名称

我需要第 53 行的并发声明,但编译器提出了另一件事,而且敏感度列表也未被接受 第 61 行:灵敏度列表只能有静态信号名称

【问题讨论】:

  • 第53行是哪一个?
  • inc 被声明为变量(赋值使用:=)并被赋值为信号(使用&lt;= 赋值)。只有信号属于敏感度列表。
  • 另外,ramtype 类型声明为空范围(使用 to 而不是 downto)
  • for 循环将在一个时钟内将所有相同的sinew_wave(count) 值分配给data_out 30 次。 (其中 29 个投影波形值将被覆盖,当前时间只有一个“插槽”)。 count 在哪里增加? inc 和 count 都应该是信号或被声明并且只使用单个进程或应该是共享变量。从您的设计规范片段中不清楚inc 应该为时钟进程做什么。
  • @DavidKoontz:我想生成一个正弦波,其中我的 clk 频率为 100 hz,我想在时钟的每个姿势上对其进行相应的采样

标签: vhdl


【解决方案1】:

我想生成一个正弦波,其中我的 clk 频率为 100 hz,并且我 想要在时钟的每个姿势上对其进行相应的采样

我之前这样做是为了找出您共享的代码部分的所有问题。目前还不清楚inc在时钟进程敏感度列表中做了什么。

时钟过程已修改为仅输出一个完整的波形。注意inc 和count 都被声明为信号。

ramtype 的范围方向已从 0 downto 29 更改为 0 to 29。

我将clk 的默认值设置为“0”,这允许非时钟不提供“U”(请参阅​​包 std_logic_1164 中的非真值表:

-- truth table for "not" function
CONSTANT not_table: stdlogic_1d :=
--  -------------------------------------------------
--  |   U    X    0    1    Z    W    L    H    -   |
--  -------------------------------------------------
     ( 'U', 'X', '1', '0', 'X', 'X', '1', '0', 'X' );

clk 的初始值必须为“0”(或“L”)或“1”(或“H”),以使时钟进程在模拟中工作。

您的代码片段已被修改以进行分析、阐述和模拟:

library ieee;
use ieee.std_logic_1164.all;

entity sinewave is
end entity;

architecture foo of sinewave is

   -- Port (
   --            data_out : out integer range -128 to 127
   signal   data_out: integer range -128 to 127;
   type ramtype is array ( integer range 0 to 29) of  -- was downto
                               integer range -128 to 127;
   -- signal ram : ramtype;
   constant sine_wave: ramtype := ( 
              0, 16, 31, 45, 58, 67, 74, 77, 77, 74, 67, 58, 45, 31, 16,
              0,-16,-31,-45,-58,-67,-74,-77,-77,-74,-67,-58,-45,-31,-16
           );

   signal clk :STD_LOGIC := '0';  --  so not clk gives '1' or '0'
   signal count : integer  range  0 to 29 :=  0;
   signal inc : integer :=  0;     
   constant period :time := 10 ms;   -- 100 hz clk frequency 
begin
    process(clk)
    begin
        if rising_edge (clk) then
LINE_53:     inc <= inc + 1;        -- error

            if count = 29 then      -- count  is index pointer to sine_wave
                count <= 0;
            else 
                count <= count + 1;
            end if ;
            -- for i in 0 to 29 loop
            data_out <= sine_wave(count);   
            report "data_out <= " & integer'IMAGE(sine_wave(count));
            --end loop;  
        end if;
     end process;  

LINE_61: process    -- modified to show every element of sine_wave once
    begin           
    wait for period/2;
    clk <= not clk;  -- after period/2;
    if Now > 29.5 * period  then
        wait;
    end if;
    end process;

end architecture;

注意count 是如何用作sine_wave 的索引的,所以我给它添加了一个增量。同时拥有inc 和count 似乎是多余的。

正如我在评论中解释的那样,for 循环被删除了,因为它没有做任何事情,只是重复相同的 sine_wave 赋值 30 次。不影响模拟。

我把他做成了一个测试台,因为你提供了一个时钟进程。

当运行报告语句时,输出 count 索引的 sine_wave 值作为显示,用于演示收益:

ghdl -r sinewave sine.vhdl:37:13:@5ms:(report note): data_out <= 0 sine.vhdl:37:13:@15ms:(report note): data_out <= 16 sine.vhdl:37:13:@25ms:(report note): data_out <= 31 sine.vhdl:37:13:@35ms:(report note): data_out <= 45 sine.vhdl:37:13:@45ms:(report note): data_out <= 58 sine.vhdl:37:13:@55ms:(report note): data_out <= 67 sine.vhdl:37:13:@65ms:(report note): data_out <= 74 sine.vhdl:37:13:@75ms:(report note): data_out <= 77 sine.vhdl:37:13:@85ms:(report note): data_out <= 77 sine.vhdl:37:13:@95ms:(report note): data_out <= 74 sine.vhdl:37:13:@105ms:(report note): data_out <= 67 sine.vhdl:37:13:@115ms:(report note): data_out <= 58 sine.vhdl:37:13:@125ms:(report note): data_out <= 45 sine.vhdl:37:13:@135ms:(report note): data_out <= 31 sine.vhdl:37:13:@145ms:(report note): data_out <= 16 sine.vhdl:37:13:@155ms:(report note): data_out <= 0 sine.vhdl:37:13:@165ms:(report note): data_out <= -16 sine.vhdl:37:13:@175ms:(report note): data_out <= -31 sine.vhdl:37:13:@185ms:(report note): data_out <= -45 sine.vhdl:37:13:@195ms:(report note): data_out <= -58 sine.vhdl:37:13:@205ms:(report note): data_out <= -67 sine.vhdl:37:13:@215ms:(report note): data_out <= -74 sine.vhdl:37:13:@225ms:(report note): data_out <= -77 sine.vhdl:37:13:@235ms:(report note): data_out <= -77 sine.vhdl:37:13:@245ms:(report note): data_out <= -74 sine.vhdl:37:13:@255ms:(report note): data_out <= -67 sine.vhdl:37:13:@265ms:(report note): data_out <= -58 sine.vhdl:37:13:@275ms:(report note): data_out <= -45 sine.vhdl:37:13:@285ms:(report note): data_out <= -31 sine.vhdl:37:13:@295ms:(report note): data_out <= -16

您的 10 毫秒时钟周期意味着正弦波是 3.333.. Hz。

【讨论】:

  • 先生,有一件事我无法弄清楚:我将一些数字值存储到 ram 中并显示它,这里我没有明确编写采样和量化代码来做任何事情模拟信号的采样和量化,或者我错过了解释什么???
  • 我原以为纯符号波的值是通过算法生成的。 360 度/30 个样本 = 每个样本 12 度,单位为 128 位,然后按比例缩小。你从哪里得到的数字值?
  • 我上网了,我明白了,但我仍然不清楚你上面给出的解释,采样率是多少。对不起,我是新手,请帮助我出去
猜你喜欢
  • 1970-01-01
  • 2015-02-01
  • 2012-07-11
  • 2016-07-10
  • 1970-01-01
  • 2018-06-11
  • 2016-02-21
  • 1970-01-01
  • 2018-10-26
相关资源
最近更新 更多