Thông báo

Collapse
No announcement yet.

Tiép tục mong chờ sự giúp đỡ của các sư huynh về đoạn code sau!!

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Tiép tục mong chờ sự giúp đỡ của các sư huynh về đoạn code sau!!

    Hôm trước dc anh NEO giúp đỡ đoạn code lưu 1 số kia viết khá thành công , em tiếp tục phát triển viết lưu 2 số . Đoạn code hôm trước anh NEO chỉ em là thực hiện : tăng giá trị 1 biến khi bấm KEY[3] , bấm KEY[0] thì tăng giá trị 1 biến khác nếu như giá trị đó nhỏ hơn giá trị tại KEY[3] . Khi giá trị KEY[0] bắt đầu lớn hơn giá trị KEY[3] thì việc bấm KEY[0] sẽ gọi giá trị đã lưu trước đó bởi KEY[1]. Đoạn code này em đã thực hiện dc. ( file : ram0206)
    Bây giờ em muốn mở rộng thêm như sau : thay vì bấm KEY[3] để tăng biến Y4Y5 như trên thì em sẽ dùng SW[0] để tăng Y4Y5 . Dùng KEY[0] để điều khiển tăng giá trị Y0Y1 , KEY[2] để tăng giá trị Y2Y3 , nhưng là tăng giá trị lớn nhất trong 2 số đó và chỉ tăng khi giá trị max này bé hơn giá trị của Y4Y5 . Em ví dụ : Khi SW[0] tăng đến 5 , bấm KEY[0] sẽ hiển thị ra 1 , bấm KEY[2] hiển thị ra 2, bấm tiếp KEY[0] thì hiển thị ra 3.....
    KEY[1] dùng để lưu giá trị hiển thị điều khiển bởi KEY[0]
    KEY[3] dùng để lưu giá trị hiển thị điều khiển bởi KEY[2]
    Khi giá trị max của Y0Y1 và Y2Y3 bắt đầu lớn hơn Y4Y5 thì việc bấm các KEY[0] và KEY[2] sẽ ko tăng Y0Y1 và Y2Y3 nữa mà thay vào đó sẽ hiển thị ra kết quả đã lưu trước đó . File : testram0306 . Đoạn này em chưa làm dc , mong anh em tìm hộ em điểm sai với ạ . Em cảm ơn anh em nhiều.

    Code:
    module testram0306(KEY,HEX7,HEX6,HEX5,HEX4,HEX3,HEX2,SW,CLOCK_50);
    input CLOCK_50;
    input [0:0]SW;
    input [3:0]KEY;
    output [6:0]HEX4,HEX5,HEX6,HEX7,HEX3,HEX2;
    reg [7:0]mem1[100:0];
    reg [7:0]mem2[100:0];
    integer add_write1,add_read1,add_write2,add_read2;
    reg [3:0]Y0,Y1,Y2,Y3,Y4,Y5,Y0a,Y1a,Y2a,Y3a,Yread1,Yread2,Yread3,Yread4;
    reg [7:0]Y6,Y7,Y8,Ymax,Yreg1,Yreg2;
    reg [7:0]Y10;	
    always @(negedge SW[0])
    	begin
    		Y4=Y4+1;
    			if(Y4>9)
    				begin
    					Y4=0;
    					Y5=Y5+1;
    				end
    	end
    always 
    	begin
    		Y6=Y5*10+Y4;
    		Y7=Y1*10+Y0;
    		Y8=Y3*10+Y2;
    	end
    always 
    	begin
    		if(Y7>Y8)
    			Ymax=Y7;
    		else
    			Ymax=Y8;
    	end
    always @(Y0,Y1,Y6,Ymax,Yread1,Yread2)
    	begin
    		if(KEY[0]==1'b0)
    			begin
    				if(Y6>Ymax)
    					begin
    						Y0a=Y0;
    						Y1a=Y1;
    					end
    				else
    					begin
    						Y0a=Yread1;
    						Y1a=Yread2;
    					end
    			end
    	end
    always @(negedge KEY[0])
    	begin
    		if(Y6>Ymax)
    			begin
    				if(Y7>Y8)
    					begin
    						Y1=Y1;
    						Y0=Y0+1;
    							if(Y0>9)
    								begin
    									Y0=0;
    									Y1=Y1+1;
    								end
    					end
    				if(Y8>Y7)
    					begin
    						Y1=Y3;
    						Y0=Y2+1;
    							if(Y0>9)
    								begin
    									Y0=0;
    									Y1=Y1+1;
    								end
    					end
    			end
    		else
    			begin
    				Y0=Y0;
    				Y1=Y1;
    				if(add_write1>add_read1)
    						begin
    							Yreg1=mem1[add_read1];
    							add_read1=add_read1+1;
    							Yread1=Yreg1[7:4];
    							Yread2=Yreg1[3:0];
    						end
    					else
    						begin
    							add_read1=add_read1;
    						end
    		
    			end
    	end
    always @(negedge KEY[1])
    	begin
    		mem1[add_write1]={Y0a,Y1a};
    		add_write1=add_write1+1;
    	end
    always @(Y2,Y3,Y6,Ymax,Yread3,Yread4)
    	begin
    		if(KEY[1]==1'b0)
    			begin
    				if(Y6>Ymax)
    					begin
    						Y2a=Y2;
    						Y3a=Y3;
    					end
    				else
    					begin
    						Y2a=Yread2;
    						Y3a=Yread3;
    					end
    			end
    	end
    always @(negedge KEY[2])
    	begin
    		if(Y6>Ymax)
    			begin
    				if(Y7>Y8)
    					begin
    						Y3=Y1;
    						Y2=Y0+1;
    							if(Y2>9)
    								begin
    									Y2=0;
    									Y3=Y3+1;
    								end
    					end
    				if(Y8>Y7)
    					begin
    						Y3=Y3;
    						Y3=Y2+1;
    							if(Y3>9)
    								begin
    									Y3=0;
    									Y3=Y3+1;
    								end
    					end
    			end
    		else
    			begin
    				Y2=Y2;
    				Y3=Y3;
    				if(add_write2>add_read2)
    							begin
    								Yreg2=mem2[add_read2];
    								add_read2=add_read2+1;
    								Yread3=Yreg2[7:4];
    								Yread4=Yreg2[3:0];
    							end
    						else
    							begin
    								add_read2=add_read2;
    							end
    			end
    	end
    always @(negedge KEY[3])
    	begin
    		mem2[add_write2]={Y2a,Y3a};
    		add_write2=add_write2+1;
    
    	end	
    
    hienthi(Y5,HEX7);
    hienthi(Y4,HEX6);
    hienthi(Y1a,HEX5);
    hienthi(Y0a,HEX4);
    hienthi(Y3a,HEX3);
    hienthi(Y2a,HEX2);
    endmodule
    module hienthi(c,display);
    input [3:0]c;
    output reg [0:6]display;
    always @(c)
    	case(c)	
    		4'd0:display=7'b1000000;
    		4'd1:display=7'b1111001;
    		4'd2:display=7'b0100100;
    		4'd3:display=7'b0110000;
    		4'd4:display=7'b0011001;
    		4'd5:display=7'b0010010;
    		4'd6:display=7'b0000010;
    		4'd7:display=7'b1111000;
    		4'd8:display=7'b0000000;
    		4'd9:display=7'b0010000;
    		default:display=7'b1111111;
    	endcase
    endmodule

    Còn đây là đoạn lưu 1 giá trị đã chạy dc :
    Code:
    module ram0206(KEY,HEX7,HEX6,HEX5,HEX4,SW);
    input [0:0]SW;
    input [3:0]KEY;
    output [6:0]HEX4,HEX5,HEX6,HEX7;
    reg [7:0]mem[100:1];
    integer add_write,add_read;
    reg [3:0]Y0,Y1,Y2,Y3,Y4,Y5,Y8,Y9;
    reg [7:0]Y6,Y7;
    reg [7:0]Y10;	
    always @(negedge KEY[3])
    	begin
    		Y4=Y4+1;
    			if(Y4>9)
    				begin
    					Y4=0;
    					Y5=Y5+1;
    				end
    	end
    always @(Y0,Y1,Y2,Y3,Y6,Y7)
    	begin
    		if(KEY[0]==1'b0)
    		begin
    		if(Y6>Y7)	
    			begin
    				Y8=Y0;
    				Y9=Y1;
    			end
    		else
    			begin
    				Y8=Y2;
    				Y9=Y3;
    			end
    	end
    	end
    always @(negedge KEY[0])
    	begin
    		Y6=Y5*10+Y4;
    		Y7=Y1*10+Y0;
    		if(Y6>Y7)
    			begin
    				Y0=Y0+1;
    					if(Y0>9)
    						begin
    							Y0=0;
    							Y1=Y1+1;
    						end
    			end
    		else
    			begin
    				Y0=Y0;
    				Y1=Y1;
    				if(add_write>add_read)
    					begin
    						Y10=mem[add_read];
    						add_read=add_read+1;
    						Y3=Y10[7:4];
    						Y2=Y10[3:0];
    					end
    				else
    					begin
    						add_read=add_read;
    					end
    			end
    	end
    
    always @(negedge KEY[1])
    	begin
    		mem[add_write]={Y9,Y8};
    		add_write=add_write+1;
    		
    	end
    
    hienthi(Y5,HEX7);
    hienthi(Y4,HEX6);
    hienthi(Y9,HEX5);
    hienthi(Y8,HEX4);
    endmodule
    module hienthi(c,display);
    input [3:0]c;
    output reg [0:6]display;
    always @(c)
    	case(c)	
    		4'd0:display=7'b1000000;
    		4'd1:display=7'b1111001;
    		4'd2:display=7'b0100100;
    		4'd3:display=7'b0110000;
    		4'd4:display=7'b0011001;
    		4'd5:display=7'b0010010;
    		4'd6:display=7'b0000010;
    		4'd7:display=7'b1111000;
    		4'd8:display=7'b0000000;
    		4'd9:display=7'b0010000;
    		default:display=7'b1111111;
    	endcase
    endmodule
    Mong anh em chiếu cố giúp cho!!Cảm ơn anh em nhiều lắm

  • #2
    Bài tập này bạn đã làm qua phần requirements / constraints, và design?

    Phần code này rất rối và rườm rà; và có đến nửa tá signals (đã được debounce?) khác nhau được dùng làm clock / latch gate


    Xem ra SW[0] là nơi lấy số, và KEY[0] và KEY[2] là hai nơi gọi số?


    Y5Y4 là nguồn số được phát, cứ tạm thời gọi là ổn (về phương diện chỉ có một nguồn duy nhất). Nhưng vấn đề đã bị phức tạp hóa với Y3Y2 và Y1Y0. Cứ thử tưởng tượng rằng sau khi lấy số người ta sẽ xếp thành một hàng theo thứ tự của số đã lấy được, và khi Key[0] hoặc Key[2] được nhấn, một người sẽ bước ra khỏi hàng để đến Key[0] hoặc Key[2]. Số vé của người đó sẽ được hiển thị ra H2/H3 hoặc H4/H5 tùy theo Key[0] hoặc Key[2]. Chỉ có một loạt số để gọi lên, có cần thiết phải đếm với cả Y3Y2 và Y1Y0 và so sánh qua lại rắc rối, tạo thêm lỗi logic.


    Các phần khác phụ thuộc nhiều vào requirements / design constraints của bài tập này. Key[0] và Key[2] là hai nơi gọi số khác nhau ... nếu Key[0] và Key[2] được bấm cùng một lúc thì sao? Khi số được phát Y5Y4 lên đến 99, số kế tiếp sẽ là? Nếu Y5Y4 xoay vòng 99 -> 0, và nếu 0 của vòng trước vẫn còn đang được lưu lại, vậy chúng ta sẽ có hai vé số 0? Nếu 0 là số mới nhất được phát ra, phần so sánh Y6 > Ymax có còn hoạt động đúng?


    Constraint của bài tập này là chỉ cần cẩn thận nhấn nhấn switch/keys vài lần để demo? hoặc phải là một hệ thống điều khiển hàng đợi được thiết kế hoàn chỉnh hơn một chút?


    Sorry, nói hơi nhiều nhưng không giúp được gì cụ thể cho code của bạn.
    Last edited by nemesis21; 09-06-2009, 08:26.

    Comment

    Về tác giả

    Collapse

    achilles86 Tìm hiểu thêm về achilles86

    Bài viết mới nhất

    Collapse

    Đang tải...
    X