이 일반적인 FPGA 설계 질문에, 나는 FPGA 설계에 새로운 종류의이야 그냥 멋진 선형 대수 해법을 구축, 내 첫 번째 대규모 프로젝트에 착수했다. 시스템은 꽤 큽니다. 그래서 처음부터 올바르게 시작하는 것이 중요합니다. 성공적인 시뮬레이션 후VHDL 상태 머신의 출력 동기화되지
내가 지금 sythensizing하고 있지만, 악몽 데, 나는 구축하고 시뮬레이션에서와 같이 아무것도 작동하지 않기 때문에 구성 요소 구성 요소를 테스트하는 데! 출력은 예를 들어, 동기화되지 않는 여기서 I는 주로이 내가 사용하는 데이터 로더 상태 기계에 문제가있어 :
기본적entity TriDiag_Data_Scheduler is
generic(W : integer :=16;
AW : integer := 10 -- address width
);
Port (clk : in STD_LOGIC;
rst : in STD_LOGIC; --attatched to data finished
d_ready : in STD_LOGIC;
din : in STD_LOGIC_VECTOR (W-1 downto 0);
wr_en : out STD_LOGIC_VECTOR (3 downto 0);
dout_a, dout_b, dout_c, dout_y : out STD_LOGIC_VECTOR (W-1 downto 0);
addr_out : out STD_LOGIC_VECTOR (AW-1 downto 0));
end TriDiag_Data_Scheduler;
architecture Behavioral of TriDiag_Data_Scheduler is
type state is (a,b,c,y);
signal state_pr, state_next : state := y;
signal addr_reg, addr_next : std_logic_vector(AW-1 downto 0) :=(others =>'1');
signal wr_en_next : std_logic_vector(3 downto 0);
--data buffer
signal d_buff, d_buff_a, d_buff_b, d_buff_c, d_buff_y : std_logic_vector (W-1 downto 0) :=(others =>'0');
signal d_buff_a_reg, d_buff_b_reg, d_buff_c_reg, d_buff_y_reg : std_logic_vector (W-1 downto 0) :=(others =>'0');
begin
process(clk,rst)
begin
if(clk'event and clk ='1') then
state_pr <= state_next;
d_buff_a <= d_buff_a_reg;
d_buff_b <= d_buff_b_reg;
d_buff_c <= d_buff_c_reg;
d_buff_y <= d_buff_y_reg;
addr_reg <= addr_next;
wr_en <= wr_en_next;
end if;
end process;
addr_out <= addr_reg;
dout_a <= d_buff_a;
dout_b <= d_buff_b;
dout_c <= d_buff_c;
dout_y <= d_buff_y;
--Data out logic
process(state_pr, d_buff_a, d_buff_b, d_buff_c, d_buff_y, d_buff)
begin
d_buff_a_reg <= d_buff_a;
d_buff_b_reg <= d_buff_b;
d_buff_c_reg <= d_buff_c;
d_buff_y_reg <= d_buff_y;
case state_pr is
when a => --move data to a reg
d_buff_a_reg <= d_buff;
when b => --move data to b reg
d_buff_b_reg <= d_buff;
when c => --move data to c reg
d_buff_c_reg <= d_buff;
when y =>
d_buff_y_reg <= d_buff;
end case;
end process;
--next state and addr logic
process(state_pr, d_ready, rst, din)
begin
state_next <= state_pr;
addr_next <= addr_reg;
wr_en_next <= (others => '0');
if(rst = '1') then
state_next <= a;
addr_next <= (others =>'1');
wr_en_next <= (others => '0');
elsif(d_ready = '1') then
--Read in the data to the buffer
d_buff <= din;
--next state logic
case state_pr is
when a => --move data to a reg
addr_next <= addr_reg + 1;
-- d_buff_a_reg <= din;
wr_en_next <= "0001";
state_next <= b;
when b => --move data to b reg
wr_en_next <= "0010";
-- d_buff_b_reg <= din;
state_next <= c;
when c => --move data to c reg
wr_en_next <= "0100";
-- d_buff_c_reg <= din;
state_next <= y;
when y =>
-- d_buff_y_reg <= din;
wr_en_next <= "1000";
state_next <= a;
end case;
end if;
end process;
end Behavioral;
데이터는 UART 모듈을 통해 수신 될 때의 작업이 다음에로드하는 것 올바른 메모리 (write_en 신호로 제어 됨). 문제는 모든 디자인에서 (이것은 리비전 7입니다) 모든 addr_out, wr_en 및 올바른 데이터가 syn에 있지만, 합성에서 addr 및 wr_en이 데이터와 syn에없고 이전의 절반에서 읽음을 계속 찾습니다. 이전 상태의 절반입니다.
어떤 디자인 사례를 나는 각 구성 요소에 대한 내 모든 이전의 하드 작업을 다시 작성해야 내 VHDL 때문에이 속도 친화적 더 syntheziable이되도록 사용해야합니다! d_ready 신호가 다른 모듈에서 주장 사이에 디자인 작업
많은 감사 샘
내 VHDL 집은 사과 있도록 가르쳐! –
큰 민감도 목록이있는 비 시계 프로세스를 볼 때마다 그 중 일부가 누락되었다고 가정합니다. 나는 세부 사항을 자세히 살펴 보지 못했지만 신디사이저 경고를 확인하여 아무것도 발견되었는지 확인합니다. 개인적으로 나는 이것을 단일 클록 된 프로세스로 다시 작성합니다. –
Martin에게 다시 한번 감사드립니다. 문제는 외부 d_ready 신호에 민감하다는 것입니다. 나는 d_ready 신호에 의해 설정되었지만 clk에 주장 된 동기 틱을 추가하여 문제를 해결했습니다. 나는 d_ready와 clk 사이의 아주 좋은 왜곡으로 고통 받고 있다고 생각하는데, 이것이 왜 모두 동기화되지 않았는가하는 것입니다. 그러나 이제는 동기 틱에 모든 것이 활성화되어 작동하는 것 같습니다. –