線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2769
推到 Plurk!
推到 Facebook!

有關於vhdl的問題

答題得分者是:addn
極光
初階會員


發表:32
回覆:96
積分:40
註冊:2005-01-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-20 08:06:50 IP:61.221.xxx.xxx 未訂閱
小弟我最近在研究cpld,我打算做一個可以將led做來回閃爍的功能 但是左足一亮到最右我寫的出來,但是要返回我就寫不出來了。 我使用的方法是用4位元的上數計數器,然後輸出再掛一個4*16的解碼器 我知道返回只要將4位元上數變成下數就可以了,但要這樣才能設計說當我計數 到"1111"時就立刻開始在下數,又計數到"0000"換成上數 或者各位大大有更好的方法!可以提供一下嗎! 實在是想不出來

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-20 08:27:41 IP:220.134.xxx.xxx 未訂閱
有點浪費IC... 你可以用移位的方式,直接左移右移.然後直接輸出.delay時間可以自己設. 假設8個led則=> 00000001 -> 00000010 -> 00000100.....10000000 -> 01000000 .... 以此類推
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
極光
初階會員


發表:32
回覆:96
積分:40
註冊:2005-01-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-20 08:59:52 IP:61.221.xxx.xxx 未訂閱
引言: 有點浪費IC... 你可以用移位的方式,直接左移右移.然後直接輸出.delay時間可以自己設. 假設8個led則=> 00000001 -> 00000010 -> 00000100.....10000000 -> 01000000 .... 以此類推
的確耶!我也覺得挺浪費的 但是用移位的要可以移回來嗎! 0001->0010->0100->1000->0100->0010->0001 我要的是這樣!移位我也有考慮過,但是還是卡在那(紅色那段)

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-20 09:11:43 IP:211.22.xxx.xxx 未訂閱
引言: 的確耶!我也覺得挺浪費的 但是用移位的要可以移回來嗎! 0001->0010->0100->1000->0100->0010->0001 我要的是這樣!移位我也有考慮過,但是還是卡在那(紅色那段)
設個bit做判斷,當=0001時為0 =>左移,當=1000時為1=>右移 以這樣的概念去寫就好了,這個不難!!
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
極光
初階會員


發表:32
回覆:96
積分:40
註冊:2005-01-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-20 15:25:34 IP:61.221.xxx.xxx 未訂閱
引言:
引言: 的確耶!我也覺得挺浪費的 但是用移位的要可以移回來嗎! 0001->0010->0100->1000->0100->0010->0001 我要的是這樣!移位我也有考慮過,但是還是卡在那(紅色那段)
設個bit做判斷,當=0001時為0 =>左移,當=1000時為1=>右移 以這樣的概念去寫就好了,這個不難!!
還是搞的有點模糊!初始值要這麼做阿!沒有最初的狀態要這麼移呢? 而且用什麼方法移,用移位暫存器的寫法,還是什麼方法呢

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-21 11:22:12 IP:211.72.xxx.xxx 未訂閱
引言: 還是搞的有點模糊!初始值要這麼做阿!沒有最初的狀態要這麼移呢? 而且用什麼方法移,用移位暫存器的寫法,還是什麼方法呢
你可以設一個暫存器,值就設為0001,不變. x=0001,y=x右移或左移.
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
addn
高階會員


發表:64
回覆:221
積分:202
註冊:2005-03-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-21 12:25:45 IP:218.171.xxx.xxx 未訂閱
可以做一個reset來做初始值    ex:    
    IF(reset='1') THEN
   count<=10000000;
