OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6078|回复: 4

帮忙找一下错误,程序很短。关于接收寄存器到发送寄存器的

[复制链接]

6

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2016-9-12
在线时间
35 小时
发表于 2016-9-29 19:06:23 | 显示全部楼层 |阅读模式
10金钱
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_unsigned.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
entity hexx is
port (
                        spi_dout : out  STD_LOGIC;
                        spi_clk : in std_logic;
                        clk : in std_logic;
                        spi_rst : in std_logic;
         spi_din : in  STD_LOGIC
                         );
end hexx;
               
architecture behavior of hexx is

signal spi_clk_d1 : std_logic;
signal spi_clk_d2 : std_logic;       
signal spi_clk_r_edge : std_logic;
signal spi_clk_f_edge : std_logic;
signal number : integer range 0 to 7;
signal tx_shift_reg : std_logic;
signal rx_shift_reg : std_logic;

begin
    process(clk, spi_rst)       
    begin
        if(spi_rst = '1') then
                                number                                  <= 0;
            spi_clk_d1                                     <= '0';
            spi_clk_d2                                     <= '0';
                                tx_shift_reg                            <= (other =>'0');
                                rx_shift_reg                            <= (other =>'0');
                                spi_clk_r_edge                          <= '0';
                                spi_clk_f_edge                          <= '0';
        elsif rising_edge(clk) then
            spi_clk_d1                                     <= spi_clk;
            spi_clk_d2                                     <= spi_clk_d1;
        end if;
    end process;         

    spi_clk_r_edge                                  <=  spi_clk_d1 and (not spi_clk_d2);                        --SPI CLK 信号上升沿
    spi_clk_f_edge                                  <=  spi_clk_d2 and (not spi_clk_d1);                        --SPI CLK 信号下降沿

        if(spi_clk_r_edge= '1') then
                if(number = 7) then

                        number                                        <= 0;
                        tx_shift_reg                                                                                         <= rx_shift_reg(6 downto 0) & spi_din;
                        spi_dout                                      <= rx_shift_reg(7);                       
                else
                        rx_shift_reg                                  <= rx_shift_reg(6 downto 0) & spi_din;
                   number                                                                                                         <= number + 1;
                end if;
        end if;
       
         if(spi_clk_f_edge = '1') then
                       
                        spi_dout                                      <= tx_shift_reg(6);
                        tx_shift_reg                                                                                         <= tx_shift_reg(6 downto 0) & '0';
         end if;

end behavior;

Error (10500): VHDL syntax error at hexx.vhd(45) near text "if";  expecting "end", or "(", or an identifier ("if" is a reserved keyword), or a concurrent statement
Error (10500): VHDL syntax error at hexx.vhd(45) near text "then";  expecting "<="
Error (10500): VHDL syntax error at hexx.vhd(46) near text "then";  expecting "<="
Error (10500): VHDL syntax error at hexx.vhd(51) near text "else";  expecting "end", or "(", or an identifier ("else" is a reserved keyword), or a concurrent statement
Error (10500): VHDL syntax error at hexx.vhd(54) near text "if";  expecting ";", or an identifier ("if" is a reserved keyword), or "architecture"
Error (10500): VHDL syntax error at hexx.vhd(57) near text "then";  expecting "<="
Error (10500): VHDL syntax error at hexx.vhd(61) near text "if";  expecting ";", or an identifier ("if" is a reserved keyword), or "architecture"


红字的是报的错误和报错的行。感觉有点莫名其妙,if和else对应,看了好久。谢谢大家了


最佳答案

查看完整内容[请看2#楼]

贴出修改后的正确的程序 library ieee; USE IEEE.std_logic_1164.ALL; USE IEEE.std_logic_unsigned.ALL; use IEEE.STD_LOGIC_ARITH.ALL; entity hexx is port ( spi_dout : out STD_LOGIC; spi_clk : in std_logic; clk : in std_logic; spi_rst : in std_logic; spi_din : in STD_LOGIC ); end hexx; architecture behavior of hexx is signal spi_clk_d1 : std_logic; sig ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2016-9-12
在线时间
35 小时
 楼主| 发表于 2016-9-29 19:06:24 | 显示全部楼层
贴出修改后的正确的程序

library ieee;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_unsigned.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
entity hexx is
port (
                        spi_dout : out  STD_LOGIC;
                        spi_clk : in std_logic;
                        clk : in std_logic;
                        spi_rst : in std_logic;
         spi_din : in  STD_LOGIC
                         );
end hexx;
               
architecture behavior of hexx is

signal spi_clk_d1 : std_logic;
signal spi_clk_d2 : std_logic;       
signal spi_clk_r_edge : std_logic;
signal spi_clk_f_edge : std_logic;
signal number : integer range 0 to 7;
signal tx_shift_reg : std_logic_vector(7 downto 0);
signal rx_shift_reg : std_logic_vector(7 downto 0);

begin
    process(clk, spi_rst)       
    begin
        if(spi_rst = '1') then

            spi_clk_d1                                     <= '0';
            spi_clk_d2                                     <= '0';

        elsif rising_edge(clk) then
            spi_clk_d1                                     <= spi_clk;
            spi_clk_d2                                     <= spi_clk_d1;
                  end if;
          end process;
          
          
         spi_clk_r_edge                                  <=  spi_clk_d1 and (not spi_clk_d2);                        --SPI CLK 信号上升沿
    spi_clk_f_edge                                  <=  spi_clk_d2 and (not spi_clk_d1);                        --SPI CLK 信号下降沿
                               
                               
    process(clk, spi_rst)       
    begin                               
                if(spi_rst = '1') then
                        number                                  <= 0;

                        tx_shift_reg                            <= (others =>'0');
                        rx_shift_reg                            <= (others =>'0');
      elsif rising_edge(clk) then
                        if(spi_clk_r_edge= '1') then
                                if (number = 7) then

                                        number                                        <= 0;
                                        tx_shift_reg                                                                                         <= rx_shift_reg(6 downto 0) & spi_din;
                                        spi_dout                                      <= rx_shift_reg(7);                       
                                else
                                        rx_shift_reg                                  <= rx_shift_reg(6 downto 0) & spi_din;
                                        number                                                                                                         <= number + 1;
                                end if;
                         end if;
       
                         if(spi_clk_f_edge = '1') then
                       
                                        spi_dout                                      <= tx_shift_reg(6);
                                        tx_shift_reg                                                                                         <= tx_shift_reg(6 downto 0) & '0';
                         end if;
                 end if;          
                 end process;

end behavior;
回复

使用道具 举报

6

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2016-9-12
在线时间
35 小时
 楼主| 发表于 2016-9-29 19:12:29 | 显示全部楼层
错误不是在信号声明那儿,我知道下面两句错了,但是我改过来还是报一样的错
signal tx_shift_reg : std_logic;
signal rx_shift_reg : std_logic;
应该是std_logic_vector(7 downto 0)
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-9-29 19:57:28 | 显示全部楼层
Verilog 不熟悉啊。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

58

主题

6291

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11406
金钱
11406
注册时间
2014-4-1
在线时间
1282 小时
发表于 2016-9-30 09:13:31 | 显示全部楼层

不懂VHDL。
不过语法问题还是容易查的。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 19:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表