3

请谁能告诉我如何修复此代码?

什么是 Illegal_sequential_statement 错误(在 modelSim 中)?

为什么它在接近时说近';' (夸特斯)?

LIBRARY ieee ;
USE ieee.std_logic_1164.all;

ENTITY Shift_reg IS
PORT( Par_LD: IN std_logic_vector(7 DOWNTO 0);
      Serial_In: IN std_logic;
      Serial_Out:OUT std_logic;
      RST, LD, EN, CLK: IN std_logic);
END Shift_reg;


ARCHITECTURE shiftRegARCH OF Shift_reg IS 

SIGNAL TEMP_REG : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL TEMP_SOUT : STD_LOGIC;

BEGIN

process(CLK,RST)
  BEGIN 

    TEMP_REG <= (OTHERS => '0') WHEN (RST = '1') ELSE 
                 Par_LD WHEN (EN = '0' AND LD = '1')ELSE
                (Serial_In & TEMP_REG(7 DOWNTO 1)) WHEN (EN = '1')ELSE
                TEMP_REG ;                
    TEMP_SOUT <= TEMP_REG(0) WHEN (EN = '1') ELSE TEMP_SOUT;
    Serial_Out <= TEMP_SOUT;
  END PROCESS;


END shiftRegARCH ;
4

2 回答 2

4

条件信号赋值

    TEMP_REG <= (OTHERS => '0') WHEN (RST = '1') ELSE
             Par_LD WHEN (EN = '0' AND LD = '1')ELSE
            (Serial_In & TEMP_REG(7 DOWNTO 1)) WHEN (EN = '1')ELSE
            TEMP_REG ;

仅对 VHDL 2008 有效。您可能将编译器设置设置为 VHDL 2002 或 VHDL 93

于 2015-10-29T05:45:31.337 回答
3

除了 lasplund 指出仅在 VHDL -2008 兼容工具中支持顺序条件信号分配(有时可以通过工具配置或命令行参数进行修复)之外,您没有使用公认的结构来指示顺序(时钟)硬件。

综合不会CLK将敏感度列表中的 存在解释为推断时钟存储,并且在 上会同时出现上升沿和下降沿事件CLK

这几乎表明您应该使用具有可识别形式的等效 if 语句来推断时钟硬件:

library ieee;
use ieee.std_logic_1164.all;

entity shift_reg is
    port ( 
        par_ld:     in  std_logic_vector(7 downto 0);
        serial_in:  in  std_logic;
        serial_out: out std_logic;
        rst, ld, 
        en, clk:    in  std_logic
    );
end entity shift_reg;


architecture shiftregarch of shift_reg is 
    signal temp_reg:    std_logic_vector(7 downto 0);
    -- signal temp_sout:   std_logic;
begin

    process(clk,rst)
    begin 
        -- temp_reg <= (others => '0') when (rst = '1') else
        --              par_ld         when (en = '0' and ld = '1') else
        --             serial_in & temp_reg(7 downto 1)
        --                             when (en = '1');
        --    --         temp_reg ;   
        if  rst = '1' then
            temp_reg <= (others => '0');
            serial_out <= '0';
        elsif rising_edge(clk) then
            if en = '0' and ld = '1' then
                temp_reg <= par_ld;
            elsif en = '1' then
                temp_reg <= serial_in & temp_reg( 7 downto 1);
                serial_out <= temp_reg(0);
            end if;
        end if;

        -- temp_sout <= temp_reg(0) when (en = '1') else temp_sout;
        -- serial_out <= temp_sout;
    end process;
end architecture shiftregarch;

请注意缺少else在顺序存储中冗余的 final ,以及在temp_sout不需要时丢弃并重置serial_out并将其包含在en保护伞中。

Quartus II 手册中有一节题为“推荐的 HDL 编码样式”,显示了 Altera 对表达时钟逻辑的建议。它并非包罗万象,因为现已撤销的 IEEE Std 1076.6-2004 给出了其他几种形式。

它包含几个移位寄存器示例,并讨论了默认值和辅助控件。

使用rising_edge 函数显示的方法可在1076.6 中找到。

虽然 Lars 解决了您的直接错误,但您可能会遇到其他错误。

于 2015-10-29T06:40:51.210 回答