硬 件 描 述 语 言
实 验 报 告
班级 xxxxxxxx
学号 xxxxxxxx
姓名 xxxxxxxx
目 录
硬 件 描 述 语 言 0
实 验 报 告 0
实验 简单组合逻辑设计 2
实验二 简单分频时序逻辑电路设计 4
实验三 利条件语句实现计数分频时序电路 7
实验四 阻塞赋值非阻塞赋值区 12
实验五 always块实现较复杂组合逻辑电路 16
实验六 Verilog中函数 21
实验七 Verilog HDL中务(task) 25
实验八 利限状态机进行时序逻辑设计 32
实验九 利状态机实现较复杂接口设计 36
实验十 利SRAM设计FIFO 46
实验 简单组合逻辑设计
实验目
1掌握基组合逻辑电路实现方法
2初步解两种基组合逻辑电路生成方法
3学测试模块编写
4通综合布局布线解层次仿真物理意义
二 实验容
次实验采Verilog HDL语言设计综合数较器功较数a数b结果果两数相输出结果1否出结果0写出测试模型进行较全面测试
三 实验步骤
1建立工程文件编写模块源码测试模块求测试模块源文件进行较全面测试
2编译源码测试模块测试模块源文件进行测试进行仿真
3观察综合生成文件源文件点相点
4综合时采FPGA器件观察综合结果什
四 实验代码
1模块源码
module compare(equal a b)
input ab
output equal
assign equal (a b)10
endmodule
2测试代码
`timescale 1ns1ns
module compare_t
reg a b
wire equal
initial
begin
a0
b0
#100 a0 b1
#100 a1 b1
#100 a1 b0
#100 a0 b0
#100 stop
end
compare m(equal(equal)a(a)b(b))
endmodule
五 综合仿真
RTL图仿真波形图:
六 思考题
1课练测试方法二中第二initial块什?第initial块什关系?
测试方法二中第二initial暂停仿真便观察仿真波形第initial行关系
2果第二initial块中没写出#10000者stop仿真会进行?
果没写#10000仿真会直接停止没stop仿真会结束
3较两种测试方法种更全面?
第二种测试方法更全面测试更种变换情况
实验二 简单分频时序逻辑电路设计
实验目
1掌握条件语句简单时序模块设计中
2掌握verilog语句简单时序模块设计中
3学Verilog模块中应计数器
4学测试模块编写综合层次仿真
二 实验容
1always块@(posedge clk)@(negedge clk)结构表述时序逻辑设计12分频综合模型波形图:
2模块进行RTL级仿真综合门级仿真布局布线仿真
三 实验步骤
1建立工程文件编写模块源码测试模块求测试模块源文件进行较全面测试
2编译源码测试模块测试模块源文件进行测试综合仿真波形图
3观察综合生成文件源文件点相点
4记录数完成实验报告
四 实验代码
1 模块代码
module half_clk(resetclk_inclk_out)
input clk_inreset
output clk_out
reg clk_out
always @(posedge clk_in)
begin
if(reset)
clk_out0
else
clk_out~clk_out
end
endmodule
2测试代码
`timescale 1ns100ps
`define clk_cycle 50
module top
reg clkreset
wire clk_out
always #`clk_cycle clk~clk
initial
begin
clk0
reset1
#10 reset0
#110 reset1
#100000 stop
end
half_clk m0(reset(reset)clk_in(clk)clk_out(clk_out))
endmodule
五 综合仿真
RTL图仿真波形图
六 思考题
1果没reset信号否控制2分频clk_out信号相位?
果没reset信号法控制2分频clk_out信号相位
2 clk时钟触发(2分频产生时钟)直接产生4分频
8分频者16分频时钟?
助整型变量j做计数操作
3clk时钟触发直接产生占空分频时钟?
助整型变量j做计数操作clk时钟触发直接产生4分频8分频者16分频时钟产生占空分频时钟
实验三 利条件语句实现计数分频时序电路
实验目
1掌握条件语句简单时序模块设计中
2掌握基时序电路实现方法
3学Verilog模块中应计数器
4学测试模块编写综合层次仿真
二 实验容
1复课熟悉条件语句方式
2建立工程编写源代码
3综合布局布线仿真分析always语句时序逻辑中作
4学测试模块编写综合仿真
三 实验步骤
1建立工程文件编写模块源码测试模块求测试模块源文件进行较全面测试
2编译源码测试模块测试模块源文件进行测试综合仿真
3观察综合生成文件源文件点相点
4综合时采FPGA器件Altera公司Cyclone II系列Stratix III系列观察综合结果什
四 实验代码
1模块代码
module fdivision(RESETF10MF500K)
input F10MRESET
output F500K
reg F500K
reg [70]j
always @(posedge F10M)
if(RESET) 低电复位
begin
F500K < 0
j < 0
end
else
begin
if(j19) 计数器进行判断确定F500K信号否反转
begin
j < 0
F500K < ~F500K
end
else
j < j+1
end
endmodule
2测试代码
`timescale 1ns100ps
`define clk_cycle 50
module division_top
reg F10MRESET
wire F500K_clk
always #`clk_cycle F10M~F10M
initial
begin
RESET1
F10M0
#100 RESET0
#100 RESET1
#10000 stop
end
fdivision fdivision(RESET(RESET)F10M(F10M)F500K(F500K_clk))
endmodule
五 综合仿真
RTL图仿真波形图:
六 思考题
1考虑实现意数值分频
意分频代码:
module divn(clkrst_no_clk)
input clkrst_n
output o_clk
parameter WIDTH 3
parameter N 5
reg [WIDTH10] cnt_pcnt_n count_posecount_nege
reg clk_pclk_n
assign o_clk (N1) clk (N[0])(clk_p&clk_n) clk_p
果N1o_clkclk 果N偶数o_clkclk_p 果N奇数o_clkclk_p & clk_n
相运算clk_pclk_n两者高电低电clk两者相 差半clk相结果o_clk占空50
always @ (posedge clk or negedge rst_n)
begin
if(rst_n)
cnt_p<0
else if (cnt_p(N1))
cnt_p<0
else
cnt_p
always @ (posedge clk or negedge rst_n)
begin
if(rst_n)
clk_p<0
else if (cnt_p<(N>>1))
clk_p<0
else
clk_p<1
end
always @ (negedge clk or negedge rst_n)
begin
if(rst_n)
cnt_n<0
else if (cnt_n(N1))
cnt_n<0
else
cnt_n
always @ (negedge clk or negedge rst_n)
begin
if(rst_n)
clk_n<0
else if (cnt_n<(N>>1))
clk_n<0
else
clk_n<1
end
endmodule
3 果综合时采FPGA器件Altera公司Cyclone II系列Stratix III系列想想综合结果什?
时钟分频实现方法果采行波时钟方式(异步设计)容易造成时钟偏差难控制芯片部逻辑基单元中触发器建立保持时间时芯片部参数代码时序分析结果分析正常
果分频时钟作级设计工作时钟整设计时钟时钟实现话(异步设计)存信号跨时钟域转换问题跨时钟域信号果设计会采亚稳态
3课试着利10MB时钟设计单周期形状周期波形
模块代码:
module zhouqiwave(resetF10Ma)
input resetF10M
output a
reg a
reg [150]b
always@(reset or posedge F10M)
if(reset)
begin
a<0
b<0
end
else
begin
if(b199)
begin
a<~a
bend
else
begin
if(b299)
begin
a<~a
bend
if(b499)
begin
a<0
bend
else
bend
end
endmodule
测试代码:
`timescale 10ns10ns
module zhouqiwave_tb
reg F10Mreset
wire a
always #5 F10M~F10M
initial
begin
reset0
F10M0
#5 reset1
#6000 stop
end
zhouqiwave m(reset(reset)F10M(F10M)a(a))
endmodule
实验四 阻塞赋值非阻塞赋值区
实验目
1通实验掌握阻塞赋值非阻塞赋值概念区
2深入理解序执行发执行概念
3解非阻塞阻塞赋值场合
4学测试模块编写综合层次仿真
二 实验容
1次实验参课练三采Verilog HDL语言描述两模块分包含阻塞非阻塞赋值语句
2编写测试模块相输入信号条件较阻塞非阻塞语句输出结果
3模块进行RTL级仿真综合门级仿真布局布线仿真
4分析阻塞赋值非阻塞赋值区
三 实验步骤
1仔细阅读课建立工程文件编写模块源码测试模块求测试模块源文件进行较全面测试
2编译源码测试模块测试模块源文件进行测试综合仿真
3观察综合生成两电路结构图观察仿真波形图分析阻塞非阻塞赋值异
4综合时采FPGA器件Altera公司Cyclone II系列Stratix III系列观察综合结果什
四 实验代码
模块代码:
a) 采阻塞赋值
module blocking(clkabc)
output [30] bc
input [30] a
input clk
reg [30] bc
always @(posedge clk)
begin
b a
c b
display(Blocking a d b d c dabc)
end
endmodule
b) 采非阻塞赋值
module non_blocking(clkabc)
output [30] bc
input [30] a
input clk
reg [30] bc
always @(posedge clk)
begin
b < a
c < b
display(Non_Blocking a d b d c dabc)
end
endmodule
测试代码:
`timescale 1ns100ps
`includeblockingv
`includenon_blockingv
module compareTop
wire [30] b1c1b2c2
reg [30] a
reg clk
initial
begin
clk0
forever #50 clk~clk
end
initial
begin
a4'h3
display(____________)
# 100 a4'h7
display(____________)
# 100 a4'hf
display(____________)
# 100 a4'ha
display(____________)
# 100 a4'h2
display(____________)
# 100 display(____________)
stop
End
non_blocking non_blocking(clkab2c2)
blocking blocking(clkab1c1)
endmodule
五 综合仿真
六 思考题
1解释说明测试模块中forever语句语句否够执行?什?
forever循环语句常产生周期性波形作仿真测试信号always处独立写程序中必须写initial块中
2blocking模块中两种方法仿真综合结果会什样变化?作出仿真波形分析综合结果
a)
always@(posedge clk)
begin
cb
ba
end
实现面非阻塞赋值相赋值结果
b)
always@(posedge clk)ba
always@(posedge clk)cb
出现竞争现象
实验五 always块实现较复杂组合逻辑电路
实验目
1掌握always实现较组合逻辑电路方法
2进步解assignalways两种组合电路实现方法区注意点
3学测试模块中机数产生应
4学综合层次仿真较结果
二 实验容
1运always语句块设计8位数选择器求:路输入数输出数均4位2进制数选择开关(少3位)输入数发生变化时输出数相应变化
2写出测试模块模块功进行测试
3模块进行RTL级仿真综合门级仿真布局布线仿真
三 实验步骤
1仔细阅读课建立工程文件编写模块源码测试模块求测试模块源文件进行较全面测试
2编译源码测试模块测试模块源文件进行测试综合仿真
3观察综合生成两电路结构图观察仿真波形图分析assignalways两种组合电路实现方法区注意点
4综合时采FPGA器件Altera公司Cyclone II系列Stratix III系列观察综合结果什
四 实验代码
1模块代码:
`define plus 3'd0
`define minus 3'd1
`define band 3'd2
`define bor 3'd3
`define unegate 3'd4
通指令判断输入数执行相应操作包括加减求反
指令作数指令身发生变化结果作出时反应
module alu(outopcodeab)
output[70] out
reg[70] out
input[20] opcode
input[70] ab 操作数
always@(opcode or a or b) 电敏感always块
begin
case(opcode)
`plus out a+b 加操作
`minus out ab 减操作
`band out a&b 求
`bor out a|b 求
`unegate out~a 求 反
default out8'hx 未收指令时输出意态
endcase
end
endmodule
2测试代码:
`timescale 1ns1ns
`include aluv
module alutest
wire[70] out
reg[70] ab
reg[20] opcode
parameter times5
initial
begin
a{random}256 Give a radom number blongs to [0255]
b{random}256 Give a radom number blongs to [0255]
opcode3'h0
repeat(times)
begin
#100 a{random}256 Give a radom number
b{random}256 Give a radom number
opcodeopcode+1
end
#100 stop
end
alu alu1(outopcodeab)
endmodule
五 综合仿真
六 思考题
1分析assign语句always语句进行组合逻辑设计时什异点?
verilog语言中赋值语句两种种持续赋值语句(assign语句)种程赋值语句(always语句)
持续赋值语句(assign语句)wire型变量赋值wire值存住需直值需持续赋值
程赋值语句(always语句)reg 型变量赋值always语句执行需满足触发条件always程块里面容时刻执行需赋值象定义成寄存器类型便值保持住程赋值分阻塞赋值非阻塞赋值<两种
2always块设计八功算术运算单元输入信号ab均4位功选择select3位输出信号out(5位)算术运算单元执行操作select信号关具体关系表列(忽略输出结果中溢溢位):
Select信号
函数输出
3’b000
a
3’b001
a+b
3’b010
ab
3’b011
ab
3’b100
ab(余数)
3’b101
a<<1
3’b110
a>>1
3’b111
(a>b)(副值较)
模块代码:
`define original 3'd0
`define plus 3'd1
`define minus 3'd2
`define division 3'd3
`define remainder 3'd4
`define leftmov 3'd5
`define rightmov 3'd6
`define compare 3'd7
module mathunit(outselectab)
output [40]out
reg [40] out
input [20] select
input [30] ab
always@(select or a or b)
begin
case(select)
` original out a
`plus out a+b
`minus out ab
`division out ab
`remainder out ab
`leftmov out a<<1
`rightmov out a>>1
`compare out a>bab
default out 4’bx
endcase
end
endmodule
实验六 Verilog中函数
实验目
1解函数定义模块设计中
2解函数综合性问题
3解许综合器综合复杂算术运算
二 实验容
1次实验Verilog HDL语言函数调简单示范
2实验采步时钟触发运算执行clk时钟周期会执行次运算
3测试模块中通调系统务display时钟降显示计算结果
三 实验步骤
1建立工程文件
2参资料编写源文件tryfunctv测试模块tryfuctTopv
3测试模块tryfuctTop中调系统务display时钟降显示计算结果系统务display示例:
@(negedge clk)
display( time nd resultd n result )
调函数仿真tryfuctTop模块波形
四 实验代码
1模块代码:
module tryfunct(clkresultreset)
output[310] result
input resetclk
reg[310] result
always @(posedge clk) clk触发步运算
begin
if(reset) reset低时复位
result<0
else
begin
result < factorial(3)
end
end
function [310] factorial 函数定义
input [30] operand
reg [30] index
begin
factorial operand 1 0
for(index 2 index < operand index index + 1)
factorial index * factorial
end
endfunction
endmodule
2测试代码:
`include tryfunctv
`timescale 1ns100ps
`define clk_cycle 50
module tryfuctTop
reg[30] ni
reg resetclk
wire[310]result
initial
begin
clk0
n0
reset1
# 100 reset0
# 100 reset1
for(i0i<15ii+1)
begin
#200 ni
end
#100 stop
end
always #`clk_cycle clk~clk
tryfunct m(clk(clk)n(n)result(result)reset(reset))
endmodule
五 综合仿真
六 思考题
1设计带控制端逻辑运算电路分完成整数方立方数5阶运算求综合编写测试模块出种层次仿真波形较
模块代码:
module myfunction(clknresultresetsl)
output[60] result
input[20] n
input resetclk
input [10] sl
reg[60] resultdefine input and output
always @(posedge clk)
begin
if(reset)
result<0
else
begin
case(sl)
2'd0 result
end
end
function[60] square
input [20] operand
begin
squareoperand*operand
end
endfunction
function[60] cubic
input [20] operand
begin
cubicoperand*operand*operand
end
endfunction
function[60] factorial
input [20] operand
reg [20] index
begin
factorial 1
for(index 2 index < operand index index + 1)
factorial index * factorial
end
endfunction
endmodule
测试代码:
`include myfunctionv
`timescale 1ns100ps
`define clk_cycle 50
module testmyfunc
reg[20] n
reg resetclk
reg[10] sl
wire[60] result
parameter times20
initial
begin
n0
reset1
clk0
sl0
#100 reset0
#100 reset1
repeat(times)
begin
#50 sl{random}3
#50 n{random}6
end
#1000 stop
end
always #`clk_cycle clk~clk
myfunction myfunct(clk(clk)n(n)result(result)reset(reset)sl(sl))
endmodule
实验七 Verilog HDL中务(task)
实验目
1掌握务Verilog模块设计中应
2学会电敏感列表always中拼接操作务阻塞赋值等语句生成复杂组合逻辑高级方法
二 实验容
利电敏感always模块较两变量排序务设计出4(4位)行输入数高速排序组合逻辑
三 实验步骤
1建立工程文件编写模块源码测试模块求测试模块源文件进行较全面测试
2编译源码测试模块测试模块源文件进行测试综合仿真
3观察务仿真波形分析task带处
4综合时采FPGA器件Altera公司Cyclone II系列Stratix III系列观察综合结果什
四 实验代码
1模块代码:
module sort4(rarbrcrdabcd)
output[30] rarbrcrd
input[30] abcd
reg[30] rarbrcrd
reg[30] vavbvcvd
always @ (a or b or c or d)
begin
{vavbvcvd}{abcd}
sort2(vavc) va vc
sort2(vbvd) vb vd
sort2(vavb) va vb
sort2(vcvd) vc vd
sort2(vbvc) vb vc
{rarbrcrd}{vavbvcvd}
end
task sort2
inout[30] xy
reg[30] tmp
if(x>y)
begin
tmpx
xy
ytmp
end
endtask
endmodule
2测试代码:
`timescale 1ns100ps
`include sort4v
module task_Top
reg[30] abcd
wire[30] rarbrcrd
initial
begin
a0b0c0d0
repeat(5)
begin
#100 a {random}15
b {random}15
c {random}15
d {random}15
end
#100 stop
end
sort4 sort4 (a(a)b(b)c(c)d(d)ra(ra)rb(rb)rc(rc)rd(rd))
endmodule
五 综合仿真
六 思考题
两种方法设计功相模块该模块够完成四8位二进制输入数泡排序求:
a) 第种方法模仿面例子纯组合逻辑实现
b) 第二种假设8位数时钟节拍串行输入求时钟触发务执行法时钟周期完成次数交换操作
c) 较两种方法运行速度消耗资源
方法:
模块代码:
module bub(aibicidiaobocodo)
input[70] aibicidi
output[70] aobocodo
reg[70] aobocodo
reg[70] arbrcrdr
reg[30] n
parameter so4
always @(ai or bi or ci or di)
begin
{arbrcrdr}{aibicidi}
for(nson>1nn1)
bb(arbrcrdrn)
{aobocodo}{arbrcrdr}
end
task bb
inout[70] x1x2x3x4
input[30] n
reg[70] temp
reg[30] s
if(n>0)
for(s1s
case(s)
1sort2(x1x2)
2sort2(x2x3)
3sort2(x3x4)
endcase
end
endtask
task sort2
inout[70] xy
reg[70] temp
if(x>y)
begin
tempx
xy
ytemp
end
endtask
endmodule
测试代码:
`timescale 1ns100ps
module buubTEST
reg[70] aibicidi
wire[70] aobocodo
initial
begin
ai0bi0ci0di0
repeat(4)
begin
#100 ai{random}256
bi{random}256
ci{random}256
di{random}256
end
#100 stop
end
bub m0(aibicidiaobocodo)
endmodule
方法二(时序逻辑):
模块代码:
module bub_1(inclkarbrcrdraobocodo)
input[70] in
imput clk
output[70] arbrcrdr
reg[70] aobocodo
reg[70] arbrcrdr
reg[30] nsq
parameter so4
initial
begin
n0s0q0
end
always @(posedge clk)
begin
if(n
nn+1
ar
dr
if(nso+1)
begin
n
end
if(s>1)
begin
{aobocodo}<{arbrcrdr}
if(q
case(q)
1sort2(arbr)
2sort2(brcr)
3sort2(crdr)
endcase
q
end
else
begin
sq<1
end
end
end endalways
task sort2
inout[70] xy
reg[70] temp
if(x>y)
begin
tempx
xy
ytemp
end
endtask
endmodule
测试代码:
`timescale 1ns100ps
module bubTEST_1
reg[70] in
reg clk
wire[70] aobocodoarbrcrdr
initial
begin
clk0
in0
begin
repeat(4)
#100 in{random}256
end
#100 stop
end
always #50 clk~clk
bub_1 m0(inclkarbrcrdraobocodo)
endmodule
实验八 利限状态机进行时序逻辑设计
实验目
1掌握利限状态机实现般时序逻辑分析方法
2掌握Verilog编写综合限状态机标准模板
3掌握Verilog编写状态机模块测试文件般方法
二 实验容
1阅读书例子熟悉状态机设计流程设计思路
2设计串行数检测器求:连续441时输出1输入情况0
3建立工程编写源代码测试模块
4布局布线级仿真
三 实验步骤
1建立工程编写模块源码
2编写测试模块思考模块实现逐位左移循环进入状态机测试
3布局布线仿真结合出状态转化图理解状态机工作原理
4记录数完成实验报告
四 实验代码
1模块代码:
module seqdet(xzclkrststate)
input xclkrst
output z
output[20] state
reg[20] state
wire z
parameter IDLE'd0 A'd1 B'd2C'd3 D'd4E'd5 F'd6G'd7
assign z ( stateE && x0 ) 1 0
always @(posedge clk)
if(rst)
state < IDLE
else
casex(state)
IDLE if(x1)
state < A
A if(x0)
state < B
B if(x0)
state < C
else
state < F
C if(x1)
state < D
else
state < G
D if(x0)
state < E
else
state < A
E if(x0)
state < C
else
state < A
F if(x1)
state < A
else
state < B
G if(x1)
state < F
defaultstateIDLE
endcase
endmodule
2测试代码:
`timescale 1ns1ns
`include seqdetv
module seqdet_Top
reg clkrst
reg[230] data
wire[20] state
wire zx
assign xdata[23]
always #10 clk ~clk
always @(posedge clk)
data{data[220]data[23]}
initial
begin
clk0
rst1
#2 rst0
#30 rst1
data 'b1100_1001_0000_1001_0100
#500 stop
end
seqdet m(xzclkrststate)
endmodule
五 综合仿真
六 思考题
1什源文件中状态转化非阻塞赋值语句?果换成阻塞赋值语句?什?
时序块 RTL 代码中非阻塞赋值
非阻塞赋值块结束完成赋值操作赋值方式避免仿真出现险竞争现象
组合 RTL 代码中阻塞赋值
阻塞方式变量进行赋值时变量值赋值语句执行完立改变
非阻塞赋值方式进行赋值时赋值语句步执行通常时钟时变量进行赋值时钟进行采样
实验九 利状态机实现较复杂接口设计
实验目
1学运状态机控制逻辑开关设计出较复杂接口逻辑
2复杂设计中务(task)结构提高程序读性
3加深综合风格模块认识
二 实验容
利状态机实现较复杂接口设计
三 实验步骤
1建立工程编写模块源码
2编写测试模块思考状态机实现复杂接口设计
3布局布线仿真
4记录数完成实验报告
四 实验代码
1模块代码:
module writing(resetclkaddressdatasdaack)
input reset clk
input[70] data address
inout sda sdaack
output ack
reg link_write link_write
reg[30] state
reg[40] sh8out_state
reg[70] sh8out_buf
reg finish_F
reg ack
parameter idle0addr_write1data_write2stop_ack3
parameter bit01bit12bit23bit34bit45bit56bit67bit78
assign sdalink_write sh8out_buf[7] 1'bz
always @(posedge clk)
begin
if(reset)
begin
link_write <0
statefinish_F <0
sh8out_stateack <0
sh8out_buf <0
end
else
case(state)
idle
begin
link_write <0
finish_F <0
sh8out_stateack <0
sh8out_buf stateend
addr_write
begin
if(finish_F0)
begin
shift8_out
end
else
begin
sh8out_state < idle
sh8out_buf < data
statefinish_F<0
end
end
data_write
begin
if(finish_F0)
shift8_out
else
begin
link_write<0
state< stop_ack
finish_F<0
ack<1
end
end
stop_ack
begin
ack<0
stateend
endcase
end
task shift8_out
begin
case(sh8out_state)
idle
begin
link_write<1
sh8out_stateend
bit7
begin
link_write<1
sh8out_statesh8out_buf end
bit6
begin
sh8out_statesh8out_buf end
bit5
begin
sh8out_statesh8out_buf end
bit4
begin
sh8out_statesh8out_buf end
bit3
begin
sh8out_statesh8out_buf end
bit2
begin
sh8out_statesh8out_buf end
bit1
begin
sh8out_statesh8out_buf end
bit0
begin
link_write<0
finish_F<1
end
endcase
end
endtask
endmodule
2测试代码:
`timescale 1ns100ps
`define clk_cycle 50
module writingTop
reg resetclk
reg[70]dataaddress
wire acksda
always #`clk_cycle clk ~clk
initial
begin
clk0
reset1
data0
address0
#(2*`clk_cycle) reset0
#(2*`clk_cycle) reset1
#(100*`clk_cycle) stop
end
always@(posedge ack)
begin
datadata+1
addressaddress+1
end
writing writing(reset(reset)clk(clk)data(data)address(address)ack(ack)sda(sda))
endmodule
五 思考题
1彻底搞清楚例参考第二部分第16章实际例子独立编写实现EEPROM全部读写功行转换IIC串行总线读写信号模块编写完整符合工程求测试模块进行种层次仿真观察波形
`timescale 1ns1ns
module EEPROM_WR(SDASCLACKRESETCLKWRRDADDRDATA)
output SCL 串行时钟线
output ACK 读写周期应答信号
input RESET 复位信号
input CLK 时钟信号输入
input WRRD 读写信号
input[100] ADDR 址线
inout SDA 串行数线
inout[70] DATA 行数线
reg ACK
reg SCL
reg WFRF 读写操作标志
reg FF 标志寄存器
reg [10] head_buf 启动信号寄存器
reg[10] stop_buf 停止信号寄存器
reg [70] sh8out_buf EEPROM写寄存器
reg [80] sh8out_state EEPROM 写状态寄存器
reg [90] sh8in_state EEPROM 读状态寄存器
reg [20] head_state 启动状态寄存器
reg [20] stop_state 停止状态寄存器
reg [100] main_state 状态寄存器
reg [70] data_from_rm EEPROM读寄存器
reg link_sda SDA 数输入EEPROM开关
reg link_read EEPROM读操作开关
reg link_head 启动信号开关
reg link_write EEPROM写操作开关
reg link_stop 停止信号开关
wire sda1sda2sda3sda4
串行数开关控制次序输出输入
assign sda1 (link_head) head_buf[1] 1'b0
assign sda2 (link_write) sh8out_buf[7] 1'b0
assign sda3 (link_stop) stop_buf[1] 1'b0
assign sda4 (sda1 | sda2 | sda3)
assign SDA (link_sda) sda4 1'bz
assign DATA (link_read) data_from_rm 8'hzz
状态机状态定义
parameter
Idle 11'b00000000001
Ready 11'b00000000010
Write_start 11'b00000000100
Ctrl_write 11'b00000001000
Addr_write 11'b00000010000
Data_write 11'b00000100000
Read_start 11'b00001000000
Ctrl_read 11'b00010000000
Data_read 11'b00100000000
Stop 11'b01000000000
Ackn 11'b10000000000
行数串行输出状态
sh8out_bit7 9'b000000001
sh8out_bit6 9'b000000010
sh8out_bit5 9'b000000100
sh8out_bit4 9'b000001000
sh8out_bit3 9'b000010000
sh8out_bit2 9'b000100000
sh8out_bit1 9'b001000000
sh8out_bit0 9'b010000000
sh8out_end 9'b100000000
串行数行输出状态
Parameter
sh8in_begin 10'b0000000001
sh8in_bit7 10'b0000000010
sh8in_bit6 10'b0000000100
sh8in_bit5 10'b0000001000
sh8in_bit4 10'b0000010000
sh8in_bit3 10'b0000100000
sh8in_bit2 10'b0001000000
sh8in_bit1 10'b0010000000
sh8in_bit0 10'b0100000000
sh8in_end 10'b1000000000
启动状态
head_begin 3'b001
head_bit 3'b010
head_end 3'b100
停止状态
stop_begin 3'b001
stop_bit 3'b010
stop_end 3'b100
parameter YES 1
NO 0
产生串行时钟scl输入时钟二分频
always @(negedge CLK)
if(RESET)
SCL < 0
else
SCL < ~SCL
状态机程序
always @ (posedge CLK)
if(RESET)
begin
link_read < NO
link_write < NO
link_head < NO
link_stop < NO
link_sda < NO
ACK < 0
RF < 0
WF < 0
FF < 0
main_state < Idle
end
else
begin
casex(main_state)
Idle
begin
link_read < NO
link_write < NO
link_head < NO
link_stop < NO
link_sda < NO
if(WR)
begin
WF < 1
main_state < Ready
end
else if(RD)
begin
RF < 1
main_state < Ready
end
else
begin
WF < 0
RF < 0
main_state < Idle
end
end
Ready
begin
link_read < NO
link_write < NO
link_stop < NO
link_head < YES
link_sda < YES
head_buf[10] < 2'b10
stop_buf[10] < 2'b01
head_state < head_begin
FF < 0
ACK < 0
main_state < Write_start
end
Write_start
if(FF 0)
shift_head
else
begin
sh8out_buf[70] < {1'b11'b01'b11'b0ADDR[108]1'b0}
link_head < NO
link_write < YES
FF < 0
sh8out_state < sh8out_bit6
main_state < Ctrl_write
end
Ctrl_write
if(FF 0)
shift8_out
else
begin
sh8out_state < sh8out_bit7
sh8out_buf[70] < ADDR[70]
FF < 0
main_state < Addr_write
end
Addr_write
if(FF 0)
shift8_out
else
begin
FF < 0
if(WF)
begin
sh8out_state < sh8out_bit7
sh8out_buf[70] < DATA
main_state < Data_write
end
if(RF)
begin
head_buf < 2'b10
head_state < head_begin
main_state < Read_start
end
end
Data_write
if(FF 0)
shift8_out
else
begin
stop_state < stop_begin
main_state < Stop
link_write < NO
FF < 0
end
Read_start
if(FF 0)
shift_head
else
begin
sh8out_buf< {1'b11'b01'b11'b0ADDR[108]1'b1}
link_head < NO
link_sda < YES
link_write < YES
FF < 0
sh8out_state < sh8out_bit6
main_state < Ctrl_read
end
Ctrl_read
if(FF 0)
shift8_out
else
begin
link_sda < NO
link_write < NO
FF < 0
sh8in_state < sh8in_begin
main_state < Data_read
end
Data_read
if(FF 0)
shift8in
else
begin
link_stop < YES
link_sda < YES
stop_state < stop_bit
FF < 0
main_state < Stop
end
Stop
if(FF 0)
shift_stop
else
begin
ACK < 1
FF < 0
main_state < Ackn
end
Ackn
begin
ACK < 0
WF < 0
RF < 0
main_state < Idle
end
default main_state < Idle
endcase
end
endmodule
实验十 利SRAM设计FIFO
实验目
1学掌握存取队列理状态机设计基方法
2解掌握存储器构成FIFO接口设计基技术
3工程概念编写完整测试模块达完整测试覆盖
二 实验容
利SRAM模型设计SRAM读写控制逻辑SRAM行户表现FIFO(先进先出存储器)
三 实验步骤
四 实验代码
`define FIFO_SIZE 8
`include sramv 仿真工具需加句 sramv模块编译
`timescale 1ns1ns
module t
reg [70] in_data FIFO数总线
reg fifordfifowr FIFO控制信号
wire[70] out_data
wire nfull nempty FIFO状态信号
reg clkrst
wire[70] sram_data SRAM数总线
wire[100] address SRAM址总线
wire rdwr SRAM读写控制信号
reg [70] data_buf[`FIFO_SIZE0] 数缓存结果检查
integer index 读写data_buf指针
系统时钟
initial clk0
always #25 clk~clk
测试激励序列
initial
begin
fiford1
fifowr1
rst1
#40 rst0
#42 rst1
if (nempty) display(timeError FIFO be empty nempty should be low\n)
连续写FIFO
index 0
repeat(`FIFO_SIZE)
begin
data_buf[index]random
write_fifo(data_buf[index])
index index + 1
end
if (nfull)
display(timeError FIFO full nfull should be low\n)
repeat(2) write_fifo(random)
#200
连续读FIFO
index0
read_fifo_compare(data_buf[index])
if (~nfull)
display(timeError FIFO not full nfull should be high\n)
repeat(`FIFO_SIZE1)
begin
index index + 1
read_fifo_compare(data_buf[index])
end
if (nempty)
display(timeError FIFO be empty nempty should be low\n)
repeat(2) read_fifo_compare(8'bx)
reset_fifo
写读FIFO
repeat(`FIFO_SIZE*2)
begin
data_buf[0] random
write_fifo(data_buf[0])
read_fifo_compare(data_buf[0])
end
异常操作
reset_fifo
read_fifo_compare(8'bx)
write_fifo(data_buf[0])
read_fifo_compare(data_buf[0])
stop
end
fifo_interface fifo_mk (in_data(in_data)
out_data(out_data)
fiford(fiford)
fifowr(fifowr)
nfull(nfull)
nempty(nempty)
address(address)
sram_data(sram_data)
rd (rd)wr(wr)
clk(clk)rst(rst) )
sram m1 ( Address (address)
Data (sram_data)
SRG (rd) SRAM读
SRE (1'b0) SRAM片选低效
SRW (wr) ) SRAM写
task write_fifo
input [70] data
begin
in_datadata
#50 fifowr0 SRAM中写数
#200 fifowr1
#50
end
endtask
task read_fifo_compare
input [70] data
begin
#50 fiford0 SRAM中读数
#200 fiford1
if (out_data data)
display(timeError Data retrieved (h) not match the one stored (h) \n
out_data data)
#50
end
endtask
task reset_fifo
begin
#40 rst0
#40 rst1
end
endtask
endmodule
余代码参见实验指导
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档