vhdl吧 关注:4,588贴子:17,611
  • 4回复贴,共1

VHDL 串并转换

只看楼主收藏回复

求大神帮忙写一段VHDL的串并转换的代码:同步有24个时钟伴随着串行数据一共24位,但是我只取12位数据放进一个12的数组,等到数据到齐后,并行输出.我自己写的代码,发现总是实现不了求帮忙。
G5_radio:process(G5_strobe)
begin
if rising_edge(G5_strobe) then
G5cout<=G5cout+1;
G5_data_out(11)<=G5_data_in;
for i in 11 downto 1 loop
G5_data_out(i-1)<=G5_data_out(i);
end loop;
end if;
if G5cout=24 then
G5cout<=0;
end if;
if G5cout=12 then
G5_out<=G5_data_out;(G5_data_out是中间变量,最终输出时G5_out)
end if;
end process G5_radio;


IP属地:浙江1楼2013-05-06 15:29回复
    我也是要写这个 16位并行输入然后串行输出


    2楼2013-05-06 15:51
    收起回复
      library ieee;
      use ieee.std_logic_1164.all;
      use ieee.std_logic_unsigned.all;
      entity serial_parallel is
      port(
      G5_strobe : in std_logic;
      rst : in std_logic;
      G5_data_in : in std_logic;
      G5_out : out std_logic_vector(11 downto 0)
      );
      end serial_parallel;
      architecture behav of serial_parallel is
      signal G5cout : integer range 0 to 23;
      signal G5_data_out : std_logic_vector(11 downto 0);
      begin
      G5_radio:process(G5_strobe,rst) begin
      if rst = '0' then
      G5cout <= 0;
      G5_data_out <= (others => '0');
      elsif rising_edge(G5_strobe) then
      if G5cout = 23 then
      G5cout <= 0;
      G5_data_out <= (others => '0');
      elsif G5cout = 12 then
      G5cout <= G5cout + 1;
      G5_out<=G5_data_out;
      elsif G5cout <= 11 then
      G5cout <= G5cout+1;
      G5_data_out(11-G5cout) <= G5_data_in;
      else
      G5cout <= G5cout + 1;
      G5_data_out <= (others => '0');
      end if;
      end if;
      end process G5_radio;
      end behav;
      这是在你的程序基础上该的,我增加了一个rst复位信号,去掉了for循环,以后在写的时候for循环尽量少用,for循环在综合的时候容易出错(要是你能很好的把握for循环的话还是可以用的),如果只是需要做仿真的程序还是可以随便用的。串行数据的第一个是放在并行数据的最高为的,一次往后。希望能够帮助到你。


      3楼2013-06-19 17:41
      回复