伊莉討論區

標題: 請各位大大幫忙 如何使用QuartusII8.1 CycloneIII:EP3C16F484C6 FPGA Verilog_Altera_DE0 做7段顯示 4 [打印本頁]

作者: cjnjaup3    時間: 2013-11-25 05:51 PM     標題: 請各位大大幫忙 如何使用QuartusII8.1 CycloneIII:EP3C16F484C6 FPGA Verilog_Altera_DE0 做7段顯示 4

請各位大大幫忙如何使用QuartusII8.1 CycloneIII:EP3C16F484C6 FPGA Verilog_Altera_DE0 做7段顯示 4bit加法器
HEX3+HEX2=HEX1(十位數)HEX0(個位數) 只能用10進位
我只差不會用成10進位
請各位大大幫忙

程式如下:
module HEX2SEG(hex, seg);


   input [3:0] hex;
   output [6:0] seg;
   reg     [6:0] seg;  
   always@( hex )
   begin
                case ( hex)

                        4'b0001 : seg = 7'b111_1001;               
                        4'b0010 : seg = 7'b010_0100;
                        4'b0011 : seg = 7'b011_0000;               
                        4'b0100 : seg = 7'b001_1001;               
                        4'b0101 : seg = 7'b001_0010;              
                        4'b0110 : seg = 7'b000_0010;               

                        4'b0111 : seg = 7'b111_1000;               
                        4'b1000 : seg = 7'b000_0000;               
                        4'b1001 : seg = 7'b001_0000;               
                        4'b1010 : seg = 7'b000_1000;               
                        4'b1011 : seg = 7'b000_0011;               
                        4'b1100 : seg = 7'b100_0110;               
                        4'b1101 : seg = 7'b010_0001;               
                        4'b1110 : seg = 7'b000_0110;               
                        4'b1111 : seg = 7'b000_1110;               
                        default : seg = 7'b100_0000;         

                endcase
   end
endmodule


module SEG7_4 (   DIG, SEG0, SEG1, SEG2, SEG3 );

    input       [15:0]       DIG;
    output    [6:0] SEG0,SEG1,SEG2,SEG3;


    HEX2SEG u0    ( DIG[3:0],   SEG0 );   
    HEX2SEG u1    ( DIG[7:4],   SEG1 );   
    HEX2SEG u2    ( DIG[11:8],  SEG2 );  
    HEX2SEG u3    ( DIG[15:12], SEG3 );   


endmodule


module main( CLOCK_50, RST_n,
             HEX0_D, HEX0_DP, HEX1_D,
             HEX1_DP,HEX2_D, HEX2_DP, HEX3_D, HEX3_DP,
             LED,
             SW,
             BT_n );
        input                        CLOCK_50;                               
        input           RST_n;                               
        input        [2:1]        BT_n;                                       
        input        [9:0]        SW;                                               
        output        [9:0]        LED;                                       
       
        output        [6:0]        HEX0_D;                                       
        output                        HEX0_DP;                               
        output        [6:0]        HEX1_D;                                       
        output                        HEX1_DP;                               
        output        [6:0]        HEX2_D;                                       
        output                        HEX2_DP;                               
        output        [6:0]        HEX3_D;                                       
        output                        HEX3_DP;                               

        wire         CLKM;
        wire    [15:0] DIG;
        wire        [15:0]        SEG7_DIG;

    assign HEX0_DP = 1'b1;
    assign HEX1_DP = 1'b1;
    assign HEX2_DP = 1'b1;  
    assign HEX3_DP = 1'b1;


        assign LED = SW;
       
        assign DIG[15:12] = SW[7:4];
        assign DIG[11:8] = SW[3:0];
        assign DIG[7:0] = { 1'b0, DIG[15:12] } + { 1'b0 , DIG[11:8] };
       
    SEG7_4 u2(DIG, HEX0_D, HEX1_D, HEX2_D, HEX3_D );

endmodule




作者: owts99    時間: 2014-4-2 04:03 PM

雖然是舊文,不過這是我在2010年第一次接手DE1的時候遇到的問題XD經典題

要知道 Verilog語法是在設計電路,且電路的特性即是,它們是通電後就在"運作"了
因此要做計算,我們需要一個地方可以存檔
根據你的程式碼中表示:

模組1 : HEX2SEG( hex, seg )//轉換hex數值 到 seg碼
模組2 : SEG7_4(DIG, SEG0, .... )//利用DIG數值 來直接控制 seg碼 (應該沒理解錯誤)
模組2 : main( CLOCK_50, RST_n, ....)//主程式
在程式中

assign HEX0_DP = 1'b1;
assign HEX1_DP = 1'b1;
assign HEX2_DP = 1'b1;  
assign HEX3_DP = 1'b1;


好像沒作用

assign LED = SW;
        
assign DIG[15:12] = SW[7:4];
assign DIG[11:8] = SW[3:0];




這些應該是你的輸入鈕,透過SW(switch指撥開關) 來控制送入數字
因此你送進去的數值依舊是HEX編碼是否正確 2的3 2 1 0 次方? (8 4 2 1)
我記得.....

assign DIG[7:0] = { 1'b0, DIG[15:12] } + { 1'b0 , DIG[11:8] };

問題卡在這裡這裡依舊送出的是HEX編碼。
進入問題>十進位跟16進位的相關性在哪?
10進位 0~10 進一位
16進位 0~16 進一位

因此以前的做法都比較天兵,用if偵測到"10"立刻跳下一位。因此要做兩組偵測。
以下是計算機概論時間
而樓主要計算的是 XX+XX 那需要考量到的就是,位數的差別 XX+YY=XXX
計算範圍會落在,MAX 99+99 ~ MIN 0+0
要做的方法有幾種,溢位偵測:設定三個數字的暫存器並監控修改數字是否會進位。

1.[笨方法]你可以直接針對計算時偵測。
好處:跟一般程式依樣都在main做,(這個習慣請小心module 經過的時間是否還在下一脈波 [CLOCK_50] 的時間內)
缺點:電路特點平行運作沒辦法學習到

或是

2.把已經寫好了剛剛那個16進制算式,直接寫個電路把他從16進位轉10進位後再送進去SEG7
好處:透過時序控制,透過各級電路運作能在每一個cycle都做到正確的事情
缺點:需要了解 Verilog語法、cycle運作、分析timing





希望能幫到你及其他將來要學習quartus系列的FPGA的夥伴,曾經我被教授潑冷水到整個沒信心拿這個寫論文。
不過這真的很好玩,可以拿來做各級電路參數控制,因為他電路保護做得還不錯(5V以下)。
以及拿來學習時,請小心愛護他,會從中學習到很多知識。





歡迎光臨 伊莉討論區 (http://blog.eyny.com/) Powered by Discuz!