2013-09-25 80 views
0

我是新來的VHDL和我收到以下錯誤,當我嘗試編譯我的代碼:VHDL錯誤STD_LOGIC類型不匹配整數文字

錯誤(10517):在vga_controller VHDL類型不匹配錯誤。 vhd(60):std_logic類型與整數文字不匹配 錯誤(10327):vga_controller.vhd處的VHDL錯誤(60):無法確定運算符的定義「」 - 「」 - 找到0個可能的定義

似乎問題是h_count,在我設置爲STD_lOGIC之前,我將它設置爲INTEGER,它的抱怨如下:

錯誤(10476):vga的VHDL錯誤_controller.vhd(104):標識符類型「h_count」不同意它的用法,因爲「std_logic_vector」類型

因此,我將其更改爲STD_LOGIC,但它只是給我另一個錯誤消息。

LIBRARY ieee; 
USE ieee.std_logic_1164.all; 
USE ieee.numeric_std.all; 

ENTITY vga_controller IS 
GENERIC(
h_pulse  : INTEGER := 128;  --horiztonal sync pulse width in pixels 
    h_bp  : INTEGER := 88;  --horiztonal back porch width in pixels 
    h_pixels : INTEGER := 800;  --horiztonal display width in pixels 
    h_fp  : INTEGER := 40;  --horiztonal front porch width in pixels 
    h_pol  : STD_LOGIC := '1';  --horizontal sync pulse polarity (1 = positive, 0 = negative) 
    v_pulse  : INTEGER := 4;  
v_bp  : INTEGER := 23;   --vertical back porch width in rows 
    v_pixels : INTEGER := 600;  --vertical display width in rows 
    v_fp  : INTEGER := 1;   --vertical front porch width in rows 
    v_pol  : STD_LOGIC := '1'); --vertical sync pulse polarity (1 = positive, 0 = negative) 
PORT(
    pixel_clk : IN  STD_LOGIC; --pixel clock at frequency of VGA mode being used 
    reset_n  : IN  STD_LOGIC;  --active low asycnchronous reset 
    h_sync  : OUT STD_LOGIC; --horiztonal sync pulse 
    v_sync  : OUT STD_LOGIC; --vertical sync pulse 
    disp_ena  : OUT STD_LOGIC; --display enable ('1' = display time, '0' = blanking time) 
    column  : OUT STD_LOGIC_VECTOR (10 downto 0);  --horizontal pixel coordinate 
    row   : OUT STD_LOGIC_VECTOR (10 downto 0); --vertical pixel coordinate 
    n_blank  : OUT STD_LOGIC; --direct blacking output to DAC 
    n_sync  : OUT STD_LOGIC); --sync-on-green output to DAC 
END vga_controller; 

ARCHITECTURE behavior OF vga_controller IS 
CONSTANT h_period : INTEGER := h_pulse + h_bp + h_pixels + h_fp; --total number of pixel clocks in a row 
CONSTANT v_period : INTEGER := v_pulse + v_bp + v_pixels + v_fp; --total number of rows in column 
BEGIN 

