我想生成一个正弦波,其中我的 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。