- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello. I am making priority encoder in vhdl and I want to use process, case statement and
don't care statement. This is my code and compile is done very well. but in model_sim, the output is always '000' even though when I changed input clock.. what's the problem? LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY enco is port( input : in std_logic_vector(7 downto 0); binary_out : out std_logic_vector(2 downto 0)); end enco; ARCHITECTURE arc of enco is begin process(input) begin case input is when "00000001" => binary_out <= "000"; when "0000001-" => binary_out <= "001"; when "000001--" => binary_out <= "010"; when "00001---" => binary_out <= "011"; when "0001----" => binary_out <= "100"; when "001-----" => binary_out <= "101"; when "01------" => binary_out <= "110"; when "1-------" => binary_out <= "111"; when others => binary_out <= "000"; end case; end process; end arc;Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Rewrite it with,
if elsif elsif ... ... else Statements. Drop the don't cares. Think about this, What is if (input1 = '-') then ... is it true or false?- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I haven't used VHDL in ages but I don't think it supports don't cares in case statements until the 2008 version. So go into the Quartus settings for the project --> Analysis and Synthesis --> VHDL input --> select 2008 version
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Ok, you cannot use '-' in case statements with older versions of VHDL, but newer versions of Quartus do support the matching case statement from 2008 (ie. using dont cares).
If you have problems with this, you can always use the old fashioned method using the std_match function from the numeric_std library:
if std_match(input, "00000001") then
elsif std_match(input, "0000001-") then
elsif std_match(input, "000001--") then
--etc
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I am using the quartus 12.0 version..
is the quartus version too old to use don't care statement i wrote in my code??- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Q12 is the most up to date. In the menu, you need to set the VHDL version to 2008, or for modelsim, use the -2008 option on vcom when you compile the VHDL (what version of modelsim is it?)
in Quartus: assignments -> settings -> analysis and synthesis settings -> VHDL input -> 2008 The problem is for a while modelsim and quartus supported different things. You need modelsim 10.1 I think for full VHDL 2008 support.- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
just checked, modelsim 10.0 should support matching case statements, but you need to compile the code with the -2008 switch. Or modify your modelsim.ini so that
VHDL93 = 2008 (its a silly variable name, but its old)- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello.. I want to make priority encoder. and I need to use "don't care"
the first code is working well. but when i tested in model_sim. the output is always "000". i thinks if input is "00001--" , and if I make the output "00000100" ,"00000101", "00000110" or "00000111", the output should be "2" = "010". but it's always "000". I use quartus2 version 12.0 and model_sim 12.0 (free_version) (someone said i should use std_match so i made second code using std_match, but it has error. what is the problem?) can anyone give me the priority encoder example using don't care "-"? I am doing this for 1 hours.. but i don't know what's wrong!! ---------------------------------------------------------- ---------------------------------------------------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY enco is port( input : in std_logic_vector(7 downto 0); binary_out : out std_logic_vector(2 downto 0)); end enco; ARCHITECTURE arc of enco is begin process(input) begin case input is when "00000001" => binary_out <= "000"; when "0000001-" => binary_out <= "001"; when "000001--" => binary_out <= "010"; when "00001---" => binary_out <= "011"; when "0001----" => binary_out <= "100"; when "001-----" => binary_out <= "101"; when "010-----" => binary_out <= "110"; when "1-------" => binary_out <= "111"; when others => binary_out <= "000"; end case; end process; end arc; ------------------------------------------------------------ ------------------------------------------------------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY enco1 is port( input : in std_logic_vector(7 downto 0); -- 8bit vector 를 이용해 input0~input7를 한번에 만듬 binary_out : out std_logic_vector(2 downto 0)); -- 3bit vector 를 이용해 input1,input2,input3를 한번에 엮음 end enco1; ARCHITECTURE arc of enco1 is begin process(input) begin if std_match(input, "00000001") then binary_out <= "000"; elsif std_match(input, "0000001-") then binary_out <= "001"; elsif std_match(input,"000001--") then binary_out<="010"; elsif std_match(input,"00001---") then binary_out<="011"; elsif std_match(input,"0001----") then binary_out<="100"; elsif std_match(input,"001-----") then binary_out<="101"; elsif std_match(input,"01------") then binary_out<="110"; elsif std_match(input,"1-------") then binary_out<="111"; else binary_out<="000"; end if; end process; end arc;- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
you didnt say what the error was with the std_match version.
And did you set up the first version to VHDL 2008?- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
another way out. don't use don't care.
if (input = "00000001") then binary_out <= "000"; elsif (input(7 downto 1) = "0000001") then binary_out <= "001"; elsif (input(7 downto 2) = "000001") then binary_out <= "010"; ... ...- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
if you want to include don't care (-) use this code this works....
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity enc is Port ( i_l : in STD_uLOGIC_VECTOR (7 downto 0); ei_l : in STD_uLOGIC; a_l : out STD_uLOGIC_VECTOR (2 downto 0); gs_l,eo_l : out STD_uLOGIC); end enc; architecture Behavioral of enc is begin process(i_l,ei_l) begin if (ei_l='0') then if std_match(i_l,"0-------") then a_l<="000"; gs_l<='0';eo_l<='1'; elsif std_match(i_l,"10------") then a_l<="001"; gs_l<='0';eo_l<='1'; elsif std_match(i_l,"110-----") then a_l<="010"; gs_l<='0';eo_l<='1'; elsif std_match(i_l,"1110----") then a_l<="011"; gs_l<='0';eo_l<='1'; elsif std_match(i_l,"11110---") then a_l<="100"; gs_l<='0';eo_l<='1'; elsif std_match(i_l,"111110--") then a_l<="101"; gs_l<='0';eo_l<='1'; elsif std_match(i_l,"1111110-") then a_l<="110"; gs_l<='0';eo_l<='1'; elsif std_match(i_l,"11111110") then a_l<="111"; gs_l<='0';eo_l<='1'; elsif std_match(i_l,"11111111") then a_l<="111"; gs_l<='1';eo_l<='0'; end if; else a_l<="111";gs_l<='1';eo_l<='1'; end if; end process; end Behavioral;- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page