設計位址生成器。 [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.業務獲取值後修改資料庫的初始值 現初始值 源初始值 資料...