321.3.2.Giải thuật tính căn tính toán từng chữ số Digit-by-digit calculation .... Đề 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
Phần chung cho tất cả các nhóm
Bài 1
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 𝑛 = 16
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
(ví dụ: ModelSim) 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 V
Hình 1.1.2 Lưu đồ giải thuật Đầ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
Code thực hiện: module min_finder(rst,clk,in0,in1,in2,in3,in4,in5,in6,in7,in8,in9,in10
,in11,in12,in13,in14,in15,min1,min2,index_min1,nflag); localparam n = 16; input rst,clk; input[3:0] in0, in1, in2, in3, in4, in5, in6, in7, in8, in9, in10, in11, in12, in13, in14, in15; 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, reg_in10, reg_in11, reg_in12, reg_in13, reg_in14, reg_in15, 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}; reg_in10 = {4'b1010,in10}; reg_in11 = {4'b1011,in11}; reg_in12 = {4'b1100,in12}; reg_in13 = {4'b1101,in13}; reg_in14 = {4'b1110,in14}; reg_in15 = {4'b1111,in15}; 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 = reg_in10; reg_in10 = reg_in11; reg_in11 = reg_in12; reg_in12 = reg_in13; reg_in13 = reg_in14; reg_in14 = reg_in15; reg_in15 = temp; end end always @(posedge clk) begin if(rst) begin count = 4'b1111; 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]; end endmodule 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