Sơ đồ giải thuật thứ nhất bộ min_finder Đầu tiên, ta ghép 2 phần gồm giá trị của port và số thứ tự của port đó vào để thực hiện so sánh, gọi là IN[i].. Hình 1.10 kết quả mô phỏng của dạn
Bài 1
Đề bài
Cho sơ đồ khối của hệ thống tìm số nhỏ nhất thứ nhất (min1), số nhỏ nhất thứ 2 (min2) và vị trí của số nhỏ nhất thứ nhất (index_min1) trong số không dấu ngõ vào như hình bên dưới.
Thực thi hệ thống trên với = 10
Các ngõ vào I0, I1,…, In-1 là các số nhị phân 4 bit không dấu.
Trường hợp ngõ vào có nhiều hơn 2 giá trị min1, thì ngõ ra index_min1 chỉ vị trí ngõ vào có chỉ số nhỏ hơn.
1 Đề xuất 2 giải thuật thực thi hệ thống trên (sơ đồ khối, giải thích chi tiết).
2 Viết code Verilog mô tả 2 giải thuật đã đề xuất ở trên Sử dụng phần mềm mô phỏng kiểm tra chức năng hệ thống (chụp lại hình kết quả mô phỏng).
3 Đánh giá tài nguyên phần cứng khi thực thi 2 giải thuật đề xuất trên FPGA Cyclone II EP2C35F672C6.
Giải thuật thứ nhất
Hình 1.2 Sơ đồ giải thuật thứ nhất bộ min_finder Đầu tiên, ta ghép 2 phần gồm giá trị của port và số thứ tự của port đó vào để thực hiện so sánh, gọi là IN[i] Khi so sánh, nếu phần giá trị của 2 port bằng nhau, ta sẽ so sánh số thứ tự của port đó.
Tiếp theo, ta lưu min_1 và index_min1 tương ứng với giá trị của port 0 và số thứ tự của nó:
0 và min_2 là giá trị của port 1.
Ta lần lượt so sánh cặp min_1, index_min1 và giá trị min_2 với giá trị tương ứng (có hoặc không có số thứ tự) của các port từ 1 đến 9 Khi đó sẽ có 2 trường hợp xảy ra:
Thứ nhất, cặp min_1, index_min1 lớn hơn IN[i] Khi đó, ta thay min_1, index_min1 bởi các giá trị tương ứng của port thứ i và thay min_2 bởi min_1.
Thứ hai, cặp min_1, index_min1 bé hơn IN[i] Ta sẽ tiếp tục so sánh giá trị của port thứ i với min_2 Nếu min_2 lớn hơn giá trị của port thứ i thì ta cập nhật giá trị đó cho min_2 và ngược lại thì ta giữ nguyên min_2. Đại học Bách khoa TPHCM Trang 5
Code thực hiện: module min_finder(rst,clk,in0,in1,in2,in3,in4,in5,in6,in7,in8,in9,min1,min2,index_ min1,nflag); localparam n = 10; input rst,clk; input[3:0] in0,in1,in2,in3,in4,in5,in6,in7,in8,in9; output reg[3:0] min1,min2; output reg[3:0] index_min1; output reg nflag; reg[7:0] reg_in0,reg_in1,reg_in2,reg_in3,reg_in4,reg_in5,reg_in6,reg_in7,reg_in8,reg _in9,temp; reg[7:0] reg_min1; reg[3:0] reg_min2; wire cp1,cp2,flag_0; reg[3:0] count; mf_compare CP1 (reg_min1,reg_in1,cp1); cp CP2 (reg_min2,reg_in1[3:0],,cp2); assign flag_0 = |(count); always @(posedge clk) begin if(rst||(~flag_0)) begin reg_in0 = {4'b0000,in0}; reg_in1 = {4'b0001,in1}; reg_in2 = {4'b0010,in2}; reg_in3 = {4'b0011,in3}; reg_in4 = {4'b0100,in4}; reg_in5 = {4'b0101,in5}; reg_in6 = {4'b0110,in6}; reg_in7 = {4'b0111,in7}; reg_in8 = {4'b1000,in8}; reg_in9 = {4'b1001,in9}; end else begin temp = reg_in0; reg_in0 = reg_in1; reg_in1 = reg_in2; reg_in2 = reg_in3; reg_in3 = reg_in4; reg_in4 = reg_in5; reg_in5 = reg_in6; reg_in6 = reg_in7; reg_in7 = reg_in8; reg_in8 = reg_in9; reg_in9 = temp; end end always @(posedge clk) begin if(rst) begin count = 4'b1001; nflag = 1'b1; end else if(flag_0) count = count - 1; else begin
{index_min1,min1} = reg_min1; min2 = reg_min2; nflag = 1'b0; end end always @(negedge clk) begin if (rst) begin reg_min1 = {4'b0000,in0}; reg_min2 = in1; end else if(cp1&flag_0) begin reg_min2 = reg_min1[3:0]; reg_min1 = reg_in1; end else if(cp2&flag_0) reg_min2 = reg_in1[3:0]; endmodule end module mf_compare(in0,in1,out); input[7:0] in0,in1; output reg out; wire[1:0] eq, grt; cp COMP0 (in0[3:0],in1[3:0],eq[0],grt[0]); cp COMP1 (in0[7:4],in1[7:4],eq[1],grt[1]); always @* begin if(eq[0]) out