BEGIN 

    n_blank <= '1'; --no direct blanking 
    n_sync <= '0'; --no sync on green 

    PROCESS(pixel_clk, reset_n) 
     VARIABLE h_count : STD_LOGIC RANGE 0 TO h_period - 1 := 0; --horizontal counter (counts the columns) 
     VARIABLE v_count : STD_LOGIC RANGE 0 TO v_period - 1 := 0; --vertical counter (counts the rows) 

    BEGIN 

     IF(reset_n = '0') THEN  --reset asserted 
      h_count := 0;    --reset horizontal counter 
      v_count := 0;    --reset vertical counter 
      h_sync <= NOT h_pol;  --deassert horizontal sync 
      v_sync <= NOT v_pol;  --deassert vertical sync 
      disp_ena <= '0';   --disable display 
      column <= "00000000000";    --reset column pixel coordinate 
      row <= "00000000000";     --reset row pixel coordinate 

     ELSIF(pixel_clk'EVENT AND pixel_clk = '1') THEN 

      --counters 
      IF(h_count < h_period - 1) THEN  --horizontal counter (pixels) 
       h_count := h_count + 1; 
      ELSE 
       h_count := 0; 
       IF(v_count < v_period - 1) THEN --veritcal counter (rows) 
        v_count := v_count + 1; 
       ELSE 
        v_count := 0; 
       END IF; 
      END IF; 

      --horizontal sync signal 
      IF(h_count < h_pixels + h_fp OR h_count > h_pixels + h_fp + h_pulse) THEN 
       h_sync <= NOT h_pol;  --deassert horiztonal sync pulse 
      ELSE 
       h_sync <= h_pol;   --assert horiztonal sync pulse 
      END IF; 

      --vertical sync signal 
      IF(v_count < v_pixels + v_fp OR v_count > v_pixels + v_fp + v_pulse) THEN 
       v_sync <= NOT v_pol;  --deassert vertical sync pulse 
      ELSE 
       v_sync <= v_pol;   --assert vertical sync pulse 
      END IF; 

      --set pixel coordinates 
      IF(h_count < h_pixels) THEN  --horiztonal display time 
       column <= h_count;   --set horiztonal pixel coordinate 
      END IF; 
      IF(v_count < v_pixels) THEN --vertical display time 
       row <= v_count;    --set vertical pixel coordinate 
      END IF; 

      --set display enable output 
      IF(h_count < h_pixels AND v_count < v_pixels) THEN  --display time 
       disp_ena <= '1';            --enable display 
      ELSE                 --blanking time 
       disp_ena <= '0';            --disable display 
      END IF; 

     END IF; 
    END PROCESS; 

END behavior; 

回答

0

行號在您提供的不匹配的代碼片段的錯誤信息和你有一個重複的BEGIN的架構。

回到原來的設計規範:

LIBRARY ieee; 
USE ieee.std_logic_1164.all; 
USE ieee.numeric_std.all; 

ENTITY vga_controller IS 
    GENERIC(
     h_pulse  : INTEGER := 128;  --horiztonal sync pulse width in pixels 
     h_bp  : INTEGER := 88;  --horiztonal back porch width in pixels 
     h_pixels : INTEGER := 800;  --horiztonal display width in pixels 
     h_fp  : INTEGER := 40;  --horiztonal front porch width in pixels 
     h_pol  : STD_ULOGIC := '1'; --horizontal sync pulse polarity (1 = positive, 0 = negative) 
     v_pulse  : INTEGER := 4;  
     v_bp  : INTEGER := 23;  --vertical back porch width in rows 
     v_pixels : INTEGER := 600;  --vertical display width in rows 
     v_fp  : INTEGER := 1;  --vertical front porch width in rows 
     v_pol  : STD_ULOGIC := '1' --vertical sync pulse polarity (1 = positive, 0 = negative) 
    ); 
PORT(
     pixel_clk : IN STD_LOGIC; --pixel clock at frequency of VGA mode being used 
     reset_n  : IN STD_LOGIC;  --active low asycnchronous reset 
     h_sync  : OUT STD_LOGIC; --horiztonal sync pulse 
     v_sync  : OUT STD_LOGIC; --vertical sync pulse 
     disp_ena : OUT STD_LOGIC; --display enable ('1' = display time, '0' = blanking time) 
     column  : OUT STD_LOGIC_VECTOR (10 downto 0);  --horizontal pixel coordinate 
     row   : OUT STD_LOGIC_VECTOR (10 downto 0); --vertical pixel coordinate 
     n_blank  : OUT STD_LOGIC; --direct blacking output to DAC 
     n_sync  : OUT STD_LOGIC --sync-on-green output to DAC 
    ); 
END vga_controller; 

ARCHITECTURE behavior OF vga_controller IS 
CONSTANT h_period : INTEGER := h_pulse + h_bp + h_pixels + h_fp; --total number of pixel clocks in a row 
CONSTANT v_period : INTEGER := v_pulse + v_bp + v_pixels + v_fp; --total number of rows in column 

BEGIN 

    n_blank <= '1'; --no direct blanking 
    n_sync <= '0'; --no sync on green 

frame_counters: 
    PROCESS(pixel_clk, reset_n) 
     VARIABLE h_count : INTEGER RANGE 0 TO h_period - 1 := 0; --horizontal counter (counts the columns) 
     VARIABLE v_count : INTEGER RANGE 0 TO v_period - 1 := 0; --vertical counter (counts the rows) 

    BEGIN 

     IF(reset_n = '0') THEN  --reset asserted 
      h_count := 0;    --reset horizontal counter 
      v_count := 0;    --reset vertical counter 
      h_sync <= NOT h_pol;  --deassert horizontal sync 
      v_sync <= NOT v_pol;  --deassert vertical sync 
      disp_ena <= '0';   --disable display 
      column <= "00000000000";    --reset column pixel coordinate 
      row <= "00000000000";     --reset row pixel coordinate 

     ELSIF(pixel_clk'EVENT AND pixel_clk = '1') THEN 

      --counters 
      IF(h_count < h_period - 1) THEN  --horizontal counter (pixels) 
       h_count := h_count + 1; 
      ELSE 
       h_count := 0; 
       IF(v_count < v_period - 1) THEN --veritcal counter (rows) 
        v_count := v_count + 1; 
       ELSE 
        v_count := 0; 
       END IF; 
      END IF; 

      --horizontal sync signal 
      IF(h_count < h_pixels + h_fp OR h_count > h_pixels + h_fp + h_pulse) THEN 
       h_sync <= NOT h_pol;  --deassert horiztonal sync pulse 
      ELSE 
       h_sync <= h_pol;   --assert horiztonal sync pulse 
      END IF; 

      --vertical sync signal 
      IF(v_count < v_pixels + v_fp OR v_count > v_pixels + v_fp + v_pulse) THEN 
       v_sync <= NOT v_pol;  --deassert vertical sync pulse 
      ELSE 
       v_sync <= v_pol;   --assert vertical sync pulse 
      END IF; 

      --set pixel coordinates 
      IF(h_count < h_pixels) THEN  --horiztonal display time 
       column <= std_logic_vector(to_unsigned(h_count,column'LENGTH));   --set horiztonal pixel coordinate 
      END IF; 
      IF(v_count < v_pixels) THEN --vertical display time 
       row <= std_logic_vector(to_unsigned(v_count,row'LENGTH));    --set vertical pixel coordinate 
      END IF; 

      --set display enable output 
      IF(h_count < h_pixels AND v_count < v_pixels) THEN  --display time 
       disp_ena <= '1';         --enable display 
      ELSE                 --blanking time 
       disp_ena <= '0';            --disable display 
      END IF; 

     END IF; 
    END PROCESS; 

END behavior; 

注意的變化,支持整數std_logic_vector轉換:

 --set pixel coordinates 
     IF(h_count < h_pixels) THEN  --horiztonal display time 
      column <= std_logic_vector(to_unsigned(h_count,column'LENGTH)); --set horiztonal pixel coordinate 
     END IF; 
     IF(v_count < v_pixels) THEN --vertical display time 
      row <= std_logic_vector(to_unsigned(v_count,row'LENGTH)); --set vertical pixel coordinate 
     END IF; 

注意這是僞源只是乾淨分析(和它) 。

0

你的問題是你是混合整數和std_logic_vector類型。

例如您指定的H_COUNT整數到 std_logic_vector沒有類型轉換。您的線路:

column <= h_count; 

應該是:

column <= std_logic_vector(to_unsigned(h_count, column'length)); 

此類型轉換H_COUNT到一個無符號以相同的寬度爲,然後將其澆鑄到std_logic_vector類型。每次將整數轉換爲std_logic_vector時都是如此。

要圍繞走另一條路和std_logic_vector轉換爲整數使用下面的例子中,假設它是無符號:

h_count <= to_integer(unsigned(column));