Programmable Devices
CPLDs, FPGAs, SoC FPGAs, Configuration, and Transceivers
20687 Discussions

AM transmitter behaves weird (Cyclone II)

Altera_Forum
Honored Contributor II
920 Views

Hello. I tried to make AM transmitter and I got petty wird behavior. This code, which I post here was the only one I got working. Problems start appearing when I change div2(17) or div2(13) to any other numbers than 17 or 13. There should be transmited two frequencies which change once about one second, but when the numbers got changed one of frequencies got noisy or completly disapear, sometime disaper both or there is only the 6,5MHz frequency. I used LEDs insead of antena for easier debugging. What am I doing wrong and can do to make behavior correct. Thank you very much. 

 

library IEEE;use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity testovaci is Port ( clk : in std_logic; LED : out std_logic_vector(2 downto 0) ); end testovaci; architecture Behavioral of testovaci is signal div : std_logic_vector(2 downto 0); signal div2: std_logic_vector(20 downto 0); signal div3: std_logic_vector(26 downto 0); signal count : std_logic_vector(2 downto 0); begin process (clk) begin if clk='1' then div<=div+1; div3<=div3+1; end if; if div="000" and clk='1' then div2<=div2+1; end if; if div(2)='1' then if div3(24)='0' then if div2(17)='1' then count <= "111"; else count <= "000"; end if; else if div2(13)='1' then count <= "111"; else count <= "000"; end if; end if; else count <= "000"; end if; end process; LED(2 downto 0) <= count(2 downto 0); end Behavioral;
0 Kudos
3 Replies
Altera_Forum
Honored Contributor II
220 Views

Restart your design using synchronous (clock edge sensitive) logic. Presently you are implementing weird things like asynchronous counters. They possibly work in a simulation but never in real hardware.

0 Kudos
Altera_Forum
Honored Contributor II
220 Views

 

--- Quote Start ---  

Restart your design using synchronous (clock edge sensitive) logic. Presently you are implementing weird things like asynchronous counters. They possibly work in a simulation but never in real hardware. 

--- Quote End ---  

 

 

Thank you very much. I got it working, but I thought that my code was using synchronous logic (because process is synchronous, right?). I will be happy if you could explain me my mistakes so I don't do them again. Also here is my working code. The only change I did was that I wrapped whole code to "if clk='1' then" block. 

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity testovaci is Port ( clk : in std_logic; LED : out std_logic_vector(2 downto 0) ); end testovaci; architecture Behavioral of testovaci is signal div : std_logic_vector(2 downto 0); signal div2: std_logic_vector(20 downto 0); signal div3: std_logic_vector(26 downto 0); signal count : std_logic_vector(2 downto 0); begin process (clk) begin if clk='1' then div<=div+1; div3<=div3+1; if div="000" then div2<=div2+1; end if; if div(2)='1' then if div3(24)='0' then if div2(14)='1' then count <= "111"; else count <= "000"; end if; else if div2(13)='1' then count <= "111"; else count <= "000"; end if; end if; else count <= "000"; end if; end if; end process; LED(2 downto 0) <= count(2 downto 0); end Behavioral;
0 Kudos
Altera_Forum
Honored Contributor II
220 Views

The below code is counting rising clock edges in a simulation, by working of the sensitivity list. When trying to synthesize it in hardware, the sensitivity list is ignored and it doesn't work as a counter. 

process (clk) begin if clk='1' then count <= count +1; end if; end process; 

 

To achieve consistent behavior in functional simulation and synthesis, you need to write 

process (clk) begin if rising_edge(clk) then count <= count +1; end if; end process;
0 Kudos
Reply