给你一个很久很久以前,写的一个读 DNA_ID 的模块
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 11:41:00 11/02/2010
// Design Name:
// Module Name: dna
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
`define S0 2'b00
`define S1 2'b01
`define S2 2'b10
`define S3 2'b11
module dna(
input clk,
input reset,
output [56:0] dout
);
//wire [56:0] dout;
wire dout_c;
reg read, shift, din;
reg [6:0] count;
reg [1:0] next_state, current_state;
reg [56:0] dna_id;
localparam S_IDLE = `S0, S_READ = `S1, S_SHIFT = `S2, S_WRITE = `S3;
assign dout = (current_state == S_WRITE) ? dna_id : dout;
// 同步时序,描述次状态寄存器转移到现态寄存器
always @(posedge clk or posedge reset) begin
if(reset)
current_state <= S_IDLE;
else
current_state <= next_state;
end
// 产生下一个状态的组合逻辑(只与输入和当前状态有关)
always @(current_state or count) begin
next_state = 2'bxx; // 要初始化,使得系统复位后能进入正确的状态
case (current_state)
S_IDLE: begin
next_state = S_READ;
end
S_READ: begin
next_state = S_SHIFT;
end
S_SHIFT: begin
if(count == 57)
next_state = S_WRITE;
else
next_state = S_SHIFT;
end
S_WRITE: begin
next_state = S_IDLE;
end
default:
next_state = S_IDLE;
endcase
end
// 同步时序,描述次态寄存器输出
always @(posedge clk or posedge reset) begin
if(reset) begin
read <= 0;
shift <= 0;
din <= 0;
count <= 0;
end
else begin
case(next_state)
S_IDLE: begin
read <= 0;
shift <= 0;
din <= 0;
count <= 0;
end
S_READ: begin
read <= 1;
shift <= 0;
din <= 0;
count <= 0;
end
S_SHIFT: begin
read <= 0;
shift <= 1;
count <= count + 1;
end
S_WRITE: begin
read <= 0;
shift <= 0;
end
default: begin
read <= 0;
shift <= 0;
count <= 0;
end
endcase
end
end
// 同步时序,描述次态寄存器输出
always @(posedge clk or posedge reset) begin
if(reset) begin
dna_id <= 0;
end
else begin
case(current_state)
S_SHIFT: begin
dna_id <= dna_id << 1;
dna_id[0] <= dout_c;
end
S_WRITE: begin
dna_id <= dna_id;
end
default: begin
dna_id <= 0;
end
endcase
end
end
DNA_PORT #(
.SIM_DNA_VALUE(57'h1aaaaaaaaaaaaaa)
)dna_port_inst(
.CLK(clk),
.DIN(din),
.DOUT(dout_c),
.READ(read),
.SHIFT(shift)
);
endmodule
|