伊莉討論區

標題: 用xilinx ISE寫簡易計算機的問題 [打印本頁]

作者: 12812abc    時間: 2016-6-17 11:27 PM     標題: 用xilinx ISE寫簡易計算機的問題

想寫一個簡易型只有加減功能的計算機在板子上不過問題一堆阿,現在正在解決七段顯示錯誤的問題,想請問各路高手們可不可以指教一下
程式碼:

module  keyboard(clk,rst,kb_in,kb_out,seg,t,sscom,in,w,a,r,r1,r2,r3,r4);
input clk,rst,in;
input[3:0]kb_in;        //橫向Row(列)  (如1,2,3為一列,共4列)
output reg[2:0]kb_out;
output reg[31:0] w,a,r,r1,r2,r3,r4; //縱向column(行)  (如1,4,7,*為一行,共3行)

output reg[7:0]seg;
output reg[3:0] sscom;
reg[1:0]state=2'b00;
output [6:0] t;

assign t[6:0]={kb_in,kb_out};
reg divclk;
reg [23:0]count;

always @(posedge clk)
begin
   if(count==24'h00ffff)       //除頻
           begin
           count<=0;
                divclk<=~divclk;
                end
        else
           count<=count+1;
end





always@(posedge divclk)
begin
   case(state)                  //state0,1,2會在按下數字鍵時觸發,數字鍵未按下時12個鍵盤皆為高電位'1',當按下數字鍵時, 該數字鍵為接地'0'
        0:                          //state0,1,2因判斷皆相同,會不停執行
           if(kb_in==4'b1111)       //當按下數字鍵(例如'9')時,kb_in=1101,kb_out=011,此時case0,1,2皆不滿足條件,利用在'if'的條件下,
                begin                   //系統會將{kb_in,kb_out}1101011存起來.
                state<=1;
                kb_out=3'b110;
                end
        1:
           if(kb_in==4'b1111)
                begin
                state<=2;
                kb_out=3'b101;       
                end
        2:
           if(kb_in==4'b1111)
                begin
                state<=0;
                kb_out=3'b011;
                end
   default:;
        endcase
end

always@(posedge clk)       //當clk正緣觸發時,會將存起來的{kb_in,kb_out}依照數值顯示至七段顯示器
begin
    case({kb_in,kb_out})
     //左邊為{kb_in,kb_out}目前數值,右邊則是輸出七段顯示之數字
    7'b0111110:a=a*10+1;//1
         7'b0111101:a=a*10+2;//2
         7'b0111011:a=a*10+3;//3
         7'b1011110:a=a*10+4;//4
         7'b1011101:a=a*10+5;//5
         7'b1011011:a=a*10+6;//6
         7'b1101110:a=a*10+7;//7
         7'b1101101:a=a*10+8;//8
         7'b1101011:a=a*10+9;//9
         7'b1110110:begin //+
                r=r+a;
                a=a*0;
         end
         7'b1110101:a=a*10;//0
         7'b1110011:begin//-
         r=r-a;
         a=a*0;
         end
         
         endcase

div_rill d1(r,1000,r1,w);
div_rill d2(r,100,w,r2);
div_rill d3(w,10,w,r2);
div_rill d4(r,10,w,r3);
div_rill d5(w,10,w,r3);
div_rill d6(r,10,w,r4);

         
         case(in)
         0:r=0;
         endcase
         sscom=sscom+1;
         
if(sscom==4'b0111)
  begin
         case(r1)
    1:seg=8'b1111001;//1
         2:seg=8'b0100100;//2
         3:seg=8'b0110000;//3
         4:seg=8'b0011001;//4
         5:seg=8'b0010010;//5
         6:seg=8'b0000010;//6
         7:seg=8'b1111000;//7
         8:seg=8'b0000000;//8
         9:seg=8'b0010000;//9
         0:seg=8'b1000000;//0
         endcase
  end
         
if(sscom==4'b1011)
  begin
         case(r2)
    1:seg=8'b1111001;//1
         2:seg=8'b0100100;//2
         3:seg=8'b0110000;//3
         4:seg=8'b0011001;//4
         5:seg=8'b0010010;//5
         6:seg=8'b0000010;//6
         7:seg=8'b1111000;//7
         8:seg=8'b0000000;//8
         9:seg=8'b0010000;//9
         0:seg=8'b1000000;//0
         endcase
        end
       
if(sscom==4'b1101)
  begin
         case(r3)
    1:seg=8'b1111001;//1
         2:seg=8'b0100100;//2
         3:seg=8'b0110000;//3
         4:seg=8'b0011001;//4
         5:seg=8'b0010010;//5
         6:seg=8'b0000010;//6
         7:seg=8'b1111000;//7
         8:seg=8'b0000000;//8
         9:seg=8'b0010000;//9
         0:seg=8'b1000000;//0
         endcase
        end
         
if(sscom==4'b1110)
  begin
         case(r4)
    1:seg=8'b1111001;//1
         2:seg=8'b0100100;//2
         3:seg=8'b0110000;//3
         4:seg=8'b0011001;//4
         5:seg=8'b0010010;//5
         6:seg=8'b0000010;//6
         7:seg=8'b1111000;//7
         8:seg=8'b0000000;//8
         9:seg=8'b0010000;//9
         0:seg=8'b1000000;//0
         endcase
        end
end
endmodule


module div_rill(input[31:0] a,input[31:0] b,output reg [31:0] yshang,output reg [31:0] yyushu);  

reg[31:0] tempa;  
reg[31:0] tempb;  
reg[63:0] temp_a;  
reg[63:0] temp_b;  

integer i;  

always @(a or b)  
begin  
    tempa <= a;  
    tempb <= b;  
end  

always @(tempa or tempb)  
begin  
    temp_a = {32'h00000000,tempa};  
    temp_b = {tempb,32'h00000000};   
    for(i = 0;i < 32;i = i + 1)  
        begin  
            temp_a = {temp_a[62:0],1'b0};  
            if(temp_a[63:32] >= tempb)  
                temp_a = temp_a - temp_b + 1'b1;  
            else  
                temp_a = temp_a;  
        end  

    yshang <= temp_a[31:0];  
    yyushu <= temp_a[63:32];  
end  

endmodule  

實驗結果:
板子上的七段全部都只顯示 r4 的資料,想請問可否指點一下,感謝!





作者: AGATELINK    時間: 2016-6-20 10:03 AM

always @(posedge clk)

內部訊號全都沒有reset
作者: tonyasic    時間: 2016-6-27 11:34 PM

提示: 作者被禁止或刪除 內容自動屏蔽




歡迎光臨 伊莉討論區 (http://a401.file-static.com/) Powered by Discuz!