ELSIF(clk'EVENT AND clk='1') THEN
    .
    .
    .
    .    END IF;    
極光
初階會員


發表:32
回覆:96
積分:40
註冊:2005-01-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-05-22 09:19:20 IP:61.221.xxx.xxx 未訂閱
引言: 可以做一個reset來做初始值 ex:
    IF(reset='1') THEN
   count<=10000000;
ELSIF(clk'EVENT AND clk='1') THEN
    .
    .
    .
    .    END IF;    
暫存器要這麼寫呢?書上沒有寫耶! 還有我左移完後要右移既然不行耶! IF (CLK'EVENT AND CLK='1') THEN QN(15)<=D; FOR I IN 1 TO 15 LOOP QN(15-I)<=QN(16-I); END LOOP; ELSEIF (QN(0)='1') THEN FOR I IN 15 DOWNTO 1 LOOP QN(16-I)<=QN(15-I); END LOOP; 這樣寫不行耶!電腦都說我有錯誤! 還有問一個小問題喔!我用max plus的圖形編輯器 然後將我之前的小程式變成電路符號 然後我將這兩個電路符號用圖形編輯器做編輯 做組譯並沒有問題,但是要模擬時卻發生問題了 會出現下面這行字"Installed hardware does not support Use Device option" 這是什麼意思阿!但是沒有使用到*.SYM的話 我都可以模擬耶!真是奇怪阿!

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-05-22 09:43:20 IP:61.70.xxx.xxx 未訂閱
引言: 暫存器要這麼寫呢?書上沒有寫耶! 還有我左移完後要右移既然不行耶! [code] IF (CLK'EVENT AND CLK='1') THEN QN(15)<=D; FOR I IN 1 TO 15 LOOP QN(15-I)<=QN(16-I); END LOOP; ELSEIF (QN(0)='1') THEN FOR I IN 15 DOWNTO 1 LOOP QN(16-I)<=QN(15-I); END LOOP; 這樣寫不行耶!電腦都說我有錯誤! 還有問一個小問題喔!我用max plus的圖形編輯器 然後將我之前的小程式變成電路符號 然後我將這兩個電路符號用圖形編輯器做編輯 做組譯並沒有問題,但是要模擬時卻發生問題了 會出現下面這行字"Installed hardware does not support Use Device option" 這是什麼意思阿!但是沒有使用到*.SYM的話 我都可以模擬耶!真是奇怪阿!
1>你最後少了一個end if 2>po程式碼請縮排,不知如何做請看版規 3>位移我記得有專門的指令,不須這樣寫,找一下吧! 3>我不曉得你是怎麼模擬的,一般組譯ok會有一個*.scf,利用這個檔便可以模擬
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
addn
高階會員


發表:64
回覆:221
積分:202
註冊:2005-03-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-05-22 11:25:50 IP:218.171.xxx.xxx 未訂閱
你移位暫存器條件判斷寫法有問題    請參考下列code    
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;    ENTITY test11 IS
  PORT (clk,reset: IN STD_LOGIC;
       
        counter:OUT STD_LOGIC_VECTOR(7 DOWNTO 0 ));
END test11;    ARCHITECTURE  a  OF  test11 IS     SIGNAL temp:STD_LOGIC_VECTOR(7 DOWNTO 0 );
SIGNAL flag:STD_LOGIC;    BEGIN    PROCESS(clk)
 BEGIN
  IF(reset='1') THEN
   temp<="00000001";
   flag<='0';
  ELSIF(clk'EVENT AND clk='1') THEN
    IF(flag='0') THEN
      temp(7 downto 1)<=temp(6 downto 0);
      temp(0)<='0';
      IF(temp(6)='1') THEN
        flag<='1';
      END IF;
    ELSE
      temp(6 downto 0)<=temp(7 downto 1);
      temp(7)<='0';
      IF(temp(1)='1') THEN
        flag<='0';
      END IF;       END IF;
  END IF;     END PROCESS;
 
counter<=temp;    END a;    
還有用create symbol方式 要將.sym所在之目錄加入libraries 選options 選 Use libraries 再將目錄加入 這樣就可以使用了
sn903209
初階會員


發表:53
回覆:86
積分:32
註冊:2005-03-27

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-05-22 13:09:50 IP:218.169.xxx.xxx 未訂閱
竟然都用vhdl寫了,那就用vhdl寫完吧,就不用用到圖形法這麼麻煩了 如果書上沒寫,那代表別的書有寫 去圖書館借幾本你覺得你看得懂又會看的書來學習 "陳慶逸、林柏辰,“VHDL 數位電路實習與專題設計”,文魁資訊股份有限公司,2004年二月初版2刷。" 這本書我覺得實做還有應用都不錯喔,可以去參考一下
極光
初階會員


發表:32
回覆:96
積分:40
註冊:2005-01-16

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-05-22 17:02:44 IP:61.221.xxx.xxx 未訂閱
引言: 你移位暫存器條件判斷寫法有問題 請參考下列code
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;    ENTITY test11 IS
  PORT (clk,reset: IN STD_LOGIC;
       
        counter:OUT STD_LOGIC_VECTOR(7 DOWNTO 0 ));
END test11;    ARCHITECTURE  a  OF  test11 IS     SIGNAL temp:STD_LOGIC_VECTOR(7 DOWNTO 0 );
SIGNAL flag:STD_LOGIC;    BEGIN    PROCESS(clk)
 BEGIN
  IF(reset='1') THEN
   temp<="00000001";
   flag<='0';
  ELSIF(clk'EVENT AND clk='1') THEN
    IF(flag='0') THEN
      temp(7 downto 1)<=temp(6 downto 0);
      temp(0)<='0';
      IF(temp(6)='1') THEN
        flag<='1';
      END IF;
    ELSE
      temp(6 downto 0)<=temp(7 downto 1);
      temp(7)<='0';
      IF(temp(1)='1') THEN
        flag<='0';
      END IF;       END IF;
  END IF;     END PROCESS;
 
counter<=temp;    END a;    
還有用create symbol方式 要將.sym所在之目錄加入libraries 選options 選 Use libraries 再將目錄加入 這樣就可以使用了
好神奇喔!這的可以達到我要的目的耶!不過程式有些地方看不懂耶! "FLAGE"是幹嘛的阿?不懂它在程式中的功能是什麼耶! 還有移位的方式我也看不太懂耶!可以解譯一下嗎? 因為我翻了兩本書,移位暫存器的寫法都用FOR LOOP寫的 所以大大這種寫法看不懂耶! 不過還是感謝各位的回答!VHDL真是不太好學耶! 自己自修有點難弄懂耶!在單晶片中最簡單的霹靂燈都弄不出來阿!

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-05-22 18:21:13 IP:220.134.xxx.xxx 未訂閱
flag是用來判斷是否位移到最左邊了,以準備改為右移. 不過這個判斷好像該改為:
  IF(temp(7)='1') THEN
        flag<='1';
  END IF;
addn兄的這兩行寫法:
temp(7 downto 1)<=temp(6 downto 0);
      temp(0)<='0'; 
可改為:
temp<=temp(6 downto 0) & '0';
意思是一樣的,你玩玩看就知道了. VHDL 與 Verilog HDL ,Verilog 比較好學,因為它比較像C VHDL支援的會比較多,去找找專門講VHDL的書你就知道了. 發表人 - ㊣ 於 2005/05/22 18:23:00
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
addn
高階會員


發表:64
回覆:221
積分:202
註冊:2005-03-21

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-05-22 19:13:58 IP:218.171.xxx.xxx 未訂閱
㊣ 大大 說的沒錯    而且    
temp(7 downto 1)<=temp(6 downto 0);
      temp(0)<='0';
跟你用 FOR LOOP 方式意義上是一樣的,都可以 flag是作為判斷左右移的作用,flag=0左移 flag=1右移 但是
    .
    .
IF(temp(6)='1') THEN
        flag<='1';
      END IF
    .
    .
IF(temp(1)='1') THEN
        flag<='0';
      END IF
    .
    .
  
這部分沒錯而不是
    .
    .
IF(temp(7)='1') THEN
        flag<='1';
      END IF
    .
    .
IF(temp(0)='1') THEN
        flag<='0';
      END IF
    .
    .
  
因為會差一個clock所以這部分要特別注意 vhdl只要多看多練習,不會粉難啦 不要以純程式設計觀點,去看vhdl的描述 最好還是要有一點數位邏輯的概念,這樣會比較容易理解
極光
初階會員


發表:32
回覆:96
積分:40
註冊:2005-01-16

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-05-23 18:32:27 IP:61.221.xxx.xxx 未訂閱
引言: ㊣ 大大 說的沒錯 而且
temp(7 downto 1)<=temp(6 downto 0);
      temp(0)<='0';
跟你用 FOR LOOP 方式意義上是一樣的,都可以 flag是作為判斷左右移的作用,flag=0左移 flag=1右移 但是
    .
    .
IF(temp(6)='1') THEN
        flag<='1';
      END IF
    .
    .
IF(temp(1)='1') THEN
        flag<='0';
      END IF
    .
    .
  
這部分沒錯而不是
    .
    .
IF(temp(7)='1') THEN
        flag<='1';
      END IF
    .
    .
IF(temp(0)='1') THEN
        flag<='0';
      END IF
    .
    .
  
因為會差一個clock所以這部分要特別注意 vhdl只要多看多練習,不會粉難啦 不要以純程式設計觀點,去看vhdl的描述 最好還是要有一點數位邏輯的概念,這樣會比較容易理解
的確如同大大所說的!不可以設定 IF(temp(7)='1') THEN flag<='1'; END IF 我用過模擬出來會有問題!但是我不懂耶! temp(7 downto 1)<=temp(6 downto 0); 這行是做移位的工作 但是我請教一下喔!下面的判斷式設定當TMP(6)='1'然後 flag就被設定為1 如果當TMP=01000000時,會先判斷tmp(6)是否為1 現在條件成立了,不就跳到右移那行去了嗎!這樣第7個bit不就恆為0 我卡在這裡搞不太懂耶!
addn
高階會員


發表:64
回覆:221
積分:202
註冊:2005-03-21

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-05-23 19:50:58 IP:218.171.xxx.xxx 未訂閱
我不太會描述這種現象    但我會盡量說明清楚    左移    假設clk使temp=00100000,(此時flag的輸入=0,flag的輸出=0)    因為flag的輸出=0所以維持左移    下一個clk使temp=01000000,(此時flag的輸入=1,flag的輸出=0)    因為flag的輸出=0所以維持左移    下一個clk使temp=10000000,(此時flag的輸入=1,flag的輸出=1)    因為flag的輸出=1所以變為右移    就這樣一直循環    建議模擬時將flag.D及flag.Q拉出來看波形就會比較清楚        另外將temp由signal改成variable這樣判斷就要改成
IF(temp(7)='1') THEN
 lag<='1';
END IF
用variable方式就不會差一個clock時間
極光
初階會員


發表:32
回覆:96
積分:40
註冊:2005-01-16

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-05-23 20:12:15 IP:61.221.xxx.xxx 未訂閱
喔!原來如此阿!原來vhdl是這樣阿! 我還以為當flag<='0'就表示輸出為"0" 我把它當作是8051的組合語言了!寫組合語言寫太久變成反應不過來! 原來狀態不會馬上作改變阿! 必須等到下一個上緣才會做調整喔 感謝大大的回應喔!又學到蠻多東西了喔!
系統時間:2024-05-17 5:34:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!