FPGA面試專題 位址生成器設計

2021-10-07 15:33:46 字數 2730 閱讀 7584

設計位址生成器。 [nvidia 2008]

要求依次輸出以下序列:

0,8,2,10,4,12,6,14,1,9,3,11,5,13,7,15,

16,24,18,26,.................................,31,

32,40,34,42,.................................,47,

48,56,50,58,.................................,63,

64,72,66,74,.................................,79

先找出這組資料的變化規律:

因此需要4個計數器:第乙個用來數每2個一組的(0,8),第二個數每8個一組的(0,8,2,10,4,12,6,14,),第三個數每16個一組的(第一行),第四個來數共4行。

`timescale 1ns / 1ps

////

module sen_gen(

input clk,

input rst_n,

output reg [15:0]addr

);reg [7:0]cnt1;

wire end_cnt1;

wire add_cnt1;

reg [7:0]cnt2;

wire end_cnt2;

wire add_cnt2;

reg [7:0]cnt3;

wire end_cnt3;

wire add_cnt3;

reg [7:0]cnt4;

wire end_cnt4;

wire add_cnt4;

always @(posedge clk or negedge rst_n)

begin

if(!rst_n)

begin

cnt1 <= 0;

endelse if (add_cnt1)

begin //在加1 條件下

if(end_cnt1) cnt1 <= 0; //判斷是否為最後乙個值, 如果是 ,計數器清0,

else cnt1 <= cnt1 + 1'b1;//如果不是,計數器加1

endelse cnt1 <= cnt1;

endassign add_cnt1 = 1 ; //一直數數

assign end_cnt1 = add_cnt1 && cnt1 == 2-1; //end_cnt是最後乙個值

always @(posedge clk or negedge rst_n)

begin

if(!rst_n)

begin

cnt2 <= 0;

endelse if (add_cnt2)

begin //在加1 條件下

if(end_cnt2) cnt2 <= 0; //判斷是否為最後乙個值, 如果是 ,計數器清0,

else cnt2 <= cnt2 + 1'b1;//如果不是,計數器加1

endelse cnt2 <= cnt2;

endassign add_cnt2 = end_cnt1 ; //add_cnt 為加1的條件

assign end_cnt2 = add_cnt2 && cnt2 == 4-1; //end_cnt是最後乙個值

always @(posedge clk or negedge rst_n)

begin

if(!rst_n)

begin

cnt3 <= 0;

endelse if (add_cnt3)

begin //在加1 條件下

if(end_cnt3) cnt3 <= 0; //判斷是否為最後乙個值, 如果是 ,計數器清0,

else cnt3 <= cnt3+ 1'b1;//如果不是,計數器加1

endelse cnt3 <= cnt3;

endassign add_cnt3 = end_cnt2 ; //add_cnt 為加1的條件

assign end_cnt3 = add_cnt3 && cnt3 == 2-1; //end_cnt是最後乙個值

always @(posedge clk or negedge rst_n)

begin

if(!rst_n)

begin

cnt4 <= 0;

endelse if (add_cnt4)

begin //在加1 條件下

if(end_cnt4) cnt4 <= 0; //判斷是否為最後乙個值, 如果是 ,計數器清0,

else cnt4 <= cnt4 + 1'b1;//如果不是,計數器加1

endelse cnt4 <= cnt4;

endassign add_cnt4 = end_cnt3 ; //add_cnt 為加1的條件

assign end_cnt4 = add_cnt4 && cnt4 == 5-1; //end_cnt是最後乙個值

always@(posedge clk )

begin

addr <= cnt4*16 + cnt3*1 + cnt2*2 + cnt1*8;//加多少的關係由乘法來決定

end

endmodule

設計模式 生成器模式

前兩個文章我介紹了工廠方法模式和抽象工廠模式,這次我來講一些生成器模式。生成器模式我也用的比較多。5個建立型模式裡面,我比較喜歡用工廠方法模式,生成器模式和單例模式。意圖將乙個複雜物件的構建與它的表示分開,使得同樣的構建過程可以建立不同的表示。結構圖 一眼看去是不是和抽象工廠模式有點像?是啊,我也覺...

設計模式 生成器(Builder)

目的 在軟體開發的過程中不可避免地會碰到一些複雜的物件。如果直接去建立這些複雜的物件,會使 變得難於理解和維護,而且對於大多數使用者而言他們並不關心物件各個成員的建立過程。builder的作用就是將物件各個成員的建立和組裝過程分離,根據使用者的需求一步一步建立複雜的物件。使用者只需要指定型別就可以得...

id生成器演算法設計

摘要 原理說明 1.每個資料庫儲存初始值 2.業務獲取值後修改資料庫的初始值 現初始值 源初始值 資料庫個數 步長 原子操作 3.業務拿到初始值後,獲取的資料集合是 開始值 開始值 步長 設定步長 in 原理說明 1.每個資料庫儲存初始值 2.業務獲取值後修改資料庫的初始值 現初始值 源初始值 資料...