《SOC
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
方法与实现》实验报告(可编辑)
《SOC 设计方法与实现》实验报告
《SOC 设计方法与实现》实验报告
马 亮201111857
刘家明201111856
1 实验时间:2011年11月19日―2011年12月15日
2 实验目的
完成一个数字系统的Verilog HDL描述和利用EDA工具的Verilog HDL仿真综合环境对这一描述进行仿真并综合,完整地从事一个数字VLSI系统的设计过程,理解和掌握现代集成电路的设计流程、硬件描述语言综合理论等高层次设计方法以及它和物理实现之间的关系,巩固在理论课阶段学习的相关知识 。
3 实验平台
代码输入工具: QuartusII
功能仿真: ModelSim SE 6.2b
综合工具:DC,Synplify Pro 8.6.2
4 实验内容
设计一个数字信号处理器系统,其功能为:在8位微控制器 Intel8051的控制下对输入信号进行数字滤波处理并根据输入数据的大小产生一组控制液晶板的显示。系统框图如下:
Intel8051 是微处理器; TH99CHLS 是要实现的系统。Display
是一个液晶显示板。它包括三个显示区:一个时间显示区,一个数字显示区和一个由16个小方块组成的信号幅度显示区。显示面板为共阴极驱动,接高电平时对应的面板显示,接低时面板消失。其结构见下图所示。
5:系统简介和对应的模块划分
5.1:系统的整体工作过程:
1 在外部信号PEbar的控制下,芯片从端口in读入一个八位数据。
2 在 1 中输入的数据与微处理器给出的另一个八位数据进行按位“与”操作。
3 在 2 中处理过的数据经数字滤波后从端口out输出。
4 TH99CHLS 内部产生一组时间信号,包括时和分,其
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
为: hh:mm 。这组时间信号的初值由微处理器给出,微处理器可以随时对时间信号进行修改。
5 送往液晶显示板的信号有三组:
a. 4 中产生的时间信号,经七段译码后从端口hour和minute送出;
b. 3 中经数字滤波的信号,在转换成十进制并做七段译码后,百位经端口d00,十位经端口d10,个位经端口d01送出;
c. 3 中经数字滤波的信号,在经过压缩后通过端口ap送出。
5.2: 数字滤波器
数字滤波器的转移
函
关于工期滞后的函关于工程严重滞后的函关于工程进度滞后的回复函关于征求同志党风廉政意见的函关于征求廉洁自律情况的复函
数为:
滤波器的系数B0,B1,...,B6均由微处理器给出。微处理器可以根据需要修改这些系数。
5.2:系统模块说明和代码说明:
根据功能
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
,将整个系统分为8个模块。各个模块对应的源文件和功能描述如下表所示。
模块名称 对应源文件 功能说明 decoder decoder.v
将四位二进制译码为LED显示。输入4bit,输出为7bit直接驱动显示装置,为组合逻辑。 H2D H2D.v 进行16进制到十进制的转换。输入为8bit无符号数,输出为百,十,个位数字 其中每个数字4bit位宽 ,同样为组合逻辑 decoder_4X16
decoder_4X16 4-16译码器,主要是将经过y sqrt x 压缩后的数据送至显示设备。输入4bit,输出16bit,组合逻辑。
sqrt_lut sqrt_lut.v 主要实现y sqrt x 的运算。主要是通过比较和查找表方式实现。输入8bit,输出4bit。时序逻辑,一个时钟周期。 mul8b_shiftadd_fsm mul8b_shiftadd_fsm.v 乘法器设计。通过移位加的方式实现。内部通过状态机实现。完成一次乘法需要8个时钟周期 timer_clk timer_clk.v 时间时钟模块,主要是根据系统时钟计算秒。通过计数器级联的方式实现。
filter filter.v 这是整个系统比较核心的部分。主要实现滤波器的设计和与微处理器的接口时序设计。接口需要三态控制,并且要注意读写信号的控制,滤波器采用并行设计,用面积换取速度。
TH99CHLS TH99CHLS.v 顶层元件例化。主要是将上述各个模块进
行组合。 整个功能框图如下:
6:代码功能测试
下面是测试用的模块介绍,模拟TH99CHLS外围的
单
名单名单延期单出门单老板名单
片机、控制信号和数据输入等:
模块名称 对应的源文件 功能说明 osc_rst
osc_rst.v 产生时钟频率和复位信号 fir_tb fir_tb.v
滤波器数据的输入 wr_rd wr_rd.v 单片机WR,RD信号的模拟 mcu mcu.v 主要是模拟单片机对TH99CHLS芯片的控制,包括寄存器的读入与读出等一系列操作 top_test top_test.v 顶层测试文件,主要是进行元件例化
ModelSimSE功能仿真结果波形图如下:
第一张图为前0-7us,第二张图为7us-15us.详细图形见source中的1.bmp和2.bmp.也可以查看其下的vsim.wlf 需要安装modelsim 。
此图为对TH99CHLS芯片内部b0-b6 滤波器系数 寄存器的操作和对mini,hour寄存器初始化的操作仿真结果。
7:综合结果及分析
Synplify综合结果如下:
DC综合结果如下:
8:所占用的资源和数据通道分析
该系统所占用的资源如下:
在滤波器设计中,并没有采用乘法器的复用,而是采用了多个
乘法器的复制,牺牲面积来换取速读的提高。综合后的频率能够达到
50MHz。滤波器的数据通道如下:(用多个乘法器)
9:Verilog HDL代码
///////////////////////////////////////////////////////
////////////////////////////
`timescale 1ns/10ps
module top_test ;
wire clk,rst_n;
wire [7:0] abus;
wire ale,rbar_n,wbar_n,cs_n;
wire pebar_n;
wire [7:0] fir_in;
wire [7:0] dbus_xio;
wire [13:0] hour,mini;
wire [20:0] fir_out;
wire [15:0] fir_out_sqrt;
wire send_data_en;
fir_tb Ufir_tb send_data_en,pebar_n,fir_in ;
osc_rst Uost_rst clk,rst_n ;
TH99CHLS UTH99
dbus_xio,
abus,
rbar_n,
wbar_n,
ale,
pebar_n,
fir_in,
cs_n,
rst_n,
clk,
//output ports
fir_out,
fir_out_sqrt,
hour,
mini
;
mcu Umcu
.dbus_xio dbus_xio ,
.abus abus ,
.rbar_n rbar_n ,
.wbar_n wbar_n ,
.ale ale ,
.cs_n cs_n ,
.send_data_en send_data_en
;
endmodule
///////////////////////////////////////////////////////
///////////
module decoder
//input
hex,
//output
led
;
input [3:0] hex;
output reg [6:0] led;
always @ hex begin
case hex
4'b0000:led 7'b011_1111; //0
4'b0001:led 7'b001_1000; //1
4'b0010:led 7'b111_0110; //2
4'b0011:led 7'b111_1100; //3
4'b0100:led 7'b101_1001; //4
4'b0101:led 7'b110_1101; //5
4'b0110:led 7'b110_1111; //6
4'b0111:led 7'b011_1000; //7
4'b1000:led 7'b111_1111; //8
4'b1001:led 7'b111_1101; //9
default :led 7'b000_0000; //null
endcase
end
endmodule
///////////////////////////////////////////////////////
/////////////
module TH99CHLS
//input
dbus_xio,
abus,
rbar_n,
wbar_n,
ale,
pebar_n,
fir_in,
cs_n,
rst_n,
clk,
//output ports
fir_out,
fir_out_sqrt,
hour,
mini
;
input clk,rst_n;
input [7:0] abus;
input ale,rbar_n,wbar_n,cs_n;
input pebar_n;
input [7:0] fir_in;
inout [7:0] dbus_xio;
output [13:0] hour,mini;
output [20:0] fir_out;
output [15:0] fir_out_sqrt;
wire [15:0] fir_out_Hex;
wire [7:0] hour_Hex,mini_Hex;
wire [3:0] fir_sqt_Hex;
wire [3:0] hud_Hex,ten_Hex,num_Hex;
filter Ufilter .dbus_xio dbus_xio ,.abus abus ,.rbar_n
rbar_n ,
.wbar_n wbar_n ,.ale ale ,.pebar_n
pebar_n ,
.fir_in fir_in ,.cs_n cs_n ,.rst_n
rst_n ,.clk clk ,
.fir_out fir_out_Hex ,.hour
hour_Hex ,.mini mini_Hex ;
sqrt_lut Usqt .result fir_sqt_Hex ,.in
fir_out_Hex[7:0] ,.clk clk ,.rst_n rst_n ;
decoder_4X16 Ude4X16 .out fir_out_sqrt ,.in fir_sqt_Hex ;
H2D UH2d1 .hex fir_out_Hex[7:0] ,
.hud hud_Hex ,.ten ten_Hex ,.num num_Hex ;
decoder Udecoder1 .hex hud_Hex ,.led fir_out[20:14] ;
decoder Udecoder2 .hex ten_Hex ,.led fir_out[13:7] ;
decoder Udecoder3 .hex num_Hex ,.led fir_out[6:0] ;
decoder Udecoder4 .hex hour_Hex[7:4] ,.led hour[13:7] ;
decoder Udecoder5 .hex hour_Hex[3:0] ,.led hour[6:0] ;
decoder Udecoder6 .hex mini_Hex[7:4] ,.led mini[13:7] ;
decoder Udecoder7 .hex mini_Hex[3:0] ,.led mini[6:0] ;
endmodule
///////////////////////////////////////////////////////
///////////////
`timescale 1ns/10ps
module wr_rd
dbus_xio,
abus,
rbar_n,
wbar_n,
ale ;
parameter MCU_CLK 40;//25MHz
parameter LL_DELAY 15;
output reg [7:0] abus;
output reg ale,rbar_n,wbar_n;
inout [7:0] dbus_xio;
reg ctrl;
reg [7:0] abus_low;
assign dbus_xio ctrl?abus_low:8'hzz; //if ctrl 1
output then hiz
integer i;
initial begin
rbar_n 1'b1;
wbar_n 1'b1;
end
task write_register;
input [7:0] write_addr;
input [7:0] write_data;
//write movx
begin
ale 1'b0;//config b0
#MCU_CLK;
ale 1'b1;
ctrl 1'b1;
#LL_DELAY;
abus_low write_addr;
abus 8'h0;
#LL_DELAY;
ale 0;
ctrl 1'b0; //float
#MCU_CLK;
#MCU_CLK;
ctrl 1'b1;
abus_low write_data;
#1;
wbar_n 1'b0;
for i 0;i 8;i i+1
#MCU_CLK;
wbar_n 1'b1;
end
endtask
//end movx
task read_register;
input [7:0] read_addr;
output [7:0] read_data;
//read movx
begin
ale 1'b0;//config b0
#MCU_CLK;
ale 1'b1;
ctrl 1'b1;
#LL_DELAY;
abus_low read_addr;
abus 8'h0;
#LL_DELAY;
ale 0;
ctrl 1'b0; //float
#MCU_CLK;
#MCU_CLK;
ctrl 1'b0;
rbar_n 1'b0;
#MCU_CLK;
read_data dbus_xio;
for i 0;i 7;i i+1
#MCU_CLK;
rbar_n 1'b1;
end
endtask
endmodule
///////////////////////////////////////////////////////
//////////////
module decoder_4X16
// output
out, //16 bit width high voltag
effect
//input
in //four bit width
;
input [3:0] in;
output [15:0] out;
assign out[15] in[3] & in[2] & in[1] & in[0];
//1111 15
assign out[14] in[3] & in[2] & in[1] & ~in[0] ; //1110 14
assign out[13] in[3] & in[2] & ~in[1] & in[0]; //1101 13
assign out[12] in[3] & in[2] & ~in[1] & ~in[0] ; //1100 12
assign out[11] in[3] & ~in[2] & in[1] & in[0]; //1011 11
assign out[10] in[3] & ~in[2] & in[1] & ~in[0] ; //1010 10
assign out[9] in[3] & ~in[2] & ~in[1] & in[0]; //1001 9
assign out[8] in[3] & ~in[2] & ~in[1] & ~in[0] ; //1000 8
assign out[7] ~in[3] & in[2] & in[1] & in[0]; //0111 7
assign out[6] ~in[3] & in[2] & in[1] & ~in[0] ; //0110 6
assign out[5] ~in[3] & in[2] & ~in[1] & in[0]; //0101 5
assign out[4] ~in[3] & in[2] & ~in[1] & ~in[0] ;
//0100 4
assign out[3] ~in[3] & ~in[2] & in[1] & in[0]; //0011 3
assign out[2] ~in[3] & ~in[2] & in[1] & in[0]; //0010 2
assign out[1] ~in[3] & ~in[2] & ~in[1] & in[0]; //0001 1
assign out[0] ~in[3] & ~in[2] & ~in[1] & ~in[0] ; //0000 0
endmodule
////////////////////////////////////////////////////////////////////
module filter
// input ports
dbus_xio,
abus,
rbar_n,
wbar_n,
ale,
pebar_n,
fir_in,
cs_n,
rst_n,
clk,
//output ports
fir_out,
hour,
mini,
;
inout wire [7:0] dbus_xio; //data bus connect to p0
complex of data and addr
//output reg [7:0] dbus;
input [7:0] abus; //addr bus connect to p2
input rbar_n,wbar_n; //rd and wr signal connect to rd,we
of mcu
input ale,cs_n;
input pebar_n;
input [7:0] fir_in;
input clk,rst_n;
output reg [15:0] fir_out;
output [7:0] hour,mini;
/**********************/ //about config
reg [7:0] B0,B1,B2,B3,B4,B5,B6;
reg [7:0] mcu_num;
reg [7:0] abus_low;
reg [7:0] hour,mini;
reg [7:0] dbus;
reg timer_clr_n;
wire [15:0] abus_inner;
// wire [7:0] dbus_in;
/******************/ //reg about fir
reg [7:0] fir_in_reg[6:0];
wire [15:0] mul_out[6:0];
reg start;
wire [6:0] mul_out_en;
wire mul_out_en_all;
wire [7:0] fir_in_inner;
integer i;
/*****************************/
assign fir_in_inner fir_in&mcu_num;
assign abus_inner abus,abus_low ;
assign dbus_xio rbar_n?8'hzz:dbus; //
/******************************************/
/*
always @ posedge clk or rst_n begin //latch the
address like 373
if !rst_n begin
abus_low 8'b0;
end
else begin
if ale& !cs_n //cs_n 0 and ale 1 latch the
address of P0
abus_low dbus_in;
end
end*/
//latch not flip_flop
always @ ale or dbus_xio or cs_n
begin
if ale 1'b1 & !cs_n
abus_low dbus_xio;
end
/***************************************/
always @ posedge clk or negedge rst_n begin //config
the register
if !rst_n begin
B0 8'b0;B1 8'b0;B2 8'b0;
B3 8'b0;B4 8'b0;B5 8'b0;B6 8'b0;
end
else begin
if ! cs_n|wbar_n begin //cs_n 0 and wbar_n 0
write
case abus_inner[3:0]
4'b0000:B0 dbus_xio;
4'b0001:B1 dbus_xio;
4'b0010:B2 dbus_xio;
4'b0011:B3 dbus_xio;
4'b0100:B4 dbus_xio;
4'b0101:B5 dbus_xio;
4'b0110:B6 dbus_xio;
4'b0111:mcu_num dbus_xio;
// default:version dbus_xio;
endcase
end
end
end
/*******************************************/
always @ posedge clk or negedge rst_n begin //read the
register
if !rst_n begin
dbus 8'h0;
end
else if ! cs_n|rbar_n begin //cs_n 0 and wbar_n 0
write
case abus_inner[3:0]
4'b0000:dbus B0;
4'b0001:dbus B1;
4'b0010:dbus B2;
4'b0011:dbus B3;
4'b0100:dbus B4;
4'b0101:dbus B5;
4'b0110:dbus B6;
4'b0111:dbus mcu_num;
4'b1000:dbus mini;
4'b1001:dbus hour;
default:dbus 8'b0;//version
endcase
end
end
/********************************///input the num
reg pebar1;
wire in_enable;
always @ posedge clk or negedge rst_n begin
if !rst_n begin
pebar1 1'b0;
end
else begin
pebar1 pebar_n;
end
end
assign in_enable pebar1& ~pebar_n ;
always @ posedge clk or negedge rst_n begin
if !rst_n begin
for i 0;i 7;i i+1
fir_in_reg[i] 8'b0;
start 1'b0;
end
else if in_enable begin
fir_in_reg[0] fir_in_inner;
for i 0;i 6;i i+1
fir_in_reg[i+1] fir_in_reg[i];
start 1'b1;
end
else begin
start 1'b0;
end
end
/********************************/
mul8b_shiftadd_fsm U0 .mul_out mul_out[0] ,
.mul_out_en mul_out_en[0] ,
.mul_ina B0 ,
.mul_inb fir_in_reg[0] ,
.clk clk ,
.start start ,
.rst_n rst_n
;
mul8b_shiftadd_fsm U1 .mul_out mul_out[1] ,
.mul_out_en mul_out_en[1] ,
.mul_ina B1 ,
.mul_inb fir_in_reg[1] ,
.clk clk ,
.start start ,
.rst_n rst_n
;
mul8b_shiftadd_fsm U2 .mul_out mul_out[2] ,
.mul_out_en mul_out_en[2] ,
.mul_ina B2 ,
.mul_inb fir_in_reg[2] ,
.start start ,
.clk clk ,
.rst_n rst_n
;
mul8b_shiftadd_fsm U3 .mul_out mul_out[3] ,
.mul_out_en mul_out_en[3] ,
.mul_ina B3 ,
.mul_inb fir_in_reg[3] ,
.start start ,
.clk clk ,
.rst_n rst_n
;
mul8b_shiftadd_fsm U4 .mul_out mul_out[4] ,
.mul_out_en mul_out_en[4] ,
.mul_ina B4 ,
.mul_inb fir_in_reg[4] ,
.start start ,
.clk clk ,
.rst_n rst_n
;
mul8b_shiftadd_fsm U5 .mul_out mul_out[5] ,
.mul_out_en mul_out_en[5] ,
.mul_ina B5 ,
.mul_inb fir_in_reg[5] ,
.start start ,
.clk clk ,
.rst_n rst_n
;
mul8b_shiftadd_fsm U6 .mul_out mul_out[6] ,
.mul_out_en mul_out_en[6] ,
.mul_ina B6 ,
.mul_inb fir_in_reg[6] ,
.start start ,
.clk clk ,
.rst_n rst_n
;
assign mul_out_en_all &mul_out_en;
wire [15:0] add_mul12 mul_out[1]+mul_out[2];
wire [15:0] add_mul34 mul_out[3]+mul_out[4];
wire [15:0] add_mul56 mul_out[5]+mul_out[6];
wire [15:0] add_mul012 add_mul12+mul_out[0];
wire [15:0] add_mul3456 add_mul34+add_mul56;
always @ posedge clk or negedge rst_n begin
if !rst_n begin
fir_out 16'b0;
end
else if mul_out_en_all begin
fir_out add_mul012+add_mul3456;
end
end
//timer parts
wire minite;
timer_clk timer1 .clk clk ,.rst_n rst_n ,
.clr_n timer_clr_n ,.clk_minite minite ;
always @ posedge clk or negedge rst_n begin
if !rst_n
timer_clr_n 1'b0;
else if ! cs_n|wbar_n & abus_inner[3:0] 4'b1000
timer_clr_n 1'b0;
else
timer_clr_n 1;
end
always @ posedge clk or negedge rst_n begin
if !rst_n begin
hour 8'b0;
mini 8'b0;
end
else if ! cs_n|wbar_n begin //cs_n 0 and wbar_n 0
write
case abus_inner[3:0]
4'b1000:mini dbus_xio;
4'b1001:hour dbus_xio;
endcase
end
else if minite begin
if mini[3:0] 4'b1001 begin
mini[3:0] 4'b0;
if mini[7:4] 4'b0101 begin
mini[7:4] 4'b0;
if hour[7:4]! 4'b0010 begin
if hour[3:0] 4'b1001 begin
hour[3:0] 4'b0000;
hour[7:4] hour[7:4]+1'b1;
end
else hour[3:0] hour[3:0]+1'b1;
end
else begin //hour[7:4] 4'b0010
if hour[3:0] 4'b0011 begin
hour[3:0] 4'b0000;
hour[7:4] 4'b0000;
end
else hour[3:0] hour[3:0]+1'b1;
end
end
else
mini[7:4] mini[7:4]+1'b1;
end
else begin
mini[3:0] mini[3:0]+1'b1;
end
end
end
endmodule
///////////////////////////////////////////////////////
///////////////
`timescale 1ns/10ps
module fir_tb //
send_data_en,
//output
pebar_n,
fir_in,
;
input send_data_en;
output reg pebar_n;
output reg [7:0] fir_in;
reg [7:0] fir_tmp[6:0];
integer i,j;
initial begin
pebar_n 1'b1;
for i 0;i 7;i i+1
fir_tmp[i] 8'h50+i;
end
initial begin
wait send_data_en ;
for i 0;i 7;i i+1 begin
fir_in fir_tmp[i];
pebar_n 1'b0; //negedge
#22;
pebar_n 1'b1;
#300; //wait for filter end
end
end
endmodule
///////////////////////////////////////////////////////
//////////////
//16进制转化为十进制
module H2D
//input
hex,
//output
hud,
ten,
num
;
input [7:0] hex;
output reg [3:0] hud,ten,num;
wire [8:0] shex,sub100,sub200;
reg [7:0] hex_inner;
assign shex 1'b0,hex ;
assign sub100 shex-9'h64; //100
assign sub200 shex-9'hc8; //200
always @ sub100 or sub200 or hex begin
if !sub200[8] begin // 200
hud 4'b0010;
hex_inner sub200[7:0];
end
else if !sub100[8] begin // 100
hud 4'b0001;
hex_inner sub100[7:0];
end
else begin
hud 4'b0000;
hex_inner hex[7:0];
end
end
wire [7:0] hex_tn1,hex_tn2,hex_tn3,hex_tn4;
wire [7:0] hex_tn5,hex_tn6,hex_tn7,hex_tn8,hex_tn9;
wire [8:0] hex_tn;
assign hex_tn1 hex_inner-8'ha; //10
assign hex_tn2 hex_inner-8'h14;//20
assign hex_tn3 hex_inner-8'h1e;//30
assign hex_tn4 hex_inner-8'h28;//40
assign hex_tn5 hex_inner-8'h32;//50
assign hex_tn6 hex_inner-8'h3c;//60
assign hex_tn7 hex_inner-8'h46;//70
assign hex_tn8 hex_inner-8'h50;//80
assign hex_tn9 hex_inner-8'h5a;//90
assign hex_tn
hex_tn9[7],hex_tn8[7],hex_tn7[7],hex_tn6[7],
hex_tn5[7],hex_tn4[7],hex_tn3[7],hex_tn2[7],
hex_tn1[7] ;
always @ hex_tn begin
if hex_tn[0] begin
ten 4'b0000;
num hex_inner;
end
else
case 2'b10
hex_tn[8:7]: begin // 80
ten 4'b1000;
num hex_tn8[3:0];
end
hex_tn[7:6]:begin
ten 4'b0111;
num hex_tn7[3:0];
end
hex_tn[6:5]:begin
ten 4'b0110;
num hex_tn6[3:0];
end
hex_tn[5:4]:begin
ten 4'b0101;
num hex_tn5[3:0];
end
hex_tn[4:3]:begin
ten 4'b0100;
num hex_tn4[3:0];
end
hex_tn[3:2]:begin
ten 4'b0011;
num hex_tn3[3:0];
end
hex_tn[2:1]:begin
ten 4'b0010;
num hex_tn2[3:0];
end
hex_tn[1:0]:begin // 10 20
ten 4'b0001;
num hex_tn1[3:0];
end
default:begin
ten 4'b1001;
num hex_tn9[3:0];
end
endcase
end
endmodule
///////////////////////////////////////////////////////
//////////////
`timescale 1ns/100ps
module mcu
dbus_xio,
abus,
rbar_n,
wbar_n,
ale,
cs_n,
send_data_en
;
parameter MCU_CLK 40;//25MHz
parameter LL_DELAY 15;
parameter b0 8'h01;
parameter b1 8'h02;
parameter b2 8'h03;
parameter b3 8'h04;
parameter b4 8'h05;
parameter b5 8'h06;
parameter b6 8'h07;
parameter mcu_num 8'hff;
parameter mini 8'h20;
parameter hour 8'h10;
parameter b0_addr 8'h0;
parameter b1_addr 8'h1;
parameter b2_addr 8'h2;
parameter b3_addr 8'h3;
parameter b4_addr 8'h4;
parameter b5_addr 8'h5;
parameter b6_addr 8'h6;
parameter mcu_num_addr 8'h7;
parameter mini_addr 8'h8;
parameter hour_addr 8'h9;
output wire[7:0] abus;
output wire ale,rbar_n,wbar_n;
output reg cs_n;
output reg send_data_en;
inout tri [7:0] dbus_xio;
wr_rd Uwrd dbus_xio,
abus,
rbar_n,
wbar_n,
ale ;
reg [7:0] b0r,b1r,b2r,b3r,b4r,b5r,b6r;
reg [7:0] mcu_numr,minir,hourr;
integer i;
initial begin
# MCU_CLK;
# 3;
cs_n 1'b0;
send_data_en 1'b0;
Uwrd.write_register b0_addr,b0 ;
Uwrd.write_register b1_addr,b1 ;
Uwrd.write_register b2_addr,b2 ;
Uwrd.write_register b3_addr,b3 ;
Uwrd.write_register b4_addr,b4 ;
Uwrd.write_register b5_addr,b5 ;
Uwrd.write_register b6_addr,b6 ;
Uwrd.write_register mcu_num_addr,mcu_num ;
Uwrd.write_register mini_addr,mini ;
Uwrd.write_register hour_addr,hour ;
Uwrd.read_register b0_addr,b0r ;
Uwrd.read_register b1_addr,b1r ;
Uwrd.read_register b2_addr,b2r ;
Uwrd.read_register b3_addr,b3r ;
Uwrd.read_register b4_addr,b4r ;
Uwrd.read_register b5_addr,b5r ;
Uwrd.read_register b6_addr,b6r ;
Uwrd.read_register mcu_num_addr,mcu_numr ;
Uwrd.read_register mini_addr,minir ;
Uwrd.read_register hour_addr,hourr ;
if b0 b0r $display "b0 wr_rd is right,b0 %h",b0 ;
else $display "b0 wr_rd is wrong,should be %h,but now
is %h",b0,b0r ;
if b1 b1r $display "b1 wr_rd is right,b1 %h",b1 ;
else $display "b1 wr_rd is wrong,should be %h,but now
is %h",b1,b1r ;
if b2 b2r $display "b2 wr_rd is right,b2 %h",b2 ;
else $display "b2 wr_rd is wrong,should be %h,but now is %h",b2,b2r ;
if b3 b3r $display "b3 wr_rd is right,b3 %h",b3 ;
else $display "b3 wr_rd is wrong,should be %h,but now is %h",b3,b3r ;
if b4 b4r $display "b4 wr_rd is right,b4 %h",b4 ;
else $display "b4 wr_rd is wrong,should be %h,but now is %h",b4,b4r ;
if b5 b5r $display "b5 wr_rd is right,b5 %h",b5 ;
else $display "b5 wr_rd is wrong,should be %h,but now is %h",b5,b5r ;
if b6 b6r $display "b6 wr_rd is right,b6 %h",b6 ;
else $display "b6 wr_rd is wrong,should be %h,but now is %h",b6,b6r ;
if mcu_num mcu_numr $display "mcu_num wr_rd is right,mcu_num %h",mcu_num ;
else $display "mcu_num wr_rd is wrong,should be %h,but now is %h",mcu_num,mcu_numr ;
if mini minir $display "mini wr_rd is
right,mini %h",mini ;
else $display "mini wr_rd is wrong,should be %h,but now is %h",mini,minir ;
if hour hourr $display "hour wr_rd is
right,hour %h",hour ;
else $display "hour wr_rd is wrong,should be %h,but
now is %h",hour,hourr ;
cs_n 1'b1;
send_data_en 1'b1;
end
endmodule
///////////////////////////////////////////////////////
//////////////
module mul8b_shiftadd_fsm
//output ports
mul_out_en,
mul_out,
//input ports
mul_ina,
mul_inb,
start,
clk,
rst_n
;
parameter INPUT_WIDTH 8;
parameter OUTPUT_WIDTH 16;
parameter IDLE 4'b0000;
parameter STAGE_ONE 4'b0001;
parameter STAGE_TWO 4'b0010;
parameter STAGE_THREE 4'b0011;
parameter STAGE_FOUR 4'b0100;
parameter STAGE_FIVE 4'b0101;
parameter STAGE_SIX 4'b0110;
parameter STAGE_SEVEN 4'b0111;
parameter STAGE_EIGHT 4'b1000;
output reg mul_out_en;
output reg [OUTPUT_WIDTH-1:0] mul_out;
input [INPUT_WIDTH-1:0] mul_ina,mul_inb;
input clk,rst_